建站极客
网络安全 漏洞分析 正文
php escapeshellcmd多字节编码漏洞解析及延伸
所属分类:
网络安全 / 漏洞分析
阅读数:
156
收藏 0
赞 0
分享
漏洞公告在http://www.sektioneins.de/advisories/SE-2008-03.txt
PHP 5 <= 5.2.5
PHP 4 <= 4.4.8
一些允许如GBK,EUC-KR, SJIS等宽字节字符集的系统都可能受此影响,影响还是非常大的,国内的虚拟主机应该是通杀的,在测试完这个漏洞之后,发现还是十分有意思的,以前也有过对这种类型安全漏洞的研究,于是就把相关的漏洞解释和一些自己的想法都写出来,也希望国内的一些有漏洞的平台能迅速做出响应,修补漏洞。
这个漏洞出在php的用来转义命令行字符串的函数上,这些函数底层是用的php_escape_shell_cmd这个函数的,我们先来看看他的处理过程:
/* {{{ php_escape_shell_cmd
Escape all chars that could possibly be used to
break out of a shell command
This function emalloc’s a string and returns the pointer.
Remember to efree it when done with it.
*NOT* safe for binary strings
*/
char *php_escape_shell_cmd(char *str) {
register int x, y, l;
char *cmd;
char *p = NULL;
l = strlen(str);
cmd = safe_emalloc(2, l, 1);
for (x = 0, y = 0; x < l; x ) {
switch (str[x]) {
case ’"’:
case ’\’’:
#ifndef PHP_WIN32
if (!p && (p = memchr(str x 1, str[x], l - x - 1))) {
/* noop */
} else if (p && *p == str[x]) {
p = NULL;
} else {
cmd[y ] = ’\\’;
}
cmd[y ] = str[x];
break;
#endif
case ’#’: /* This is character-set independent */
case ’&’:
case ’;’:
case ’`’:
case ’|’:
case ’*’:
case ’?’:
case ’~’:
case ’<’:
case ’>’:
case ’^’:
case ’(’:
case ’)’:
case ’[’:
case ’]’:
case ’{’:
case ’}’:
case ’$’:
case ’\\’:
case ’\x0A’: /* excluding these two */
case ’\xFF’:
#ifdef PHP_WIN32
/* since Windows does not allow us to escape these chars, just remove them */
case ’%’:
cmd[y ] = ’ ’;
break;
#endif
cmd[y ] = ’\\’;
/* fall-through */
default:
cmd[y ] = str[x];
}
}
cmd[y] = ’\0’;
return cmd;
}
/* }}} */
可以看到,php通过将",’,#,&,;.....等等在shell命令行里有特殊意义的字符都通过在前面加上\变成\".\’,\#,\&,\;......来进行转义,使得用户的输入被过滤,来避免产生command injection漏洞。在php看来,只要过滤了这些字符,送入到system等函数中时,参数就会是安全的,php手册中给出的利用例子如下:
<?php
$e = escapeshellcmd($userinput);
// here we don’t care if $e has spaces
system("echo $e");
$f = escapeshellcmd($filename);
// and here we do, so we use quotes
system("touch \"/tmp/$f\"; ls -l \"/tmp/$f"");
?>
很明显,如果没有经过escapeshellcmd的处理,用户输入hello;id的话,最后system执行的会是:
echo hello;id
;在shell里是分割命令的作用,这样不仅仅会echo hello,还会执行id这个命令,导致命令注入漏洞。用escapeshellcmd处理之后命令变成:
echo hello\;id
这样执行的命令就只会是echo,其他的都变成echo的参数,很安全。
事实上是这样么?php在处理完参数送入system之后它就什么都不管了,后面的工作实际上都是由linux来完成的,那么linux在处理这些参数的时候是怎么样的呢?linux在执行命令的时候会有一些的表示工作环境的环境变量,譬如PWD代表当前的工作环境,UID代表了你的身份,BASH代表命令解释器等等......而在linux系统执行命令的时候,还有一个非常重要的参数,LANG,这个参数决定了linux shell如何处理你的输入,这样就可以当你输入一些中文字符的时候,linux能认识他,不至于出现人与系统之间出现理解上的错误。默认情况下,linux的LANG是en_US.UTF-8,UTF-8是一个很安全的字符集,其系列中包含有对自身的校验,所以不会出现错误,会工作良好。一些系统支持多字节字符集如GBK的时候,这也正是国内的多数情况,你可以设置LANG=zh_CN.GBK,这样你的输入都会被当作GBK编码处理,而GBK是双字节的,合法的GBK编码会被认为是一个字符。
大家可以看到,在php的处理过程中,它是单字节处理的,它只把输入当作一个字节流,而在linux设置了GBK字符集的时候,它的处理是双字节的,大家的理解很明显地不一致。我们查下GBK的字符集范围为8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,而一个非常重要的字符\的编码为5c,在GBK的尾字节范围之内,这样我们考虑一个特殊的输入:
0xbf;id
或 0xbf’id
经过php的escapeshellcmd单字节转码之后将会是
0xbf5c;id
0xbf5c’id
注意0xbf5c是一个合法的GBK编码,那么在linux执行的时候,会认为输入是
[0xbfbc];id
很好,后面的id将会被执行。可以做个简单的实验,如下:
[loveshell@Loveshell tmp]$Content$nbsp;echo 縗
>
?
[loveshell@Loveshell tmp]$Content$nbsp;set|grep -i lang
LANG=zh_CN.GB2312
LANGVAR=en_US.UTF-8
[loveshell@Loveshell tmp]$Content$nbsp;export LANG=zh_CN.GBK
[loveshell@Loveshell tmp]$Content$nbsp;echo 縗
縗
[loveshell@Loveshell tmp]$Content$nbsp;set|grep -i lang
LANG=zh_CN.GBK
LANGVAR=en_US.UTF-8
[loveshell@Loveshell tmp]$Content$nbsp;
其中縗的编码为0xbf5c,可以看到在不设置LANG为GBK的时候縗是一个非法的gb2312编码,所以会被认为是两个字符,所以其中含有的0x5c起作用,被认为命令没结束。然后我们设置编码为GBK,縗就会被认为是一个字符来echo了。
那我们如何来证明php的漏洞呢,拿
作为例子,正常情况下上面的代码工作很好,我们提交
exp.php?c=loveshell
万能密码漏洞以及修复 万能密码漏洞以及修复 记得几年前要入侵一个企业网站超级简单 一般只需要找到后台 还有后台通常是www.xxx.com/admin/ 然后账号 密码都是'or'='or' 就进去 现在好像有几个也可以用 但是已经没那么普及了 如果网站还出现这种“
评论 0
收藏 0
赞 0
分享
恒浪IMS整合系统V4.1 多文件存在SQL注入漏洞 影响版本:
HoWave V4.1 ASP
漏洞描述:
在文件inc/ hl_manage.inc中:
adminUserId= Request.Cookies("hl_manage")("username")
评论 0
收藏 0
赞 0
分享
Gh0st控制端逻辑漏洞 严重程度:高
威胁程度:控制远程主机
错误类型:逻辑错误
利用方式:主机模式
受影响系统
Gh0st3.6之前所有版本
未影响系统
未知
详细描述
Gh0st 发现漏洞一个逻辑漏洞,这些漏洞可以被用户利用,可以从被控端向控制端发送任意文件到任意位置。
测试
评论 0
收藏 0
赞 0
分享
微软IIS6漏洞:服务器敏感信息易被窃 近日,安全专家对使用微软Internet信息服务IIS 6的管理员发出警告,声称Web服务器很容易受到攻击并暴露出密码保护的文件和文件夹。
据悉,基于WebDAV协议的部分进程命令中存在这种漏洞。通过给Web地址添加一些Unicode字符,黑客就可以访问这些敏感文件&mda
评论 0
收藏 0
赞 0
分享
校内网最新 xss Cookies得到密码 From:http://t00ls.net/viewthread.php?tid=1323&highlight=
校内网在发blog时对插入图片过滤不严格,存在xss漏洞.
在发blog时将插入图片URL写为如下代码即可触发:普通浏览复制代码打印代码
javas
评论 0
收藏 0
赞 0
分享
phpcms2008 注入漏洞 这个是最新有人发现的
该漏洞文件:ask/search_ajax.php
漏洞说明:
/ask/search_ajax.php
Code:
if($q)
{
$where = " title LIKE '%$q%' AND status = 5&qu
评论 0
收藏 0
赞 0
分享
PHPWIND & DISCUZ! CSRF漏洞 PHPWIND & DISCUZ! CSRF漏洞影响版本:
Discuz! 6.0.0 & 6.1.0 & 7.0.0
PHPWIND 6.0 & 6.3 & 7.0
漏洞描述:
PHPWIND & DISCUZ!存在CSRF漏洞
评论 0
收藏 0
赞 0
分享
phpwin7.0拿shell的方法 事发一星期前,在入侵一个PHPWIND论坛时的成果,适用于PHPWIND不能上传,而网上盛传的三种拿SEHLL方法都无效,可以一试,应该算是PHPWIND后台的漏洞
准备工具:winsock专家 v0.6 betan1 一只;UE-32.EXE一只;NC.EXE一只,电脑一台(
评论 0
收藏 0
赞 0
分享
查看更多