首先,直接使用代码审计工具自动审计筛一下。
可以看到很多,大致分为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。访问后台地址。
成功绕过登录进入后台实现越权。