您好,欢迎访问一九零五行业门户网

PHP在安全方面的另类应用

安全
 1.远程文件
php是一门具有丰富特性的语言,它提供了大量函数,使程序员能够方便地实现各种功能,远程文件就是一个很好的例子:
代码
以上是一段利用fopen函数打开文件的代码,由于fopen函数支持远程文件,使得它应用起来相当有趣,将以上代码保存为proxy.php,然后后提交:
代码
/proxy.php?url=http://www.hacker.com.cn/bbs
这时候你会发现论坛下方显示的ip地址变成了php脚本所处服务器的ip地址。fopen函数可以从任何其web或ftp站点读取文件,事实上php的大多数文件处理函数对远程文件都是透明的,比如请求:
代码
/proxy.php?url=http://target/script/..%c1%1c../winnt/system32/cmd.exe?/c+dir
这样实际上是利用了target主机上的unicode漏洞,执行了dir命令。但并不是所有的服务器都支持远程文件的功能,如果你使用的是商业的服务器,很可能会发现远程文件使用不了(如51的虚拟主机),这是因为在商业主机上限制远程文件的功能,往往能够更好的保护服务器的正常运行。你可以通过phpinfo()查看服务器是否支持这种功能。当然,在phpinfo()被禁用的情况下,也可以使用get_cfg_var():
代码
当allow_url_fopen一项参数为on时,即支持远程文件的功能。充分发挥远程文件的特性,我们可以实现许多特殊的功能:如果你是用过php flame的最新版本,你会发现它在集文件夹复制、文本搜索等功能的基础上,又增加了web间文件传输的功能,依靠这种功能,你可以随意将其他服务器上的文件传送到你的web目录下。而且,在两台服务器间传送文件有着飞快的传输速度。我们看看实现这个功能的代码:
代码
在调用fopen和fwrite函数时加入b标记,可以使这两个函数安全运用于二进制文件而不损坏数据。在以上脚本提交:
/down.php?filename=http://www.chinaz.com/winrar.zip
这时便会在down.php的所处目录下生成相应的winrar.zip文件。如果再配合遍历目录的功能,你将可以实现多个文件夹服务器间的传输。但是,远程文件应该还有更大的发挥空间,比如写sql injection攻击的自动脚本,甚至是http的代理服务:
代码
$url = getenv(query_string);
if(!ereg(^http,$url)) //检查输入的url格式
{
echo 例子:
http://www.163.com/
;
echo http://www.xxxx.com/list.php?id=600
;
echo 当url为目录时需要在目录后加入/;
exit;
}
if($url)
$url=str_replace(\\,/,$url);
$f=@fopen($url,r); //打开文件
$a=;
if($f)
{
while(!feof($f))
$a.=@fread($f,8000); //读取文件
fclose($f);
}
$rooturl = preg_replace(/(.+\/)(.*)/i,\\1,$url); //转换根目录
$a = preg_replace(/(src[[:space:]]*=['\])([^h].*?)/is,\\1$rooturl\\2,$a);
$a = preg_replace(/(src[[:space:]]*=)([^h'\].*?)/is,\\1$rooturl\\2,$a); //转换图片地址
$a = preg_replace(/(action[[:space:]]*=['\])([^h].*?)/is,\\1$php_self?$rooturl\\2,$a);
$a = preg_replace(/(action[[:space:]]*=)([^h'\].*?)/is,\\1$php_self?$rooturl\\2,$a); //转换post地址
$a = preg_replace(/($a = preg_replace(/($a = preg_replace(/(link.+?href[[:space:]]*=[^'\])(.*?)/is,\\1$rooturl\\2,$a);
$a = preg_replace(/(link.+?href[[:space:]]*=['\])(.*?)/is,\\1$rooturl\\2,$a); //转换样式表地址
echo $a;
exit;
?>
在正则表达式的帮助下,以上代码能够自行地将返回页面中包含的链接和图片进行转换,并把页面内的链接自动提交到当前php脚本的$url中。例如提交:
/proxy.php?http://www.xfocus.net/
脚本将会返回http://www.xfocus.net/的内容。
当然,这运用的绝对不仅仅是框架的技巧。运用这个脚本你可以远程操作安置在其他服务器的web后门,或者将肉鸡做成一个简单的http代理,从而更好的隐藏自己的ip。如果使用php编写cgi扫描工具,你需要延长php的有效运行时间。以下是两种有效的方法,当然你也可以将php代码编译成gui界面,从而解决这个问题。设置php的有效运行时间为三分钟:
代码
ini_set(max_execution_time,60*3); ?>
set_time_limit(60*3); ?>
我们再看看这种功能在ddos攻击中的应用:
代码
以上用for循环不断地请求userlist.php?userid=$i的内容($i的值每次都是不同的),但是打开后仅仅取出几个字节便关闭这个脚本了。php运行在虚拟主机上,10秒钟便可以打开几十个url,当同时运行多个进程时,便有可能实现ddos攻击,让对方的论坛迅速崩溃。
限于版面,远程文件的内容就先说到这里了,如果你还有不明白的地方,请参考以下的这篇文章:《在php中使用远程文件》
2.错误回显
php在默认的情况下打开错误回显,这样可以便于程序员在调试脚本时发现代码的错误,但是这也往往使web暴露了php的代码和服务器的一些数据。php对代码的规范性要求比较严格,以下是一种比较常见的错误回显:
warning:file(data/1120\'.htm)-no such file or
directory in /usr/home/xxxxx.com/show.php on line 300
这种错误回显,至少告诉了我们三个信息:服务器的操作系统是linux;服务器使用文本数据库;show.php的第300行代码为file (./data/1120/.$data..htm)。
这种错误回显,已经足以成为一台服务器致命的漏洞。从另一个利用的角度来看,我们发现一般的php错误回都包含了warning字符,但是这有什么用呢?我们得先认识一下php的库文件。
php的include()和require()主要是为了支持代码库,因为我们一般是把一些经常使用的函数放到一个独立的文件中,这个独立的文件就是代码库,当需要使用其中的函数时,我们只要把这个代码库包含到当前的文件中就可以了。
最初,人们开发和发布php程序的时候,为了区别代码库和主程序代码,一般是为代码库文件设置一个.inc的扩展名,但是他们很快发现这是一个错误,因为这样的文件无法被php解释器正确解析为php代码。如果我们直接请求服务器上的这种文件时,我们就会得到该文件的源代码,这是因为当把php作为apache的模块使用时,php解释器是根据文件的扩展名来决定是否解析为php代码的。扩展名是站点管理员指定的,一般是.php, .php3和.php4。如果重要的配置数据被包含在没有合适的扩展名的php文件中,那么远程攻击者将容易得到这些信息。
按照以往的程序员的习惯,往往会把一些重要的文件设定config.inc,coon.inc等形式,如果我们在搜索引撃中搜索warning+config.inc,那么你会发现许多网站都暴露了.inc文件的代码,甚至包括许多商业和政府网站。
要关闭php的错误回显通常有两个方法,第一个是直接修改php.ini中的设置,这我们以前已经介绍过了;第二种方法是在php脚本中加入抑制错误回显的代码,你可以在调用的函数前函数加入@字符,或者在php的代码顶端加入error_reporting(0);的代码,要了解更多的内容请参考php手册中的error_reporting一节。
3.变量回显
wen的安全问题主要集中变量的处理上,对变量的处理不当,会导致多种安全问题。先看一下的例子:
代码
1.gif
2.gif
其它类似信息

推荐信息