输入1',发现被转义了,同时也试过了整形注入,判断肯定不是整形注入。 所以尝试使用宽字节注入1%df',发现并不行(注意:这里是使用%df要直接在浏览器里面输入,不可以在框中输入,有编码问题) 没什么太好头绪的时候,输入了一个\发现有报错了。 确实是单引号闭合的,这次输入1\' #,发现可以正常显示。。。 总不能多了一个\真的把多出来的\给闭合了吧,估计是做了什么怪操作,而且addslashes()好像也会给\加上\的吧。接着尝试and 1=1和and 1=2,果然,and 1=2的时候无回显,可以注入了,直接拿数据1\' union select 1,group_concat(user,char(94),password) from users#。
看源码这里还是有点奇怪的,先给id加上了反斜杠,但是我测试了下,和想像中有点不一样。
$id = "\'"; $id = addslashes($id); print "first time:".$id; print "<br>"; $id = str_replace("\\\\", "\\", $id); print "last result:".$id;上面代码的运行结果是
first time:\\\' last result:\\'原来str_replace()不是将\\\\替换成\\,而是将\\替换成\,所以3\\\就变成了\\,最后SQL语句就变成了SELECT first_name, last_name FROM users WHERE user_id = '1\\' and 1=1 #',\将\转义了,所以查询的是其实是1\这个字符串,是可以正常查询的,同时也保留了单引号,给我们闭合单引号留下了机会,但是没想明白为啥要搞这么一手操作。。。取数据的时候可以到是可以用这些东西屏幕掉\,当然还可以用stripslashes(),但是这不就给我们机会搞二次注入了么,哈哈。
