别再死记Payload了一篇文章搞懂SQL注入利用思路大家好前面学习了 SQL 注入的概念和分类之后我发现自己遇到了一个问题。数字型注入知道。字符型注入知道。GET 注入、POST 注入也知道。但是如果真给我一个存在 SQL 注入的网站http://test.com/news.php?id1接下来该干什么应该从哪里开始应该怎么一步一步拿到数据库里的数据直到最近系统学习了 SQL 注入的利用流程我才发现原来整个过程是有固定思路的。今天就用我自己的理解方式带大家走一遍 SQL 注入的完整利用流程。一、SQL注入到底在干什么很多新手认为SQL 注入 爆密码其实并不是。SQL 注入本质上是攻击者通过构造特殊输入改变数据库原本执行的 SQL 语句逻辑。例如网站原本执行SELECT * FROM news WHERE id1;如果开发者没有过滤用户输入。攻击者输入1 OR 11最终可能变成SELECT * FROM news WHERE id1 OR 11;由于11永远成立。数据库就可能返回所有数据。这就是 SQL 注入的核心原理。二、拿到一个参数后第一步做什么假设发现这样一个地址http://test.com/news.php?id1千万不要上来就开始各种 payload。第一步永远是确认是否存在注入。例如?id1如果页面报错。说明参数可能参与了 SQL 查询。继续测试。三、判断是否真的存在SQL注入经典方法正常条件?id1 and 11页面正常。错误条件?id1 and 12页面异常。如果11 正常12 异常那么说明用户输入已经影响了数据库查询逻辑。此时基本可以判断存在 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可以获取表名称。最终可能得到usersnewsadminmessage这些都是目标数据库中的表。八、获取字段名称知道表之后继续查看字段。例如users表中可能存在idusernamepasswordemail这些字段决定了数据存放的位置。九、获取真正的数据最后一步读取数据。例如usernamepassword字段。查询后可能得到admin123456至此整个 SQL 注入利用过程完成。十、把整个流程串起来实际渗透测试中。大多数 SQL 注入利用流程都遵循下面这个思路如果把这个流程理解透彻。后面学习Union注入报错注入布尔盲注时间盲注SQLMap都会轻松很多。因为这些技术本质上只是获取数据的方法不同。而整体利用思路是完全一致的。十一、总结刚开始学习 SQL 注入的时候我总觉得各种注入方式特别乱。今天学习完利用流程之后才发现。真正重要的不是背多少 Payload。而是知道拿到一个参数以后应该先做什么后做什么。只有把整个利用链路理解清楚。后面学习 Union 注入、盲注、SQLMap 时才不会觉得知识点零散。