滥用include

  1.漏洞原因:

  Include是编写PHP网站中最常用的函数,并且支持相对路径。有很多PHP脚本直接把某输入变量作为Include的参数,造成任意引用脚本、绝对路径泄露等漏洞。看以下代码:

... 
$includepage=$_GET["includepage"]; 
include($includepage); 
...

  很明显,我们只需要提交不同的Includepage变量就可以获得想要的页面。如果提交一个不存在的页面,就可以使PHP脚本发生错误而泄露实际绝对路径(这个问题的解决办法在下面的文章有说明)。

  2.漏洞解决:

  这个漏洞的解决很简单,就是先判断页面是否存在再进行Include。或者更严格地,使用数组对可Include的文件作出规定。看以下代码:

$pagelist=array("test1.php","test2.php","test3.php");
//这里规定可进行include的文件 
if(isset($_GET["includepage"]))
//判断是否有$includepage 

 $includepage=$_GET["includepage"]; 
 foreach($pagelist as $prepage) 
 { 
  if($includepage==$prepage) //检查文件是否在允许列表中 
  { 
   include($prepage); 
   $checkfind=true; 
   break; 
  } 
 } 
 if($checkfind==true){ unset($checkfind); } 
 else{ die("无效引用页!"); } 
}

  这样就可以很好地解决问题了。

  小提示:有此问题的函数还有:require(),require_once(),include_once(),readfile()等,在编写的时候也要注意。

  未对输入变量进行过滤 

  1.漏洞原因:

  这个漏洞早在ASP中出现过,当时造成的注入漏洞不计其数。但由于PHP在当时的影响力较小,所以没有太多的人能够注意这点。对于PHP来说,这个漏洞的影响性比ASP更大,因为有比较多的PHP脚本使用到文本型数据库。当然也存在SQL语句的注入问题。举个比较经典的例子,首先是数据库的:

$id=$_GET["id"];

$query="SELECT * FROM my_table where id='".$id."'";
//很经典的SQL注入漏洞 
$result=mysql_query($query);

  这里很明显我们可以用注入来获得数据库的其它内容了。这里就不再详细叙述,和ASP注入一样的,大家可以看看以前的黑防。然后我们看文本数据库的问题:

$text1=$_POST["text1"]; 
$text2=$_POST["text2"]; 
$text3=$_POST["text3"];

$fd=fopen("test.php","a"); 
fwrite($fd,"\r\n$text1&line;$text2&line;$text3");

fclose($fd);

  文本的漏洞可以说是更加严重。倘若我们的提交的变量中插入一段很小的PHP代码,就可以另这个文本数据库test.php变成PHP后门。甚至插入上传代码,让我们可以上传一个完善的PHP后门。接着提升权限,服务器就是你的了。

  2.漏洞解决:

  这个漏洞的解决方法其实很简单,就是严格对全部提交的变量进行过滤。对一些敏感的字符进行替换。我们可以借助PHP提供的htmlspecialchars()函数来替换HTML的内容。这里给出一段例子:

//构造过滤函数 
function flt_tags($text) 

 $badwords=array("***","fuck"); //词汇过滤列表 
 $text=rtrim($text); 
 foreach($badwords as $badword) //这里进行词汇的过滤 
 { 
  if(stristr($text,$badword)==true){
die("错误:你提交的内容含有敏感字眼,请不要提交敏感内容。"); } 
 } 
 $text=htmlspecialchars($text); //HTML替换 
 //这两行把回车替换为

 $text=str_replace("\r"," ",$text); 
 $text=str_replace("\n","",$text); 
 $text=str_replace("&line;","│",$text);
//文本数据库分隔符"&line;"替换为全角的"│" 
 $text=preg_replace("/\s{ 2 }/"," ",$text);
//空格替换 
 $text=preg_replace("/\t/"," ",$text);
//还是空格替换 
 if(get_magic_quotes_gpc()){ $text=stripslashes($text); }
//如果magic_quotes开启,则进行\'的替换 
 return $text; 
}

$text1=$_POST["text1"]; 
$text2=$_POST["text2"]; 
$text3=$_POST["text3"];

//过滤全部输入 
$text1=flt_tags($text1); 
$text2=flt_tags($text2); 
$text3=flt_tags($text3);

$fd=fopen("test.php","a"); 
fwrite($fd,"\r\n$text1&line;$text2&line;$text3");

fclose($fd);

  经过一番替换和过滤后,你就可以安全地把数据写入文本或数据库了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

PHP程序漏洞产生的原因和防范方法的更多相关文章

  1. 高级PHP应用程序漏洞审核技术

    前言 PHP是一种被广泛使用的脚本语言,尤其适合于web开发.具有跨平台,容易学习,功能强大等特点,据统计全世界有超过34%的网站有php的应 用,包括Yahoo.sina.163.sohu等大型门户 ...

  2. CVE-2015-7547漏洞分析从原因到利用到补丁(非常适合小白)【转】

    本文转载自:http://blog.csdn.net/u012406115/article/details/72232535 一.         漏洞概述 CVE漏洞链接:http://www.cv ...

  3. iOS程序闪退的原因以及处理办法

    iOS程序闪退是一种比较常见的现象.闪退的情况很多,造成程序闪退的原因也很多. ================================启动时闪退======================= ...

  4. 在Linux下,如何分析一个程序达到性能瓶颈的原因

    0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...

  5. VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误

    1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...

  6. IIS短文件名泄露漏洞危害及防范方法(转)

    攻击方法(转自http://blog.sina.com.cn/s/blog_64a3795a01017xqt.html) 一直在寻找一种方法,如果我可以使用通配符"*" 和 &qu ...

  7. 应用程序无法正常启动提示错误0xc000007b 问题的原因和解决方法

    应用程序无法正常启动提示错误0xc000007b 问题的原因和解决方法 前提条件: 你使用的是VS201x软件编写程序,你使用的电脑是X64位的,并且你在使用OpenCV库.你编写的程序可以正常编译, ...

  8. qt 旧项目编译运行提示 “启动程序失败,路径或者权限错误?” 原因及解决方法

    qt 旧项目编译运行提示 "启动程序失败,路径或者权限错误?" 原因及解决方法 原因 Qt Creator在打开项目文件的同时会生成.pro.user文件,.pro.user文件叫 ...

  9. 最常见的安全漏洞– Acunetix Web应用程序漏洞报告2021

    每年,Acunetix都会为您提供最常见的Web安全漏洞和网络外围漏洞的分析.我们的年度Web应用程序漏洞报告(现已成为Invicti AppSec指标的一部分)是基于从Acunetix在线获得的真实 ...

随机推荐

  1. Android软件开发之发送短信与系统短信库解析

    今天我和同学们讨论一下Android平台下如何调用系统方法发送短信.接收短信.系统的短信库相关的问题.进入正题,我们先使用Eclipse工具模拟给自己的模拟器发送一条短信.在Eclipse下打开DDM ...

  2. java常量使用比较好的方法

    1.首先建立一个工具类 public class AppConst { private static Map<String,String> map=new HashMap<Strin ...

  3. How to hide TabPage from TabControl

    No, this doesn't exist. You have to remove the tab and re-add it when you want it. Or use a differen ...

  4. Learning WCF Chapter2 WCF Contracts and Serialization

    So far I’ve talked about the standards behind it all,but in fact WCF hides most of this from the dev ...

  5. JSONP跨域的原理解析(转)

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略). ...

  6. 基础算法(二分,贪心):NOIP 2012 疫情控制

    题目大意 给出一棵n个节点的树,根是1,要在除根节点以外的点建立检查点,使得从每条根到叶子的路径上都至少存在一个检查点.检查点由军队来建立.初始军队的位置是给定的,移动军队走一条边需要花费这条边的权值 ...

  7. 很反感Java Web 三层框架

    为什么反感,大家 看图就知道了.一层一层的框架叠加,要达到精通就要一个一个框架的去深入了解,谁有这个精力?PHP没有这么多框架,为何依然能开发大型网站呢? 不过此图的原文却在推销使用Java,原文点此 ...

  8. Bzoj 3173: [Tjoi2013]最长上升子序列 平衡树,Treap,二分,树的序遍历

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1183  Solved: 610[Submit][St ...

  9. linux 多线程基础2

    6. 名称:: pthread_detach 功能: 使线程进入分离状态. 头文件: #include <pthread.h> 函数原形: int pthread_detach(pthre ...

  10. Implement the hash table using array / binary search tree

    今天在复习Arrays and String 时看到一个很有趣的问题.希望跟大家分享一下. Implement the hash table using array / binary search t ...