sql注入

SQL注入 宽字节注入(Less-32/34)

2018-09-29  本文已影响3人  dawsonenjoy

原理

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的一种方法。

应用——get方法(Less-32):

我们可以看到如下几个语句,其意思分别为:①把输入内容中的\替换成\ ②把’替换成\’ ③把”替换成\”,如图:


此时我们如果按照平常的方式直接输入’将会被转义成\’而注入失败,所以我们可以尝试上面的方法,例如在’前面加%df,从而和\结合起来,例如后面加入:%df' --+,此时即可注入,如图:


应用——post方法:(Less-34)

在get方法当中我们可以前面加入%df是因为在url直接传址当中数据会通过 URLencode,因而直接把\给合并了,当在post当中就不能这样,所以可以试着用新型方法:将utf-8转换为utf-16或utf-32,例如将‘转为utf-16即� ',我们使用万能密码如图,将会发现可以成功注入:


几种过滤使用的函数

1.addslashes()函数

返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(') 双引号(") 反斜杠(\)
【预防:使用 addslashes(),我们需要将 mysql_query 设置为 binary 的方式,才能防御此漏洞。
设置代码:

Mysql_query(“SET character_set_connection = gbk , character_set_result = gbk, character_set_client=binary” , $conn);

2.check_quotes()函数

其通过利用mysql_real_escape_string()函数进行的过滤。

3.mysql_real_escape_string()函数

转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
\x00 \n \r \ ' " \x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
【预防:在使用 mysql_real_escape_string()时,如何能够安全的防护这种问题,需要将 mysql 设置为gbk 即可。
设置代码:Mysql_set_charset(‘gbk’,’$conn’)

总结:
从前面我们可以看出过滤 ‘ \ 常用的三种方式是直接 replace,addslashes(), mysql_real_escape_string()。但三种方式仅仅依靠一个函数是不能完全防御的,所以我们在编写代码的时候需要考虑的更加仔细。

上一篇下一篇

猜你喜欢

热点阅读