多字节编码漏洞产生的原因 什么导致多字节编码漏洞产生?
漏洞公告在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))) {
} else if (p && *p == str[x]) {
p = NULL;
} else {
cmd[y] = ’\\’;
}
cmd[y] = str[x];
break;
#endif
case ’#’:
case ’&’:
case ’;’:
case ’`’:
case ’|’:
case ’*’:
case ’?’:
case ’~’:
case ’<’:
case ’>’:
case ’^’:
case ’(’:
case ’)’:
case ’[’:
case ’]’:
case ’{’:
case ’}’:
case ’$’:
case ’\\’:
case ’\x0A’:
case ’\xFF’:
#ifdef PHP_WIN32
case ’%’:
cmd[y] = ’ ’;
break;
#endif
cmd[y] = ’\\’;
default:
cmd[y] = str[x];
}
}
cmd[y] = ’\0’;
return cmd;
}
可以看到,php通过将",’,#,&,;.....等等在shell命令行里有特殊意义的字符都通过在前面加上\变成\".\’,\#,\&,\;......来进行转义,使得用户的输入被过滤,来避免产生command injection漏洞。在php看来,只要过滤了这些字符,送入到system等函数中时,参数就会是安全的,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
NMAP NSE脚本有哪些作用?NMAP初始超时怎么办?
众所周知NMAP是经常用来进行端口发现、端口识别。除此之外我们还可以通过NMAP的NSE脚本做很多事情,比如邮件指纹识别,检索WHOIS记录,使用UDP服务等。发现地理位置GorjanPetrovski提交了个NMAP的NSE脚本,帮助我
详情2018-03-07 17:07:15责编:llp 来源:驱动管家电脑防火墙在哪里设置?防火墙的设置方法(iptables篇)
Firewall 防火墙,工作在网络或主机的边缘,对进出本网络或主机的数据包根据事先设置好的规则进行检查并且能够在数据包匹配到之后由预置的动作进行处理的组件的组合,有规则(符合条件,就有规则指定的动作进行处
详情2018-01-05 13:27:00责编:llp 来源:驱动管家防止黑客建立永久帐号的步骤 拦截重建账号的方法
windows下建立永久帐号方法,搞服务器安全的朋友也需要学习下,防止黑客建立永久帐号。操作步骤:1、在自己电脑里面建立一个 txt文本文件 2、在里面输入内容:@echo offnet user xixi 123456 add 注释:前
详情2018-03-02 19:25:16责编:llp 来源:驱动管家shell.users加用户:一种新的加用户的方法
今天研究了一下用户控制面板文件nusrmgr cpl,发现调用的是Shell Users来加用户,它还同时调用了wscript shell、Shell Application、Shell LocalMachine这三个组件。不过加用户的话,这一个Shell Users就足够了。
详情2018-02-15 09:34:20责编:llp 来源:驱动管家tibco ems服务器存在缓冲区溢出漏洞导致信息泄露
受影响系统:TIBCO Rendezvous < 8 1 0TIBCO EMS < 4 4 3TIBCO iProcess Engine 10 6 0 - 10 6 1不受影响系统:TIBCO Rendezvous 8 1 0TIBCO EMS 4 4 3描述:-------------------------------------------------------------------
详情2018-01-24 14:51:50责编:llp 来源:驱动管家你知道中国菜刀吗?网站管理软件中国菜刀怎么用?
中国菜刀,一个非常好用而又强大的webshell,它可不是用来切菜的做饭的道具哦,是一款专业的网站管理软件,大小只有300多KB,真是小巧实用啊!不过被不法分子利用到,就是一个黑站的利器了。我记得以前接触的时候
详情2018-01-24 11:01:35责编:llp 来源:驱动管家给黑客菜鸟的帮助 黑客菜鸟如何能轻松地拿webshell?
通过几次成功的拿Webshell,发现自己有时也走了一些弯路,为了避免其他的朋友再在困惑中迷失方向,现在我将自己的一些经验写出来,希望对一些想学拿Webshell的朋友有一定的帮助。首先我们要确定我们要检测的网站
详情2018-02-01 15:30:54责编:llp 来源:驱动管家ewebeditor漏洞利用的原理 ewebeditor漏洞如何利用?
漏洞的利用原理很简单,请看Upload asp文件:任何情况下都不允许上传asp脚本文件sAllowExt = Replace(UCase(sAllowExt), "ASP ", " ")修补方法:用以下语句替换上面那局话dim sFileType,Un_FileType,FileTypes
详情2018-01-07 09:12:54责编:llp 来源:驱动管家面向目标ip发起ddos攻击的木马工具
DDoS攻击通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的,词文章主要是针对那些对一种被大量肉鸡使用,面向目标IP发起DDoS攻击的木马工具。本篇文章是对一种被大量肉鸡使用,面向目标IP发起DDoS攻击
详情2018-01-04 11:13:04责编:llp 来源:驱动管家什么是sql触发器?sql触发器存在后门asp版
触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。 所以触发器可以用来实现对表实施复杂的完整性约束。SqlServer包括三种常规类型的触发器:DML触
详情2018-01-22 09:57:49责编:llp 来源:驱动管家
- excms oday是留下的后门?利用excms后门可拿shell
- MAC笔记本装双系统后没有驱动怎么办?
- 在word中输入复杂的化学工程式怎么操作
- editplus编辑器怎么将编辑窗口拆分为两部分?editplus编辑器使用技巧
- RX 470D与RX470有何区别 RX 470D首发评测
- 网咖选择电脑显示器配置有什么要求?选择网咖显示器的介绍
- vivo APEX全面屏概念机正式发布 占比高达91% 完成度为98% 搭载高通骁龙845处理器 全屏发声
- 酷似太空船飞机Magnavem 飞机将实现零排放
- 电脑开机的时候为什么会出现提示框提示注销?怎么解决
- Win10禁止生成系统错误内存转储文件图文详解
- 360手机n4a有哪些截图方法?360手机n4a如何截图?
- 仅售399的联通双4G手机:红辣椒任性版配置如何?
- 电脑经常黑屏、显示屏和键盘灯不亮、机箱里硬件运转正常
- 电脑DIY配置组装中有一些常见的认识误区介绍
- 三天内学到文件包含漏洞知识 利用文件包含漏洞提权
- 微软dns客户端服务漏洞,欺骗Internet通讯
- 安装ubuntu12.04后怎么安装无线网卡驱动?
- 将CentOS服务器目录映射为Windows磁盘驱动器的步骤
- 怎么在电脑上查询农行网银证书到期的时间
- 使用画图工具画图添加文字的时候将画面挡住了怎么办