重燃您的PHP安全之火
2008-02-23 08:21:13来源:互联网 阅读 ()
关于脚本安全这个话题似乎永远没完没了,假如您经常到外国的各种各样的bugtraq上,您会发现有一半以上都和脚本相关,诸如SQL injection,XSS,Path Disclosure,Remote commands execution这样的字眼比比皆是,我们看了之后的用途难道仅仅是抓肉鸡?对于我们想做web安全的人来说,最好就是拿来学习,可是万物抓根源,我们要的不是鱼而是渔。在国内,各种各样的php程式1.0版,2.0版像雨后春笋相同的冒出来,可是,大家关注的都是一些著名的cms,论坛,blog程式,很少的人在对那些不出名的程式做安全检测,对于越来越多的php程式员和站长来说,除了依靠服务器的堡垒配置外,php程式本身的安全多少您总得懂点吧。
有人说您们做php安全无非就是搞搞注入和跨站什么什么的,大错特错,假如这样的话,一个magic_quotes_gpc或服务器里的一些安全配置就让我们全没活路了。我今天要说的不是注入,不是跨站,而是存在于php程式中的一些安全细节问题。OK!切入正题。
注意一些函数的过滤
有些函数在程式中是经常使用的,像include(),require(),fopen(),fwrite(),readfile(),unlink(),eval()连同他们的变体函数等等。这些函数都很实用,实用并不代表让您多省心,您还得为他们多费点心。
1、include(),require()和fopen(),include_once(),require_once()这些都能够远程调用文档,对于他们的危害,google搜一下您就会很明了,对于所包含调用的变量没过滤好,就能够任意包含文档从而去执行。举个例子,看print.php
... if (empty ($bn) ) { //检查是变量$bn是否为空 include ("$cfg_dir/site_${site}.php"); //把$cfg_dir这个路径里的site_${site}.php包含进来 ... |
不管存不存在$cfg_dir目录,$site这个变量您能够很自然的去使用,因为他根本没检查$site变量啊。能够把变量$site指定远程文档http://evil.com/cmd.gif去调用,也能够是本地的一个文档,您所指定的文档里写上php的语句,然后他就去包含执行这个含有php语句的文档了。
列出文档目录
甚至能够扩展到包含一些管理员文档,提升权限,典型的像以前phpwind,bo-blog的漏洞相同。除了依靠php.ini里的allow_url_fopen设为off禁止远程使用文档和open_base_dir禁止使用目录以外的文档外,您还得事先声明好只能包含哪些文档,这里就不多说废话了。
2、fopen(),file(),readfile(),openfile(),等也是该特别留意的地方。函数本身并没什么,他们的作用是去打开文档,可是假如对变量过滤不完全的话,就会泄露源代码。这样的函数文本论坛里会有很多。
... $articlearray=openfile("$dbpath/$fid/$tid.php"); //打开$dbpath/$fid这个路径的$tid.php文档 $topic_detail=explode("|",$articlearray[0]); //用分割符|读出帖子的内容 ... |
很眼熟吧,这是ofstar以前版本的read.php,$fid和$tid没有任何过滤,$tid指定为某个文档提交,就发生了原代码泄露。
http://explame.com/ofstar/read.php?fid=123&tid=../index
$tid会被加上php的后缀,所以直接写index。这仅仅是个例子,接着看吧。
3、fwrite()和他的变体函数这种漏洞想想都想得出,对于用户提交的字符没过滤的话,写入一段php后门又不是不能够。
4、unlink()函数,前段时间,phpwind里任意删除文档就是利用这个函数,对于判断是否删除的变量没过滤,变量能够指定为任意文档,当然就能够删除任意文档的变量。
5、eval(),preg_replace()函数,他们的作用是执行php代码,假如字符串没被经过任何过滤的话,会发生什么呢,我就常看见一些cms里面使用,想想,一句话的php木马不就是根据eval()原理制作的吗?
6、对于system()这些系统函数,您会说在php.ini里禁止系统函数,对,这也是好办法,可是象一些程式里需要,那是不是就不用了呢?就像上次我看到的一套很漂亮的php相册相同。另外对于popen(),proc_open(),proc_close()函数您也得特别注意,尽管他们执行命令后并没有直接的输出,但您想这到底对黑客们有没有用呢。再这里php提供提供了两个函数,escapeshellarg(),escapeshellcmd(),这两个函数用来对抗系统函数的调用攻击,也就是过滤。
对于危害,来举个例子,我们来看某论坛prod.php
07 $doubleApp = isset($argv[1]); //初始化变量$doubleApp ... 14 if( $doubleApp ) //if语句 15 { 16 $appDir = $argv[1]; //初始化$appDir 17 system("mkdir $prodDir/$appDir"); //使用系统函数system来创建目录$prodDir/$appDir |
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 配置让服务器能够支持shtml文档
下一篇: 优化Apache服务器的重负荷
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
