观察此关 有许多的功能 比之前多一些
尝试对用户名/密码进行注入
发现无论我们输入什么都无法进行注入 观察源码
发现使用了php中的mysql_real_escape_string() 函数
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- \x00
- \n
- \r
- \
- ’
- "
- \x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。‘
这里可以进行宽字节绕过
宽字节注入原理:
GBK 占用两字节
ASCII占用一字节
PHP中编码为GBK,函数执行添加的是ASCII编码(添加的符号为“\”),MYSQL默认字符集是GBK等宽字节字符集。
宽字节
GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,即将两个ascii字符误认为是一个宽字节字符。
将UTF-8转换为UTF-16或者UTF-32,例如将’转换为utf-16为: �’
进行注入
%df’ 被PHP转义,单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在 %df\’ =%df%5c%27,如果默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。
密码随意
此关没有后续页面 所以我们尝试使用其他手段
点击
Forgot your password?
弹出以下页面
显然是不能注入的
点击
New user
观察源码
同样可以使用宽字节注入
同样也没有后续页面
尝试其他地方
注册一个新用户
跳转到登录页面了
我们在这尝试过注入 没有结果 所以我们尝试在其他地方注入
登录我们注册的账号
二次注入
**二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
二次注入,可以概括为以下两步:
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。
**
知道方法了之后我们注册一个
10086‘#
这里我们可以看到10086’#密码没有被修改 被修改的是10086这个用户
登录10086这个用户
发现可以成功登录
此关就结束了