1

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

 7 months ago
source link: https://jianmou.github.io/jm-wooyun-php-code-audit-2/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 textAlt text
这里引入了/include/common.inc.php文件,里面有这样的一个处理
Alt textAlt text
跟进deep_addslashes()函数,发现是对函数deep_addslashes()的封装,通俗地讲就是转义了,防止恶意闭合拼接的SQL语句的注入攻击。
Alt textAlt text
这样其实就已经过滤了绝大多数的参数注入,但是还会有两种情况,第一种是上篇文章提到的SQL语句拼接的时候参数要用单引号包裹,如果没有包裹就做强制类型转换,第二种就是未被过滤的可控参数,详细代码如下:
Alt textAlt 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 textAlt text

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK