在用万能密码进行登录的时候发现,username处无法绕过对密码的检查,总是登录失败。猜测后台对uname参数的值有过滤。导致无法注入。
使用正常方式进行登录,发现在前台可以修改用户的密码。
再次尝试,发现passwd处存在sql注入漏洞,
payload:uname=admin&passwd=123'&submit=Submit
,出现报错语句
于是在passwd出输入万能语句uname=admin&passwd=123' or 1=1#&submit=Submit
,成功登录。
基于错误的注入,基本的注入流程和前面关卡的方法一样,在这里就不在讨论了。
现在我们通过源代码来看看,后台对uname的值做了哪些检查和过滤,导致了无法注入。
从下图可以看到,后台对uname
调用了函数check_input
我们跟进check_input()
函数,
可以看到,该函数通过substr()
对uname
首先加了长度限制,15个字符以后的将会被舍弃。
之后又用到stripslashes()
函数对uname
进行过滤。该函数的作用是返回一个去除转义反斜线后的字符串(\’ 转换为 ’ 等等)。双反斜线(\)被转换为单个反斜线(\)。
这里是该函数详细说明:http://php.net/manual/zh/function.stripslashes.php
最后进行纯数字检查,使用函数mysql_real_escape_string()
进行特殊字符的过滤。一般没有特殊情况,在向mysql传送查询前,必须调用该函数。
该函数在以下字符前添加反斜杠: \x00, \n, \r, \, ', " 和 \x1a.
该函数的详细说明:http://php.net/manual/zh/function.mysql-real-escape-string.php
在这里只对uname
调用了check_input()
函数,并没有对passwd
也调用该方法。
在后面又使用update导致在前台可以对用户密码进行更改。