xhcms-v1.0 代码审计

首先,直接使用代码审计工具自动审计筛一下。

可以看到很多,大致分为SQL注入、任意文件读取、文件上传、变量覆盖,这里面应该有误报。

SQL注入

把SQL注入的筛一遍吧。都看看。

1、误报

/admin/files/adset.php

定位到这里,无非就是$ad1、$ad2、$ad3这三个参数,结合mysql_error()(返回上一个 MySQL 操作产生的文本错误信息),这里很可能有报错注入。但是$ad1、$ad2、$ad3被addslashes()函数转义==没搞,除非数据库和PHP的编码设置不同,那就能试一下宽字节注入。后面的误报就不仔细说了。

2、GET传参未过滤

/admin/files/editoolumn.php,/admin/files/editlink.php,/admin/files/editsoft.php,/admin/files/editwz.php

注意找对地方。

直接报错注入。先找到位置,手注测一下。报错注入不了解可以看下报错注入,简单来说搞定报错函数和concat()函数即可。

xhcms_v1.0/admin/?r=editcolumn&type=2&id=1'   #报错
xhcms_v1.0/admin/?r=editcolumn&type=2&id=1' and 1=1 -- a  #没报错,正常页面
xhcms_v1.0/admin/?r=editcolumn&type=2&id=1' and updatexml(1,concat(0x7e,(select user()),0x7e),1) -- a #报错显示~root@localhost~

确定存在SQL注入。接下来sqlmap跑一遍,发现sqlmap跑不出来,搜了一下需要替换sqlmap安装路径下的data\xml\payloads\error_based.xml中<vector>和<payload>标签内的内容。实在换不了就手注吧。

3、POST/GET传参未过滤,UPDATE注入

/admin/files/imageset.php,/admin/files/seniorset.php,/admin/files/reply.php

来看/admin/files/imageset.php,POST传参没做任何处理。

继续往下看。

很明显,$query这里可以利用。看一下这段sql语句是在干嘛,更新图片设置,UPDATE每个字段的值,每一字段都要有对应的值,因此注入点在$img_wzgd。payload与上面一致,报错注入。

202' and updatexml(1,(concat(0x7e,(select database()),0x7e)),1) -- a

同理/admin/files/seniorset.php。就这里而言就是找update最后一个字段作为注入点。

补充:install/index.php应该也存在同样问题。$user是注入点。(这里偷懒没测试)

4、UPDATE注入结合无单引号绕过addslashes函数

/files/content.php,/files/software.php,/files/download.php

拿/files/content.php来说,定位到19行。

虽然$id会被addslashes函数处理,但是注意$query中$id的位置,只要SQL语句中传参无单引号闭合即可绕过。

?r=content&cid=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)

验证的确存在后,sqlmap跑即可。

sqlmap.py -u "xx" -D xhcms --tables --batch

5、GET传参未过滤,DELETE注入

./admin/files/softlist.php,/admin/files/wzlist.php

以./admin/files/softlist.php为例,定位到第7-9行,对GET传参未作处理。

?r=softlist&delete=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- a

任意文件读取漏洞

/files/downloads.php

首先定位到100行
//打开文件  
$fp = fopen("$sourceFile", "rb");
​
往上找$sourceFile到32行
$sourceFile = $fileadd; //要下载的临时文件名  
​
接下来找$fileadd
$fileadd=$down['softadd'];
​
继续往上
$down= mysql_fetch_array($result);
最终定位到cid
$fileid=addslashes($_GET['cid']);

由此得知,最终读取的文件取决于softadd的值。因此如果softadd是一个敏感文件的地址,我们就能在前台将敏感文件下载。接下来测试是否可行。

找到这段功能对应前台的下载中心和后台的下载列表。首先,后台下载列表中新建一个下载,softadd栏的内容为网站主机敏感文件地址。

前台下载即可。

文件包含

自动审计的项都排查完了,接下来就排查一些可能性。首先文件包含,全局搜索一些文件包含常用函数如:include。

很明显,/index.php,/admin/index.php可以利用,看下代码。

传入参数r只要不为空就将值赋给$action,紧接着就载入files/$action.php文件。这里属于本地文件包含。

复现一下。在/files目录下放一个shell.php文件,内容为phpinfo()。

XSS

反射型

/admin/files/wzlist.php,/files/contact.php,后台很多,输入框都可以试一下。

先来看/admin/files/wzlist.php为例。

直接试。

/files/contact.php可以看到,修改Cookie头也可以达到xss效果。

name,mail,url随便试一个。例如name=123"><img src=0 onerror=alert(1)>

存储型

/admin/files/wzlist.php

表单中标题、作者、关键字、描述的输入框都存在存储型XSS。但是仅有标题和作者的值能回显在前台,标题的值还能回显在后台,因此只有这两个输入框可利用。

/admin/files/manageinfo

名称输入框存在存储型XSS。

后台登陆处逻辑漏洞——越权

首先正常流程对登录页面进行渗透,爆破什么的,尝试无过后考虑逻辑漏洞。正常登录后,发现Cookie提交了一个键值对user=admin。没头绪就代码审计。

定位到login.php,从源码分析。验证过用户名密码都正确后,setcookie,跳转到后台首页/admin/files/index.php。

/admin/files/index.php,很常见的处理,验证登录。

定位到checklogin.php。代码如下:

可以看到这里的验证方式是通过检验Cookie中user的值来判断是否为登录状态的。那么在向后台首页发起请求时带一个cookie即可实现跳过登录进入后台。复现一下。

修改Cookie。访问后台地址。

成功绕过登录进入后台实现越权。

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值