语言:PHP
工具:Seay代码审计系统
挖掘技巧:
特定函数:select、insert、update、delete、sql执行语句
可控变量:带$的变量 (如select * from XXX where id = $id limit 0,1)
思路:
先导入源码,全局搜索select,选择不区分大小写
其中有两处是存在可控变量$ID,这里选择第一处
发现其中是一个函数,$ID是函数ywX()调用时传入的变量,并且传入之后直接拼接到sql语句中无任何过滤就被执行了
所以需要找出ywX()函数在哪被调用了,全局搜索ywX
选择第一次出现的位置并查看,发现函数ywX在/sqqyw/php/v144.php处被调用了,传入的$ID变量是通过页面接收过来的,访问http://localhost//sqqyw/php/v144.php?id=1随便传入一个id值查看效果
页面出错,提示 从哪里来,滚哪里去!
全局搜索查看源码找到打印提示的地方
分析源码,当数组$sohuquan中不存在$domain时打印输出提示语句
$domain:来自请求头referer字段,并去掉http://
$sohuquan:来自请求头host字段
所以抓包添加referer字段,并将host字段值给referer可绕过
因为Referer被接收之后会去掉http://,所以http://可加也可不加
又提示说 请输入完整
跟上一步一样,全局搜索找出在哪里打印的
可以看到,其中api=ok,并且u、p、id三个参数只要存在一个为空即打印改提示,
构造payload绕过
成功绕过,提示购买失败
利用burpsuite抓包利用重发器演示
构造sql注入payload:
http://localhost/sqqyw/php/v144.php?api=ok&u=1&p=1&id=1'
不报错,依然输出购买失败
到这已经很明显了,其中id由v144.php页面传入,并且毫无过滤就被带入到sql语句中执行了,而页面提示都是购买失败
这是一个典型的sql盲注
可以直接利用注入神器sqlmap并指定参数id进行注入
爆当前库名:sqqyw
python sqlmap.py -u "http://localhost/sqqyw/php/v144.php?api=ok&u=1&p=1&id=1" --batch -p "id" --current-db
也可以采用时间盲注,用burpsuite进行爆破