前言
上周hxb
决赛攻防模式碰见了该套程序,正好没跟过该套程序的反序列化链,漏洞虽然比较老,但很有学习的价值,在这里记录一下;hxb
排了11
,小遗憾。
代码分析
漏洞触发点位于install.php
,代码段如下
230
行处取出cookie
值进行了反序列化操作,接着在232
行创建了Typecho_Db
类的实例,我们来到位于\var\Typecho\Db.php
的Typecho_Db
类中,在该类的构造方法中存在着如下代码段
在120
行处存在着字符串的操作,同时$adapterName
是可控的,在这里我们可以控制触发任意类的__toString
方法,在这里选择位于\var\Typecho\Feed.php
中的Typecho_Feed
类,重要代码如下
在290
行存在着$item['author']->screenName
,其中$item['author']
可控,那么在这里我们就可以触发任意不存在screenName
属性的类的__get
方法,在这里选择\var\Typecho\Request.php
中的Typecho_Request
类
跟进__get
方法
该处的$value
可控,最后会触发_applyFilter
方法,跟进该方法
该方法中存在着array_map
与call_user_func
,且参数均可控,符合代码执行的条件,在这里选择使用call_user_func
,即可触发代码执行,接着梳理一下调用链
1 | unserialize |
细节补充
1.在实际利用漏洞的过程中,出现了500错误,猜测是程序内部在运行payload时捕获到了异常从而清除了回显,通过在执行代码时刻意添加exit,解决了该问题
2.漏洞的利用代码需要通过设置cookie键值传递,在查看获取cookie的代码段时,发现获取cookie建值也可以使用POST方法
3.漏洞触发需要绕过install.php
中的两个if
判断
在这里我们需要来传递finish
参数同时添加referer
头为本站链接来绕过校验
漏洞利用
编写exp如下
1 |
|
发送payload