工作笔记(一)

最近越来越懒,两个月没更新博客了,这篇文章就记录下最近碰到的(其实有一个月了……)三个安全问题吧。

 

慎用 trim

先上个实例,虽然这个漏洞还没完全公开,但影响不大,直接上 WooYun 的链接。

先看 system/Zend/Db/Adapter/Abstract.php 中的这一段,Zend Framework 自带的数据库语句过滤函数会转义特殊字符,并在字符串前后加上单引号。

return "'" . addcslashes($value, "\000\n\r\\'\"\032") . "'";

再看 /system/aws_model.inc.php 中的这一句,WeCenter 的使用这个函数时去掉了前面加入的单引号,但请注意 trimltrim rtrim 会去掉首尾的多个指定字符,而不是只去掉第一个,这在手册中没有提到。

return trim($this->db()->quote($string), "'");

所以,当一开始输入的字符串结尾带单引号时,如 123abc' 经过 _quote 函数过滤就变成了 '123abc\'',经过 trim 后就变成了 123abc\,再拼接一下就会导致此字符串后面的符号被转义,SQL 语句出错。

当遇到自己不熟悉的函数时,最好的办法是查手册,如果手册没有详细介绍,应该先实际测试一下,而不是想当然。

 

谨慎对待外来数据

现在的程序员大都已经意识到对外来数据的过滤了,但往往是在存数据库时才过滤,而在一些不需要存取数据库的页面(比如用户授权时的回调页面),往往把 $_GET 到的数据直接输出至当前网页。

这样做其实是很不安全的,因为攻击者可能使用短链引诱用户点击其生成的链接,而在 URL 中可能带有脚本,如果这些内容没有经过 HTML 转义就直接输出至网页,就会导致 XSS 攻击。

不过大部分现代浏览器都可以拦截这种攻击了。

所以应该谨慎对待外来数据,哪怕只是原样输出至当前网页。

 

<script src="value"> 的值可以为任意

前几天在看一个被入侵的网站的源码时,忽然发现一个很有趣的地方:

QQ20140624-1

QQ20140624-2

src 的地址看起来是个图片,在新标签页打开却不能正常显示,但把它下载到本地,用文本编辑器打开后发现其实是个 js 文件。虽然文件的扩展名是错的,但是浏览器还是能正确解析里面的脚本。