利用白盒与黑盒结合的方式审计某CMS
0x01
在群里看到Ashe表哥放了几手0day,心里那个羡慕啊于是打算开始学代码审计逛CNVD的时候发现最近SDCMS的漏洞比较多,于是下手挖掘,找到了两个漏洞的位置,因为此源码一些关键的位置都混淆了,所以对我这个刚接触的憨憨有点难度,于是采用白盒加黑盒的方式进行审计。
注:以下漏洞非本人提交,CNVD已经收录,源码是8.27下载的,漏洞依然存在
0x02
我在官网下载最新的1.8源码进行搭建,其中PHP要开启Openssl扩展方法很简单,打开php.ini找到该行,将前面的分号去掉就可以了
搭建好源码,然后去后台看看功能,测试发现多处上传的位置都存在目录遍历
发现过程:
点击选择,进入后点击upfile文件夹,Burp开启
抓取到如下数据包:
分析该数据包,发现并未提交参数,而是GET直接访问路径,观察路径发现
dXBmaWxl.html为Base64编码地址+.html
猜想,如果为./是否会遍历web根目录下的文件
将数据包发送到Burp的重放模块,并修改参数./ -> Li8= 测试目录遍历成功
该目录遍历存在的地方比较多,有上传的地方基本就存在,但是很鸡肋,没有列出目录,于是继续挖掘,发现插件中有一处目录遍历可列出目录和文件
进入插件列表,找到附件管理
当点击管理的时候,进入后Burp开启,然后随意点击一个文件夹抓到数据包
观察发现与上面的情况相似,直接修改为当前目录,然后提交.
发现成功遍历了网站根目录
这一处比较鸡肋,下面分享代码执行
在系统管理处有一处模板管理可以修改PHP文件
到这可能大家以为,这直接可以Getshell了啊,当时我也这样想,后面发现,写入PHP代码后还会在前面加一段代码,导致了我们的代码执行不了,甚至连phpinfo函数都写入不了,黑盒测试了一下无果
前面说到该CMS的一些文件是混淆了的,后来发现有些文件没有混淆,于是查找存在漏洞的位置在app/admin/controller
目录下,发现大部分文件没有混淆加密,且可以通过文件名明白该文件实现的功能,如图:
而主题模板的功能文件在app/admin/controller/themecontroller.php
目录下,查找问题原因,定位到themecontroller.php文件的150
行
此处找到问题原因,如果路径中存在字符串.php则执行 if代码块的内容
if代码块的内容正是向文件中写入下面的代码:
该代码导致了我们写入的代码无法执行,看到查找字符串的函数是strpos
学过PHP的朋友们应该知道strpos函数是对大小写敏感的,于是我们可以用.PHP的方法跳过该判断分支,前面我们还遇到一个问题就是phpinfo()函数写入时会报非法内容,原先的猜想是他有一个WAF会过滤,结果看到一个函数调用处理提交的数据,然后跟踪到该文件最后一行时震惊了
private function check_bad($str)
{
$num=preg_match_all("/(phpinfo|eval|if(!APP_DEMO)file_put_contents|file_get_contents|passthru|exec|chroot|scandir|proc_open|delfolder|un|mkdir|fopen|fread|fwrite|fputs|tmpfile|flock|chmod|delete|assert|_post|_get|_request|_file)/Ui",$str,$match);
return $num?$num:0;
}
他自己写了一个函数,函数功能是用正则来过滤php的一些函数和变量名称,而且还没有过滤全,system函数漏了呀(程序员出来挨打).
这个绕过方法就不用多讲了,直接以变量为函数名,将函数名的字符串拆开绕过
0x03
先将访问一个php文件然后Burp抓包,操作与上面目录遍历的方法相同,不过文件后缀要大写然后Base64编码修改后访问,然后写文件时进行函数名拆分赋给变量str3,最后以变量str3为函数名执行
最后访问文件地址
成功写入PHP文件并执行了我们的代码
结语
本人最近刚开始学代审,文章深度可能达不到各位表哥的水平,但是希望该文章能给与我一样刚接触代码审计的小白一个思路,同时也希望与云众的各位共同进步,感谢在我的学习之路上一直鼓励和帮助过我的表哥们。
0x01
在群里看到Ashe表哥放了几手0day,心里那个羡慕啊于是打算开始学代码审计逛CNVD的时候发现最近SDCMS的漏洞比较多,于是下手挖掘,找到了两个漏洞的位置,因为此源码一些关键的位置都混淆了,所以对我这个刚接触的憨憨有点难度,于是采用白盒加黑盒的方式进行审计。
注:以下漏洞非本人提交,CNVD已经收录,源码是8.27下载的,漏洞依然存在
0x02
我在官网下载最新的1.8源码进行搭建,其中PHP要开启Openssl扩展方法很简单,打开php.ini找到该行,将前面的分号去掉就可以了
搭建好源码,然后去后台看看功能,测试发现多处上传的位置都存在目录遍历
发现过程:
点击选择,进入后点击upfile文件夹,Burp开启
抓取到如下数据包:
分析该数据包,发现并未提交参数,而是GET直接访问路径,观察路径发现
dXBmaWxl.html为Base64编码地址+.html
猜想,如果为./是否会遍历web根目录下的文件
将数据包发送到Burp的重放模块,并修改参数./ -> Li8= 测试目录遍历成功
该目录遍历存在的地方比较多,有上传的地方基本就存在,但是很鸡肋,没有列出目录,于是继续挖掘,发现插件中有一处目录遍历可列出目录和文件
进入插件列表,找到附件管理
当点击管理的时候,进入后Burp开启,然后随意点击一个文件夹抓到数据包
观察发现与上面的情况相似,直接修改为当前目录,然后提交.
发现成功遍历了网站根目录
这一处比较鸡肋,下面分享代码执行
在系统管理处有一处模板管理可以修改PHP文件
到这可能大家以为,这直接可以Getshell了啊,当时我也这样想,后面发现,写入PHP代码后还会在前面加一段代码,导致了我们的代码执行不了,甚至连phpinfo函数都写入不了,黑盒测试了一下无果
前面说到该CMS的一些文件是混淆了的,后来发现有些文件没有混淆,于是查找存在漏洞的位置在app/admin/controller
目录下,发现大部分文件没有混淆加密,且可以通过文件名明白该文件实现的功能,如图:
而主题模板的功能文件在app/admin/controller/themecontroller.php
目录下,查找问题原因,定位到themecontroller.php文件的150
行
此处找到问题原因,如果路径中存在字符串.php则执行 if代码块的内容
if代码块的内容正是向文件中写入下面的代码:
<?php if(!defined('IN_SDCMS')) exit;?>
该代码导致了我们写入的代码无法执行,看到查找字符串的函数是strpos
学过PHP的朋友们应该知道strpos函数是对大小写敏感的,于是我们可以用.PHP的方法跳过该判断分支,前面我们还遇到一个问题就是phpinfo()函数写入时会报非法内容,原先的猜想是他有一个WAF会过滤,结果看到一个函数调用处理提交的数据,然后跟踪到该文件最后一行时震惊了
private function check_bad($str)
{
$num=preg_match_all("/(phpinfo|eval|if(!APP_DEMO)file_put_contents|file_get_contents|passthru|exec|chroot|scandir|proc_open|delfolder|un|mkdir|fopen|fread|fwrite|fputs|tmpfile|flock|chmod|delete|assert|_post|_get|_request|_file)/Ui",$str,$match);
return $num?$num:0;
}
他自己写了一个函数,函数功能是用正则来过滤php的一些函数和变量名称,而且还没有过滤全,system函数漏了呀(程序员出来挨打).
这个绕过方法就不用多讲了,直接以变量为函数名,将函数名的字符串拆开绕过
0x03
先将访问一个php文件然后Burp抓包,操作与上面目录遍历的方法相同,不过文件后缀要大写然后Base64编码修改后访问,然后写文件时进行函数名拆分赋给变量str3,最后以变量str3为函数名执行
最后访问文件地址
成功写入PHP文件并执行了我们的代码
结语
本人最近刚开始学代审,文章深度可能达不到各位表哥的水平,但是希望该文章能给与我一样刚接触代码审计的小白一个思路,同时也希望与云众的各位共同进步,感谢在我的学习之路上一直鼓励和帮助过我的表哥们。