Wooyun-PHP代码审计小案例-2


阅读次数

BlueCMS v1.6 sp1 guest_book.php SQL注入漏洞

前言:

上一篇提到了Wooyun审计案例 - BlueCMS v1.6 sp1 ad_js.php SQL注入漏洞,由于下载了整套源码,所以找找其他的源码,不过网上有人好像发现了一个比较偏一些注入方式。
针对于 BlueCMS v1.6 sp1 guest_book.php SQL注入漏洞,找到了源码,结合着别人的思路静态审计+动态调试,给大家留下一些思经验。

Tip:getenv的忽略

注入点出现在comment.php页面,我们先看最前面一些参数和引入的文件:
Alt text
这里引入了/include/common.inc.php文件,里面有这样的一个处理
Alt text
跟进deep_addslashes()函数,发现是对函数deep_addslashes()的封装,通俗地讲就是转义了,防止恶意闭合拼接的SQL语句的注入攻击。
Alt text
这样其实就已经过滤了绝大多数的参数注入,但是还会有两种情况,第一种是上篇文章提到的SQL语句拼接的时候参数要用单引号包裹,如果没有包裹就做强制类型转换,第二种就是未被过滤的可控参数,详细代码如下:
Alt text
在这里我们关注两个SQL语句拼接的地方,第一个是
$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
这里可控的参数都已经被转义或者强制类型转换,但是有一个getip()函数,我们跟进后代码如下:
Alt text

提示:
getenv 取得系统的环境变量,环境变量的格式为name=value。
$_SERVER是服务器超级全局变量数组
二者的区别在于,getenv不支持IIS的isapi方式运行的PHP。

在这里我们可以看到所有的getenv()取到的参数都没有做处理,可以进行注入。
具体参考这篇文章:BlueCMS v1.6 sp1 ad_js.php SQL注入漏洞
不过不知道为什么我访问comment页面为空(有明白的大佬可以和我说一声)
Alt text
但是除了这里,我又找到了一处类似的地方,全文搜索getip()后如下:
Alt text
全文查找这个变量,在guest_book.php文件中看到了明显的拼接SQL语句
Alt text
打开页面,插入一个留言,不过竟然提示我“留言内容不能为空”,明明输入了内容,解决不了了,直接把判定content的语句干掉了,构造攻击数据包测试一下:
Alt text
由于$content是留言内容,是会显示到前端的,所以将数据库返回结果返回到这个参数显示出来,动态调试一下:
Alt text
执行成功后访问留言列表,发现已经成功显示SQL注入返回的结果:
Alt text
写个检测插件冷静一下:
防御意见:
使用deep_addslashes()函数过滤一下
PS:这里我想吐槽一下某个代码审计工具,对于getenv的参数都不跟踪。。