php escapeshellcmd多字节编码漏洞(3)_PHP教程
推荐:详细讲解PHP中缓存技术的应用PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站,在速度上有绝对的优势,想mssql转6万条数据php如需要40秒,asp不下2分钟.但是,由于
大家可以看到,在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@Loveshelltmp]$echo?lt;br />>
?
[loveshell@Loveshelltmp]$set|grep-ilang
LANG=zh_CN.GB2312
LANGVAR=en_US.UTF-8
[loveshell@Loveshelltmp]$exportLANG=zh_CN.GBK
[loveshell@Loveshelltmp]$echo?lt;br />?lt;br />[loveshell@Loveshelltmp]$set|grep-ilang
LANG=zh_CN.GBK
LANGVAR=en_US.UTF-8
[loveshell@Loveshelltmp]$
其中康谋嗦胛?xbf5c,可以看到在不设置LANG为GBK的时候渴且桓龇欠ǖ膅b2312编码,所以会被认为是两个字符,所以其中含有的0x5c起作用,被认为命令没结束。然后我们设置编码为GBK,烤突岜蝗衔且桓鲎址磂cho了。
那我们如何来证明php的漏洞呢,拿
<?php
$e=escapeshellcmd($_GET[c]);
//herewedon'tcareif$ehasspaces
system("echo$e");
?>
作为例子,正常情况下上面的代码工作很好,我们提交
分享:利用PHP V5开发多任务应用程序许多 PHP 开发人员认为,由于标准的 PHP 缺少线程功能,因此实际 PHP 应用程序不可能执行多任务处理。例如,如果应用程序需要其他 Web 站点的信息,那么在远程检索完成之前它都必须停止。这是错
- 相关链接:
- 教程说明:
PHP教程-php escapeshellcmd多字节编码漏洞(3)。