PHP一次性爆出三个cve漏洞

2015-6-21 / 2 评论 网络安全 / Mrxn

本文共计 1962 字,感谢您的耐心浏览与评论.

火狐截图_2015-06-21T03-01-35.019Z.png

研究人员在近期发现php三个漏洞。这三个漏洞分别是:os命令注入漏洞、在堆里面的整型溢出漏洞,还有个本地段错误漏洞。第一个是新漏洞,后两个是由于补丁修补不全重新导致的漏洞。

首先让我们来看第一个漏洞:OS command injection vulnerability in escapeshellarg[CVE-2015-4642.]

顾名思义,第一个漏洞是一个函数命令注入漏洞。

贴上poc:

poc.php

1
2
3
4
5
6
7
<?php
 $a 'a\\';
 $b 'b -c d\\';
 var_dump( $aescapeshellarg($a) );
 var_dump( $bescapeshellarg($b) );
 system( 'php arginfo.php ' escapeshellarg($a) . ' ' escapeshellarg($b) )
?>
1
2
3
4
<?php    
  print"--- ARG INFO ---\n" );     
  var_dump( $argv );   
?>

arginfo.php

根据poc,我们发现是一个escapeshellarg()函数命令注入漏洞。

图1:

火狐截图_2015-06-21T03-03-05.962Z.png

根据我的本地测试以及作者告诉我们如果输出图1中的内容,则表示你的php版本存在该漏洞。

图2:

火狐截图_2015-06-21T03-03-23.140Z.png

若是图2则表示漏洞已经修复。

输出output如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string(2) "a\"
string(4) ""a\""
string(7) "b -c d\"
string(9) ""b -c d\""
--- ARG INFO ---
array(4) {
 [0]=>
 string(11) "arginfo.php"
 [1]=>
 string(4) "a" b"
 [2]=>
 string(2) "-c"
 [3]=>
  string(2) "d""
}

根据poc作者的解释:

前4行输出的结果是poc.php中var_dump函数的功能。通过比较输出结果与poc.php中第4、5两行,从escapeshellarg函数的输出结果可以看出攻击者可以设置一个字符串,而不是绕过一个参数。

同样,第10行在arginfo.php,这是通过var_dump输出的。通过比较,我们发现系统函数被调用在poc.php的时候是两个参数的,但是在命令行解释的时候是3个参数的。

根据https://git.php.net/?p=php-src.git;a=commitdiff;h=d2ac264ffea5ca2e85640b6736e0c7cd4ee9a4a9发布的补丁信息,我们发现他们过滤了。

通过我们实验室的小伙伴的测试,作者给的poc只有PHP 5.6.9版本受影响,另外测试的PHP 5.4.41不受影响。

接下来是第二个漏洞:PHP 5.6.9 Integer overflow in ftp_genlist() resulting in heap overflow [CVE-2015-4643]

http://p9.qhimg.com/t01f212d34223a1dc5a.png

根据Max Spelsberg的邮件内容,我们知道在recv loop,size 可以被递增两处。一个在‘size+=rcvd’,另一个在‘size++’。这意味着size可以递增超过rcvd的每次迭代,从而使溢出检查能够被绕过。

Size能够递增最多rcvd*2次迭代,这就是为什么我曾建议修复rcvd*2,而不仅仅是rcvd。

为了正确的修复这个bug,我建议除了溢出检查以外,还需要排除其他原因导致size通过rcvd增加,或者通过迭代。从而保证溢出检查不被绕过。

值得注意的是,并不是因为分支功能不是必要的,就没必要使其复杂化。

另外我们通过,http://git.php.net/?p=php-src.git;a=commitdiff;h=0765623d6991b62ffcd93ddb6be8a5203a2fa7e2补丁对比 ,

火狐截图_2015-06-21T03-06-35.302Z.png

发现对size进行了处理。

最后,让我们来看第三个漏洞:segfault in php_pgsql_meta_data

根据官方bug详情,用一段特殊的php代码,可以引起一个段错误在php_pgsql_meta_data。

1
pg_insert($conn'.',  array('foo' => 'bar')

这是因为#68741的不完全修复导致的。

Strok_r的返回值不在php_pgsql_meta_data检查导致的一个本地段错误。

详细补丁可通过https://git.php.net/?p=php-src.git;a=commitdiff;h=2cc4e69cc6d8dbc4b3568ad3dd583324a7c11d64查看比较。

综上所述,前两个漏洞要想利用,给看远程的PHP代码是怎么写的,才能触发,而且都是针对PHP 5.6.9这个版本的。最后一个是本地的漏洞,实际攻击用处不大。


标签: 漏洞 php cve

转载:转载请注明原文链接 - PHP一次性爆出三个cve漏洞


2条回应:“PHP一次性爆出三个cve漏洞”


发表评论

{view_code_no}