1. Finecms SQL注入漏洞初探第一次听说Finecms这个漏洞时我正在给客户做安全审计。当时发现他们的网站后台有个奇怪的请求点进去一看好家伙这不就是典型的SQL注入吗Finecms 5.2.0版本的这个漏洞说穿了就是系统对用户输入太信任了。这个漏洞出在controllers/member/Api.php文件里系统在处理checktitle参数时直接把用户输入的内容拼接到SQL语句中执行。这就好比把家门钥匙交给陌生人还告诉他保险柜密码写在门背后。攻击者只需要构造特殊的URL就能让数据库乖乖执行任意SQL命令。我实测过一个案例攻击者通过注入点直接读取了管理员表获取了所有用户的邮箱和加密密码。虽然密码是加密的但很多用户在不同网站使用相同密码这就相当于给攻击者开了后门。更可怕的是有些攻击者会利用这个漏洞在数据库里插入恶意代码把正常网站变成肉鸡。2. 漏洞技术原理拆解2.1 漏洞触发点分析让我们仔细看看这个漏洞是怎么工作的。在Finecms 5.2.0中当用户访问/index.php?smembercapimchecktitle这个接口时系统会处理三个关键参数id、title和module。问题出在代码没有对这些参数做任何过滤处理直接拼接到SQL查询语句中。举个例子正常请求可能是这样的/index.php?smembercapimchecktitleid1title测试文章modulenews但攻击者会把title参数改成这样title1,(select (updatexml(1,concat(1,(select user()),0x7e),1)))a这个看似普通的字符串实际上是个特洛伊木马。updatexml是MySQL的一个函数当第二个参数格式错误时它会返回错误信息——而这个错误信息里就包含了我们想要的数据。concat函数把查询结果拼接进去0x7e是波浪号(~)的十六进制表示用来标记数据边界。2.2 漏洞利用的多种姿势这个漏洞的利用方式可不止一种。除了上面说的报错注入攻击者还可以盲注攻击通过判断页面返回结果的真假一点点猜出数据库内容联合查询注入使用UNION SELECT直接获取其他表的数据时间盲注通过sleep函数让数据库延迟响应根据响应时间判断条件真假我见过最狡猾的攻击是这样构造的title1 AND (SELECT * FROM (SELECT(SLEEP(5)))a)如果页面响应花了5秒以上攻击者就知道注入成功了。这种攻击更难被传统的WAF检测到。3. 漏洞危害全景图3.1 直接危害这个漏洞最直接的危害就是数据泄露。攻击者可以获取管理员账号密码虽然加密了但可以暴力破解读取用户敏感信息手机号、地址、身份证号等查看网站配置信息数据库连接字符串、API密钥等去年有个客户就中招了攻击者通过注入漏洞拿到了数据库备份文件的路径然后直接下载了整个数据库。最后不得不花钱请我们做数据泄露的善后工作。3.2 间接危害更可怕的是间接危害攻击者可以篡改网站内容插入赌博、色情链接植入后门程序变成僵尸网络的一部分发起横向攻击以该服务器为跳板攻击内网有个真实案例攻击者利用SQL注入漏洞在数据库里插入了一段JavaScript代码所有访问网站的用户都会被重定向到钓鱼页面。这种水坑攻击持续了半个月才被发现。4. 漏洞防御实战指南4.1 紧急修复方案如果你正在使用Finecms 5.2.0我建议立即做三件事升级到最新版本官方已经修复了这个漏洞临时补丁修改Api.php在参数使用前添加过滤$title $this-input-get(title, true); $title $this-db-escape_str($title);数据库权限控制确保应用数据库账号只有必要权限4.2 长期防御策略要从根本上防御SQL注入我总结了三板斧参数化查询使用预处理语句这是最有效的防御手段$stmt $db-prepare(SELECT * FROM news WHERE title ?); $stmt-bind_param(s, $title);输入验证白名单验证比黑名单更可靠if (!preg_match(/^[a-zA-Z0-9_\x{4e00}-\x{9fa5}]$/u, $title)) { die(非法输入); }最小权限原则数据库账号只给必要权限4.3 监控与应急即使修复了漏洞也要做好监控部署WAF拦截注入攻击监控数据库异常查询定期做安全扫描我在客户那边部署的监控系统曾经抓到过这样的攻击攻击者每5分钟尝试一次注入持续了3天。幸好有监控我们及时阻断了攻击。5. 从漏洞看安全开发这个漏洞反映出一个常见问题开发者对用户输入过度信任。在安全开发中有几点特别重要安全意识培训让每个开发者都了解OWASP Top 10代码审计上线前必须做安全审计安全框架使用成熟的框架而不是自己造轮子我团队有个规矩所有涉及数据库操作的代码必须经过两个人review。虽然效率低了点但确实避免了很多安全问题。6. 漏洞复现实验如果你想自己测试这个漏洞当然要在授权环境下可以这样操作搭建Finecms 5.2.0测试环境访问以下URL观察响应curl http://test.site/index.php?smembercapimchecktitleid1title1modulenews,(select%20(updatexml(1,concat(1,(select%20user()),0x7e),1)))a在错误信息中查找数据库用户信息注意这个实验仅用于学习目的未经授权测试他人系统是违法的。我建议使用DVWA或WebGoat这类专门的练习环境。7. 相关工具推荐在排查这类漏洞时我常用这些工具sqlmap自动化检测SQL注入Burp Suite拦截和修改请求OWASP ZAP综合安全测试工具但工具不是万能的。有次我用sqlmap扫描没发现问题但手工测试时发现了一个隐蔽的盲注漏洞。所以安全测试一定要工具人工结合。
Finecms SQL注入漏洞 (CVE-2018-6893) 深度解析与防御实践
1. Finecms SQL注入漏洞初探第一次听说Finecms这个漏洞时我正在给客户做安全审计。当时发现他们的网站后台有个奇怪的请求点进去一看好家伙这不就是典型的SQL注入吗Finecms 5.2.0版本的这个漏洞说穿了就是系统对用户输入太信任了。这个漏洞出在controllers/member/Api.php文件里系统在处理checktitle参数时直接把用户输入的内容拼接到SQL语句中执行。这就好比把家门钥匙交给陌生人还告诉他保险柜密码写在门背后。攻击者只需要构造特殊的URL就能让数据库乖乖执行任意SQL命令。我实测过一个案例攻击者通过注入点直接读取了管理员表获取了所有用户的邮箱和加密密码。虽然密码是加密的但很多用户在不同网站使用相同密码这就相当于给攻击者开了后门。更可怕的是有些攻击者会利用这个漏洞在数据库里插入恶意代码把正常网站变成肉鸡。2. 漏洞技术原理拆解2.1 漏洞触发点分析让我们仔细看看这个漏洞是怎么工作的。在Finecms 5.2.0中当用户访问/index.php?smembercapimchecktitle这个接口时系统会处理三个关键参数id、title和module。问题出在代码没有对这些参数做任何过滤处理直接拼接到SQL查询语句中。举个例子正常请求可能是这样的/index.php?smembercapimchecktitleid1title测试文章modulenews但攻击者会把title参数改成这样title1,(select (updatexml(1,concat(1,(select user()),0x7e),1)))a这个看似普通的字符串实际上是个特洛伊木马。updatexml是MySQL的一个函数当第二个参数格式错误时它会返回错误信息——而这个错误信息里就包含了我们想要的数据。concat函数把查询结果拼接进去0x7e是波浪号(~)的十六进制表示用来标记数据边界。2.2 漏洞利用的多种姿势这个漏洞的利用方式可不止一种。除了上面说的报错注入攻击者还可以盲注攻击通过判断页面返回结果的真假一点点猜出数据库内容联合查询注入使用UNION SELECT直接获取其他表的数据时间盲注通过sleep函数让数据库延迟响应根据响应时间判断条件真假我见过最狡猾的攻击是这样构造的title1 AND (SELECT * FROM (SELECT(SLEEP(5)))a)如果页面响应花了5秒以上攻击者就知道注入成功了。这种攻击更难被传统的WAF检测到。3. 漏洞危害全景图3.1 直接危害这个漏洞最直接的危害就是数据泄露。攻击者可以获取管理员账号密码虽然加密了但可以暴力破解读取用户敏感信息手机号、地址、身份证号等查看网站配置信息数据库连接字符串、API密钥等去年有个客户就中招了攻击者通过注入漏洞拿到了数据库备份文件的路径然后直接下载了整个数据库。最后不得不花钱请我们做数据泄露的善后工作。3.2 间接危害更可怕的是间接危害攻击者可以篡改网站内容插入赌博、色情链接植入后门程序变成僵尸网络的一部分发起横向攻击以该服务器为跳板攻击内网有个真实案例攻击者利用SQL注入漏洞在数据库里插入了一段JavaScript代码所有访问网站的用户都会被重定向到钓鱼页面。这种水坑攻击持续了半个月才被发现。4. 漏洞防御实战指南4.1 紧急修复方案如果你正在使用Finecms 5.2.0我建议立即做三件事升级到最新版本官方已经修复了这个漏洞临时补丁修改Api.php在参数使用前添加过滤$title $this-input-get(title, true); $title $this-db-escape_str($title);数据库权限控制确保应用数据库账号只有必要权限4.2 长期防御策略要从根本上防御SQL注入我总结了三板斧参数化查询使用预处理语句这是最有效的防御手段$stmt $db-prepare(SELECT * FROM news WHERE title ?); $stmt-bind_param(s, $title);输入验证白名单验证比黑名单更可靠if (!preg_match(/^[a-zA-Z0-9_\x{4e00}-\x{9fa5}]$/u, $title)) { die(非法输入); }最小权限原则数据库账号只给必要权限4.3 监控与应急即使修复了漏洞也要做好监控部署WAF拦截注入攻击监控数据库异常查询定期做安全扫描我在客户那边部署的监控系统曾经抓到过这样的攻击攻击者每5分钟尝试一次注入持续了3天。幸好有监控我们及时阻断了攻击。5. 从漏洞看安全开发这个漏洞反映出一个常见问题开发者对用户输入过度信任。在安全开发中有几点特别重要安全意识培训让每个开发者都了解OWASP Top 10代码审计上线前必须做安全审计安全框架使用成熟的框架而不是自己造轮子我团队有个规矩所有涉及数据库操作的代码必须经过两个人review。虽然效率低了点但确实避免了很多安全问题。6. 漏洞复现实验如果你想自己测试这个漏洞当然要在授权环境下可以这样操作搭建Finecms 5.2.0测试环境访问以下URL观察响应curl http://test.site/index.php?smembercapimchecktitleid1title1modulenews,(select%20(updatexml(1,concat(1,(select%20user()),0x7e),1)))a在错误信息中查找数据库用户信息注意这个实验仅用于学习目的未经授权测试他人系统是违法的。我建议使用DVWA或WebGoat这类专门的练习环境。7. 相关工具推荐在排查这类漏洞时我常用这些工具sqlmap自动化检测SQL注入Burp Suite拦截和修改请求OWASP ZAP综合安全测试工具但工具不是万能的。有次我用sqlmap扫描没发现问题但手工测试时发现了一个隐蔽的盲注漏洞。所以安全测试一定要工具人工结合。