【MRCTF2020】Ezpop_Revenge——PHP原生类SSRF

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

【MRCTF2020】Ezpop_Revenge——PHP原生类SSRF

1. 收获


  • CMS初审计
  • google、baidu hack
  • PHP原生类反序列化
2. 看题

2.1 读源码

网页存在源码泄露,访问www.zip,得到源码。同时要知道,typecho模板是存在反序列化注入漏洞的,但是其存在于install.php,本题中没有这个文件,所以找找其他线索。
flag.php:
  1. [/code]说明是要读session中的flag字段。
  2. [b]搜索字符串unserialize[/b],找到其他使用反序列化函数的地方,在/usr/plugin.php中发现:
  3. [img]https://raw.githubusercontent.com/CaptainGrun/typora_images/blogs/prototype-pollution-Pythonimage-20231114183420528.png[/img]
  4. 也就是说,如果请求中存在admin字段,同时session中的flag字段也被成功写入,则会输出flag的值。那我们要做的就是满足flag.php中的条件:$_SERVER['REMOTE_ADDR']==="127.0.0.1"。
  5. [size=4]2.2 函数触发[/size]
  6. 为了激活该反序列化函数,我们需要查找action函数对应的路由,全局搜索类名HelloWorld_Plugin,定位到文件/var/Typecho/Plugin.php:
  7. [img]https://raw.githubusercontent.com/CaptainGrun/typora_images/blogs/prototype-pollution-Pythonimage-20231114205801338.png[/img]
  8. 可以看到访问/page_admin即可触发action函数。
  9. [size=4]2.3 POP链[/size]
  10. 查看/usr/plugin.php中的POP链,定位函数:
  11. [code]class HelloWorld_DB{
  12.     private $flag="MRCTF{this_is_a_fake_flag}";
  13.     private $coincidence;
  14.     function  __wakeup(){
  15.         $db = new Typecho_Db($this->coincidence['hello'], $this->coincidence['world']);
  16.     }
  17. }
复制代码
这里实例化了一个类,所以进入Typecho_Db类中的__construction查看:
  1.     public function __construct($adapterName, $prefix = 'typecho_')
  2.     {
  3.         /** 获取适配器名称 */
  4.         $this->_adapterName = $adapterName;
  5.         /** 数据库适配器 */
  6.         $adapterName = 'Typecho_Db_Adapter_' . $adapterName;
  7.         if (!call_user_func(array($adapterName, 'isAvailable'))) {
  8.             throw new Typecho_Db_Exception("Adapter {$adapterName} is not available");//__toString()
  9.         }
  10.         $this->_prefix = $prefix;
  11.         /** 初始化内部变量 */
  12.         $this->_pool = array();
  13.         $this->_connectedPool = array();
  14.         $this->_config = array();
  15.         //实例化适配器对象
  16.         $this->_adapter = new $adapterName();
  17.     }
复制代码
这里提示使用__toString方法。全局搜索toString函数,这里使用/var/Typecho/Db/Query.php中的函数:
  1. public function __toString()
  2.     {
  3.         switch ($this->_sqlPreBuild['action']) {
  4.             case Typecho_Db::SELECT:
  5.                 return $this->_adapter->parseSelect($this->_sqlPreBuild);
  6.             case Typecho_Db::INSERT:
  7.            .....//省略后面
  8.         }
  9.     }
复制代码
可以看到如果我们的_adapter属性不包含parseSelect方法的话就会调用其自身的__call函数,因此这里使用PHP中的原生类SoapClient进行SSRF,因为原生类中包含了__call函数。
利用链:
  1. HelloWorld_DB::wakeup–>Typecho_Db::__construct(tostring)–>Typecho_Db_Query::__construct–>(this->_adapter=new Soapclient)–>SSRF
复制代码
2.4 Payload

如下:
[code][/code]下面只需要使用POST方式把上面的输出放到C0incid3nc3变量中即可。然后在GET参数上再加一个admin变量即可出现flag的值。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表