0x02 SQL注入思路与步骤
从0x01可以看出(《[394]Scalers技术笔记:SQL注入原理与关键步骤(1)》),SQL注入依赖于数据与代码的混淆,以及于传入值的直接拼接。那么SQL注入的思路也依循此特性而来。这里整理一下SQL注入的思路与步骤。
1.寻找SQL注入点
1.1输入识别
对于一个站点,要找到可能的注入点,注入才得以有下手之处。一般的注入点是在可以输入参数的地方,例如URL中带有?以及后面跟随的参数。这个可以在网络上找到很多,有一个Google的语法inurl:可以用于专门检索URL的内容。比如inurl:item_id=,inurl:newsid=……这些在网络上有人整理,有兴趣自行查询。
1.2触发异常
在找到输入参数以后,需要手动修改参数,触发异常。一般触发异常的形式是,在参数后增加单引号输入。例如对于本文中的例子,输入Tom改成Tom’。于是整个语句拼接完成后,变成
statement = “SELECT * FROM users WHERE name ='Tom'’;”
注意Tom后是两个单引号而非一个双引号。但这是有错误的SQL查询语句,如果直接执行,数据库会报错。如果错误没有处理代码,就会从层层抛出异常,直到最终直接显示在网页上。加一个单引号,一般是触发类型转换异常从而通过异常处理抛出。
所以,在触发异常的时候,可以先通过增加一个单引号的值传入。如果返回了异常,可以初步判断存在注入点。如果页面无变化,或者直接重定向,那么说明网站后台处理了相关的异常输入,于是可能不存在注入点。
1.3推断测试
在1.1和1.2的基础上,可以再做一些判断,以进一步确认注入情况。
真值与假值。
在0x01中提到了,对于一个命题,可以通过附上一个或命题使得整体恒真的情况。这里我们考察一下与(and)命题。一个命题如果与(and)一个假命题,则整体命题为假,如果与一个真命题,则整体命题为真。我们构造and1=1以及and 1=2于是这分别是一个真命题与一个假命题。
现在附在示例中再看。
statement = “SELECT * FROM users WHERE name ='Tom' and 1=1#;”
statement = “SELECT * FROM users WHERE name ='Tom' and 1=2#;”
第一个SQL查询的结果和原有的查询结果一致,第二个查询中,WHERE子句将始终为假值。如果上述两个对应于真值和假值的查询结果不相同,即服务器还是对不同的输入产生了不同的返回,那就可以断定参数含有SQL注入点。
*显注与盲注
如果服务器返回查询的错误,或者返回查询数据,那么属于显注。通过显注可以得到很多信息,比如服务器类型,或者数据库类型。这些信息都应该在SQL注入中收集,属于有价值的信息。同样地,如果是网站管理员,也应该适当配置,尽量不在错误中,提供太多关于服务器的信息。
如果服务器只是返回是与否,不显示数据,那就是盲注了。比如登录的页面。这里提出一个问题,如何在盲注的情况下,判断服务器的返回情况?欢迎讨论。
*POST与GET
最后,有的网站并非采取GET方法提交参数,而是采用POST方法。POST方法浏览器无法直接操作,需要通过其他代理拦截工具,例如BurpSuite,有兴趣的读者可以自行搜索。
本文作者Scalers,游走在口译世界的IT从业者。微信公众号ScalersTalk,网站ScalersTalk.com
转载请联系授权,否则将被公开谴责并追究法律责任。ScalersTalk已建立专业法律团队,侵权必究。
回复“VIP”查看2015年成长会会员招募。口译100小时训练计划群B 433686569
S君个人微信号,ScalersTalker 。打赏支付宝
scalerstalk [at] gmail [dot] com
回复任意小于标题括号中的数字查看历史文章。或者访问站点 ScalersTalk.com 查看。