别再死记Payload了!一篇文章搞懂SQL注入利用思路
大家好,前面学习了 SQL 注入的概念和分类之后,我发现自己遇到了一个问题。
数字型注入知道。
字符型注入知道。
GET 注入、POST 注入也知道。
但是如果真给我一个存在 SQL 注入的网站:
http://test.com/news.php?id=1
接下来该干什么?
应该从哪里开始?
应该怎么一步一步拿到数据库里的数据?
直到最近系统学习了 SQL 注入的利用流程,我才发现原来整个过程是有固定思路的。
今天就用我自己的理解方式,带大家走一遍 SQL 注入的完整利用流程。
一、SQL注入到底在干什么?
很多新手认为:
SQL 注入 = 爆密码
其实并不是。
SQL 注入本质上是:攻击者通过构造特殊输入,改变数据库原本执行的 SQL 语句逻辑。
例如网站原本执行:
SELECT * FROM news WHERE id=1;
如果开发者没有过滤用户输入。
攻击者输入:
1 OR 1=1
最终可能变成:
SELECT * FROM news WHERE id=1 OR 1=1;
由于:
1=1
永远成立。
数据库就可能返回所有数据。
这就是 SQL 注入的核心原理。
二、拿到一个参数后第一步做什么?
假设发现这样一个地址:
http://test.com/news.php?id=1
千万不要上来就开始各种 payload。
第一步永远是:确认是否存在注入。
例如:
?id=1'
如果页面报错。
说明参数可能参与了 SQL 查询。
继续测试。
三、判断是否真的存在SQL注入
经典方法:
正常条件
?id=1 and 1=1
页面正常。
错误条件
?id=1 and 1=2
页面异常。
如果:
1=1 正常
1=2 异常
那么说明用户输入已经影响了数据库查询逻辑。
此时基本可以判断存在 SQL 注入。
很多靶场都是从这里开始突破的。

四、确定查询字段数量
确认存在注入后,下一步要知道:数据库查询了多少列。
因为后面要使用 UNION 联合查询。
最常见的方法:
order by 1
正常。
order by 2
正常。
order by 3
正常。
order by 4
报错。
说明当前查询只有:
3个字段
因为第四列已经不存在了。

五、寻找回显位
知道字段数量后,开始测试哪些字段能显示到页面。
例如:
union select 1,2,3
页面出现:2
那么说明:
第二列是回显位。
如果出现:1 和 3
则说明:
第一列和第三列是回显位。
后面获取数据库信息就需要放到这些位置。

六、获取数据库名称
找到回显位后。
可以查询数据库信息。
例如:
union select 1,database(),3
页面可能显示:security
这就是当前数据库名称。
说明我们已经成功读取数据库信息。
七、获取所有表名
数据库知道了,接下来想知道里面有哪些表。
MySQL 中有一个特殊数据库:
information_schema
它记录着所有数据库结构信息。
例如查询:
information_schema.tables
可以获取表名称。
最终可能得到:
users
news
admin
message
这些都是目标数据库中的表。

八、获取字段名称
知道表之后,继续查看字段。
例如:
users
表中可能存在:
id
username
password
email
这些字段决定了数据存放的位置。

九、获取真正的数据
最后一步,读取数据。
例如:
username
password
字段。
查询后可能得到:
admin
123456
至此,整个 SQL 注入利用过程完成。
十、把整个流程串起来
实际渗透测试中。
大多数 SQL 注入利用流程都遵循下面这个思路:

如果把这个流程理解透彻。
后面学习:
- Union注入
- 报错注入
- 布尔盲注
- 时间盲注
- SQLMap
都会轻松很多。
因为这些技术本质上只是获取数据的方法不同。
而整体利用思路是完全一致的。
十一、总结
刚开始学习 SQL 注入的时候,我总觉得各种注入方式特别乱。
今天学习完利用流程之后才发现。
真正重要的不是背多少 Payload。
而是知道:
拿到一个参数以后应该先做什么,后做什么。
只有把整个利用链路理解清楚。
后面学习 Union 注入、盲注、SQLMap 时才不会觉得知识点零散。


