您当前位置: 首页 » 敏感函数 » addslashes()

addslashes()

2017年3月10日 | 发表评论(0) 查看评论

一、函数原型及说明

string addslashes ( string $str )在一些特殊字符【单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)】前加上反斜线并返回字符串。返回的值是转义后的字符串。

二、函数风险及原理

1.人为习惯

大概分为两种情况,第一种情况是当GPC关闭时,模拟GPC,第二种情况是在数据库语句中变量没有使用单引号包围,导致不用输入单引号即可以注入

第一种情况:

GPC在php6后已经移除了,所以很多程序员习惯用addslashes()来模拟GPC达到过滤函数的目的,但是由于处理时考虑不完善会导致一些安全问题,比如只对数组的内容进行过滤处理,从而忽视了对键值的处理,导致绕过。

这个问题曾出现在ecshop中

审计实例:

文件includes/init.php判断get_magic_quotes_gpc(),如果为off则调用addslashes_deep():

addslashes_deep()在文件includes/lib_base.php里最后通过addslashes()处理

下面看下具体的导致漏洞的代码,文件 pick_out.php里:

由于magic_quotes_gpc=off时没有对$key处理,同时在数组赋值时存在逻辑问题,最终导致了注射漏洞。

第二种情况:

在这种情况中,无须输入单引号扰乱语句逻辑,因此不会触发addslashes的转义。

2.函数的一些绕过情况

a)字符编码问题导致绕过

这个问题主要利用一些编码对转义的特殊字符进行编码,第一种情况是当数据库编码格式设置为GBK时,可以实现宽字节注入,第二种情况是使用了iconv()或mb_convert_encoding()进行编码绕过。

第一种情况:

代码中通过set names gbk 把数据库编码设置为gbk,0xbf27本身不是一个有效的GBK字符,但经过  addslashes()  转换后变为0xbf5c27,前面的0xbf5c是个有效的GBK字符,所以0xbf5c27会被当作一个字符0xbf5c和一个单引号来处理,结果漏洞就触发了。

第二种情况:

iconv()的相关问题之前已经写过一篇文章,请移步http://www.am0s.com/functions/256.html 这里所说的问题是在使用iconv()进行编码时,无论是utf8togbk还是gbktoutf8都会造成宽字节注入

utf8togbk:

当访问http://127.0.0.1/test/1.php?username=admin%E9%8C%A6%27&password=1输出

原理:錦”这个字,它的utf-8编码是0xe98ca6,它的gbk编码是0xe55c。当我们的錦被iconv从utf-8转换成gbk后,变成了%e5%5c,而后面的’被addslashes变成了%5c%27,这样组合起来就是%e5%5c%5c%27,两个%5c就是,正好把反斜杠转义了,导致’逃逸出单引号,产生注入。

gbktoutf8:

当访问http://127.0.0.1/test/1.php?username=admin%df%27&password=1输出

b)字符解码导致的绕过

这个问题分为url解码、base64解码、json解码等等

url解码:

在addslashes()之后又进行了一次urldecode() ,因为浏览器在处理url时会默认urldecode一次,如果在人为的urldecode一次的话(二次urldecode),当我们输入了二次编码的参数时(如%2527),浏览器自动urldecode一次,经过addslashes的结果便是%27,没有出发addslashes的关键字,所以不对此进行转义,之后又引入一次urldecode,从而将%27解码为单引号(’),造成注入。

访问http://127.0.0.1/test/1.php?username=admin%2527&password=1

输出

base64解码:

一些程序员喜欢使用base64编码传递参数。

当访问http://127.0.0.1/test/1.php?username=YWRtaW4n时输出

YWRtaW4n是admin’的base64编码

3.其他一些情况

其他的一些情况(像preg_replace、$_SERVER、$_FILES等等)在我之前的文章中,写到过,所以就不一一列举了,大家可以去浅谈审计中如何快速定位引入单引号的地方( http://www.am0s.com/codesec/229.html )看

分类:

敏感函数

| 标签: