新手向从0剖析漏洞之SQL注入联合查询--0x0003
前言在SQL注入讲解的前期我们先使用最经典的sqli-lab靶场进行分析一、源码分析Less-1 的注入点与联合查询基础1. 页面功能与请求链路Less-1 是一个 GET 请求页面参数为id。后端接收id后直接拼接 SQL无过滤、无预处理。查询成功时回显Your Login name: ...Your Password: ...查询失败时输出mysql_error()可辅助报错注入。2. 关键源码解读核心代码要点页面只回显username和passwordid不回显。LIMIT 0,1和mysql_fetch_array都只取第一行影响联合查询的利用方式。3. SQL 模板拆解实际 SQL 结构SELECT*FROMusersWHEREid$idLIMIT0,1注入时需要闭合前面的单引号构造自己的 SQL 逻辑文章0x0002我们只了解了可以闭合后构造自己的语句这篇文章我们将展示具体操作注释掉后面的 LIMIT 0,1例如?id-1 UNION SELECT 1,2,3--拼接后SELECT*FROMusersWHEREid-1UNIONSELECT1,2,3-- LIMIT 0,14. 判断闭合方式和文章0x0002方法相同我们发现单引号改变了SQL语句的逻辑现在再补充一种复核的方法继续测试?id1--页面恢复正常说明注释符生效成功闭合。5. 联合查询为什么能打原 SQL 是SELECT查询页面有明确回显位因此可以使用UNION SELECT。联合查询条件原查询必须是SELECT且两个SELECT的列数必须相同。对应列的数据类型最好兼容。页面必须有回显位。最好让前半段查询无结果这样联合查询的结果才能优先显示。6. Less-1 联合查询完整实操流程6.1 判断列数方法一ORDER BY?id1 ORDER BY 3--正常。?id1 ORDER BY 4--ORDER BY是指按照某一列排序如果该列不存在则会报错说明列数为 3。方法二直接UNION SELECT?id1 UNION SELECT 1,2,3--如果列数不匹配会报The used SELECT statements have a different number of columns6.2 确定回显位?id-1 UNION SELECT 1,2,3--页面显示Your Login name:2 Your Password:3说明第 2、3 列是回显位。注意为什么用-1让WHERE id-1查不到数据前半段为空。这样联合查询的结果才会被mysql_fetch_array取到。如果写成?id1 UNION SELECT 1,2,3--前半段有结果页面可能只显示 id1 的用户。6.3 获取当前库、用户、版本、操作系统?id-1 UNION SELECT 1,database(),version()--?id-1 UNION SELECT 1,user(),version_compile_os--观察回显database()当前数据库名。version()MySQL 版本。user()当前数据库用户。version_compile_os 当前数据库操作系统7. 源码缺陷总结SELECT * 固定回显位使联合查询非常直观。LIMIT 0,1和mysql_fetch_array只取第一行但可通过-1让联合结果优先显示。8. 与 sqli-labs 其他关卡映射分析Less-2、Less-3、Less-12源码尝试使用联合查询获取当前库、用户、版本、操作系统。9.现代网站应用场景和闭合手法情况相似参考文章0x0002后记大多数讲解联合查询的课程都会一起讲information_schema元数据的内容但是个人认为这对于新手来说冲击会比较大所以决定把内容分为两次文章来讲解。希望各位业内的老师傅能纠正文章的错误非商业用途仅供交流学习禁止转载