soapclient原生类与CRLF利用构造POST写入shell
我们可以自己设置User-Agent
的值。当我们可以控制User-Agent的值时,也就意味着我们完全可以构造一个POST请求,因为Content-Type
和Content-Length
都在User-Agent
之下,而控制这两个是利用CRLF
发送POST请求最关键的地方。
1 | $_SERVER['REMOTE_ADDR']#获取最后一个代理的IP也就是直接和服务器代理或服务器交互的IP。 |
PHP中的join
函数
1 | join(seperator, array)#把数组合并为字符串,并且在数组之间加入设定的seperator。 |
vim快捷键
跳转到本文最后一行首字母:shift + g
跳转到最后一行最后一个字母:g + $
跳转到本行首:0
soapclient的利用
soapclient的原理
我们来看一下PHP中含魔方法的内置类
魔术方法:一般都是系统在特定时机自动调用的函数或方法,绝大多数情况下不需要程序员手动调用。
1 |
|
看到如下结果:
所以对于Soapclient::__call
对于所有含魔术方法的内置类,当其调用一个不存在的方法时,会首先自动调用__call()
SOAP(简单对象访问协议)是连接或Web服务或客户端和Web服务之间的接口。
其采用HTTP作为底层通讯协议,XML作为数据传送的格式,仅限于http/https协议
SOAP消息基本上是从发送端到接收端的单向传输,但它们常常结合起来执行类似于请求 / 应答的模式。
如果想要使用SoapClient类需要在php.ini配置文件里面开启extension=php_soap.dll选项
本次测试环境为mac,所以已经自动加载所有需要的动态连结库,不需要load。
SoapClient::__construct ( string|null $wsdl , array $options = [] )
$wsdl
:wsdl文件的uri,如果是NULL意味着不使用WSDL模式。wsdl是类似html格式的一种文件格式,也是闭合标签形式。
$options
:如果在wsdl模式下,此参数可选;如果在非wsdl模式下,则必须设置location和uri选项,其中location是要将请求发送到的SOAP服务器的URL,而uri 是SOAP服务的目标命名空间。
官方的$option
参数中有这样的一条介绍
1 | The user_agent option specifies string to use in User-Agent header |
这也就注定了下面我提到的下划线的原因。
1 |
|
下面是demo.php,用于判断写入条件
1 |
|
执行即可!
如图所示:
显然我们修改了user-agent然后控制了post请求,通过CRLF注入插入了不同的字段,用反序列化成功写入shell。