xhcms代码审计
环境搭建
xhcms环境部署
下载xhcms压缩包并解压到网站目录
在phpstudy中添加xhcms网站并启用,并停用其他网站

勾选管理->php扩展->php_xdebug,并重启apache
打开mysql文件位置下的bin文件夹,并开启当前位置打开cmd,输入mysql -u root -p连接mysql

创建数据库xhcms
打开网页访问,url后添加install目录,访问安装页面

Phpstorm调试环境配置
点击左上角文件然后配置php可执行文件目录
打开网站目录文件,并且点击编辑配置->编辑配置模板,选择php网页,配置服务器和浏览器
点开index.php并打上断点,点击调试

seay源代码审计
adset.php的ad1参数经过addslashes()转义,网站本身也没有宽字节,所有没有SQL注入
垂直越权登录后台
后台文件包含了checklogin,疑似是检查登录,跟进
通过一个简单的判断,判断cookie中的user字段是否为空,如果为空,则重定向到登录界面
访问http://
成功登录到后台
此时我们进行操作还是会验证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 | <!DOCTYPE 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 | <html> |
打开一台虚拟机,开启WEB服务,将生成的PoC放在里面,这里我临时使用VPS创建文件
然后使用另一个浏览器登录其他管理员,访问此PoC
回到管理员后台发现id为3的已经成功被删除