phpreverse
知识点
call_user_func() 回调函数、session反序列化机制、CRLF漏洞、变量覆盖、利用SoupClient原生类来导致SSRF
解题
这个题目涉及的问题很多,看了很多大佬的博客才弄清楚。

代码很短,但是思考量和综合性却很大,且还可以发现一个 flag.php文件:

这个需要$SERVER[“REMOTE_ADDR”] === 127.0.0.1 才能拿到flag,显然是得去利用SSRF。但是题目也没提供什么类和方法,了解到php内置类 SoupClient 是可以导致SSRF的,但是得想办法去触发它, SoupClient 类有 一个利用是反序列化调用不可访问的方法从而触发 _ call函数来触发一个请求。但是题目里面也没有反序列化的函数,这个时候需要我们自己去创造。刚好这里可以利用session的反序列化机制来触发。
参考文章:
https://blog.csdn.net/weixin_44077544/article/details/102960092
CRLF 漏洞核心: http请求头 之间用 回车换行来分隔 请求头和请求体之间用 回车换行回车换行 来分隔,浏览器会识别这个,并作出相应的分隔
https://www.dazhuanlan.com/2020/02/10/5e40fa1f247e5/
SESSION 反序列化机制:https://blog.spoock.com/2016/10/16/php-serialize-problem/ ,这个的核心是利用序列化存储方式和取出来反序列化时的方式不同导致的,这里不得不想到,前后不一致,结构的改变都有可能导致漏洞。
构造 SoupClient 类来触发 SSRF :https://www.cnblogs.com/iamstudy/articles/unserialize_in_php_inner_class.html#_label1_0
解题:
我们本地构造一个触发SSRF的 SoapClient脚本:
$target, 'user_agent' => "N0rth3ty\r\nCookie: PHPSESSID=g6ooseaeo905j0q4b9qqn2n471\r\n", 'uri' => "123")); $payload = urlencode(serialize($attack)); echo $payload; ?>一开始我们传参
1 | f=session_start&name=|O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3 |
序列化引擎被我们更改了,存进去的是以 php_serialize()来进行序列化然后存的,然后第二次我们传?f=extract
POST b=call_user_func , 覆盖b变量,此时取出来的是经过php引擎反序列化的,产生的类,调用不存在方法 从而触发call 函数,从而构成ssrf 。一开始我们设置 Cookie: PHPSESSID=g6ooseaeo905j0q4b9qqn2n471,就是为了造成会话固定,触发反序列化SSRF后,是以我们设置的COOKIE来访问的flag.php,所以最后我们才能通过这个Cookie 身份来 打印出 对应 session[flag]

也可以看到,打印出来的也仅仅只是flag字段的。就是说不通身份(cookie)对应的 session 是不一样的