这个SoupClient中加不加user-agent会不一样的。。。原因是什么,还不清楚
网上所有的wp都没把这点讲清楚,,,我就说,就离谱。明明session反序列化之后出了SoupClient类了,他们非要再传一个name=SoupClient进去。这个是不加user-agent的情况
加了user-agent就不用再传一次name=SoupClient了
要用到的很多很多的知识点,,,
sesion反序列化–>soap(ssrf+crlf)–>call_user_func激活soap类(抄袭的,我哪能总结出来啊,,,)
call_user_func函数
这个我自己总结的,看看
自己写的
extract
extract()函数,从数组中把变量导入当前页面,相同的变量会被覆盖。
所以下面的b=extract,同时$POST是一个数组,所以符合
reset()
会把数组中的第一个元素打印出来
implode()函数
把数组元素连在一起。这个题目,可怜的b一直被覆盖,所以没用上这个
Cookie和session之间的关系
这个还没有 仔细再查一遍,
之前看过,在加上班长讲的一下,也差不多把。
cookie是在本地的。
session是在服务端的。你来的时候,就看你的session。来决定给你看什么东西,所以这里我改了一下session,就对不上我之前的session了,所以看到的不一样了
CRLF&&HRS
Soap类Soup Client
这个没看,从几道CTF题看SOAP安全问题
ini_set和session_start的细微差别
正常的化,比如我们在入门PHP的session反序列化的时候,改变php引擎的方法是ini_set()函数,但是这个函数不接受数组,call_user_func($_GET['f'], $_POST);
而这里的post超级全局变量是一个数组,所以ini_set
就不行了,于是使用session_start
来代替,同时呢session.serialize_handler = php_serialize
也变成了serialize_handler=php_serialize
。
PHP原生类的利用
首先,php反序列化没有可以利用的类的时候,可以调用php原生类,
参考反序列化之PHP原生类的利用这是大佬写的。
我自己也想总结一个,一会儿后总结:
思路
- 利用回调函数覆盖session序列化引擎为php_serialize,构造SSRF的Soap类的序列化字符串配合序列化注入session文件。
当我们往外取的时候,会产生反序列化的注入。
- 利用反序列化注入的
SoapClient
类中的为存在的方法,从而调用__call()
实现SSRF访问flag.php
。这需要b是一个执行函数,也就是b应该是call_user_func
。但暂时b=implode
。所以要利用call_user_func($_GET['f'], $_POST)
。 f=extract , $_POST 是 b=call_user_func 。然后$_POST会自动把这个变成数组形式call_user_func(extract,array(b=>call_user_func))
。从而将b变量覆盖成了call_user_func了。此时call_user_func($b, $a)
就变成了call_user_func(call_user_func,SoapClient,'welcome_to_the_lctf2018')
。执行一个SoapClient中没有的方法,调用SoapClient中的 __call() 魔术方法,实现127.0.0.1访问flag.php。从而将flag写入该Cookie下的session中。 - 利用他第二步放回的sesion。替换一下session值,再一次访问,就能够显现出