pHp脚本滥用1.漏洞原因及学习与理解(一)

2023-11-30    分类: 网站建设

本文主要讲解《如何防止pHp程序漏洞》。文章中的讲解简单明了,易学易懂。现在,请跟随小编的思路,深入了解《如何防止pHp程序产生的漏洞》吧!

虐待

1.漏洞原因:

是写pHp网站最常用的函数,支持相对路径。很多pHp脚本直接使用某个输入变量作为参数,导致脚本任意引用、绝对路径泄露等漏洞。看下面的代码:

...

$=$_GET[""];

($);

...

显然,我们只需要提交不同的变量就可以得到想要的页面。如果提交的页面不存在,可以在 pHp 脚本中报错,并显示实际绝对路径(此问题的解决方法在下一篇文章中说明)。

2.漏洞解决方案:

这个漏洞的解决方法很简单,就是先判断页面是否存在再继续。或者更严格地说,使用数组来指定可用文件。看下面的代码:

复制代码代码如下:

$=(".php",".php",".php"); //此处指定可用文件

if(($_GET[""])) //判断是否有$

{

$=$_GET[""];

($ 为 $)

{

if($==$) //检查文件是否在允许列表中

{

($);

$=真;

;

}

}

if($==true){ ($);}

else{ die("无效的参考页!");}

}

这将很好地解决问题。

Tips:还有其他函数有这个问题:()、()、()、()等,写的时候也要注意。

输入变量未过滤

1.漏洞原因:

这个漏洞最早出现在ASp中,当时造成的注入漏洞数不胜数。但是由于当时 pHp 的影响力比较小,所以没有多少人能够关注到这一点。对于 pHp 来说,这个漏洞的影响要大于 ASp,因为更多的 pHp 脚本使用了基于文本的数据库。当然,还有SQL语句注入的问题。举一个更经典的例子,首先是数据库:

复制代码代码如下:

$id=$_GET["id"];

$=" * FROM id='".$id."'"; //很经典的SQL注入漏洞

$=($);

这里很明显,我们可以使用注入来获取数据库的其他内容。这里就不细说了,和ASp注入一样,大家可以看前面的hack。然后我们看一下文本数据库的问题:

复制代码代码如下:

$=$[""];

$=$[""];

$=$[""];

$fd=("test.php","a");

($fd,"\r\n$&line;$&line;$");

($fd);

文中的漏洞可以说是比较严重了。如果我们在提交的变量中插入一小段 pHp 代码,我们就可以将这个文本数据库 test.php 变成一个 pHp 后门。甚至插入上传代码,这样我们就可以上传一个完整的pHp后门。然后提升权限,服务器就是你的了。

2.漏洞解决方案:

这个漏洞的解决方法其实很简单,就是严格过滤所有提交的变量。替换一些敏感字符。我们可以使用 pHp 提供的 () 函数来替换 HTML 内容。下面是一个例子:

复制代码代码如下:

//构造过滤函数

($文本)

{

$=("操","操"); //词汇过滤列表

$text=($text);

($ as $) //这里进行词汇过滤

{

if(($text,$)==true){ die("错误:您提交的内容包含敏感词,请不要提交敏感内容。");}

}

$text=($text); //HTML 替换

//将回车替换为

$text=("\r"," ",$text);

$text=("\n","",$text);

$text=("&line;","│",$text); //替换文本数据库分隔符“&line;” 全角“│”

$text=("/\s{ 2 }/"," ",$text); //空间替换中国网管联盟

$text=("/\t/"," ",$text); //或空格替换

if(()){ $text=($text);} //如果开启,则替换\'

$文本;

}

$=$[""];

$=$[""];

$=$[""];

//过滤所有输入

$=($);

$=($);

$=($);

$fd=("test.php","a");

($fd,"\r\n$&line;$&line;$");

($fd);

经过一些替换和过滤后,您可以安全地将数据写入文本或数据库。

管理员判断不完整

1.漏洞原因:

我们使用pHp编写脚本,通常涉及到管理员的权限。并且有些脚本只对管理员权限做出“是”的判断,而往往忽略“否”的判断。在pHp配置文件中打开的情况(4.2.0及以后的版本默认是关闭的,但是很多人为了方便打开,是极其危险的行为),会出现提交变量 假装是管理员。我们来看一下示例代码:

复制代码代码如下:

$=""; //判断是否的变量

$=$["符号"]; //获取用户变量

如果($==$)

{

$=真;

}

if($){ echo "现在是管理员状态。";}

看起来很安全,哈哈。现在我们假设 pHp 配置文件已打开。我们提交这样一个地址“test.php?=true”,你看到结果了吗?虽然我们没有正确的,但我们提交的变量由于打开状态自动注册为真。而且,脚本缺少“否”判断,这让我们可以通过=true 成功获取管理员权限。这个问题存在于大多数网站和论坛中。

2.漏洞解决方案:

解决这个问题,我们只需要在脚本中给管理员添加一个“否”判断即可。我们仍然假设 pHp 配置文件是打开的。看一下代码:

复制代码代码如下:

$=""; //判断是否的变量

$=$["符号"]; //获取用户变量

如果($==$)

{

$=真;

}

别的

{

$=;

}

if($){ echo "现在是管理员状态。";}

这样,即使攻击者提交的变量=true 不正确,脚本也会在以后的判断中设置$为。这解决了部分问题。但是,因为$是一个变量,如果以后其他脚本引用出现漏洞,重新给$赋值,就会造成新的危机。因此,我们应该使用常量来存储管理员权限的判断。使用()语句定义一个常量来记录管理员的权限。之后,如果重新赋值,就会报错,达到保护的目的。看下面的代码:

复制代码代码如下:

$=""; //判断是否的变量

$=$["符号"]; //获取用户变量

如果($==$)

{

(,真的);

}

别的

{

(,);

}

if(){ echo "现在是管理员状态。";}

值得注意的是,我们已经使用了语句,所以在调用常量之前不要习惯性地添加变量符号$,而是使用and!。

文本数据库曝光

1.漏洞原因:

如前所述,由于文本数据库具有很大的灵活性,因此不需要任何外部支持。此外,pHp 具有非常强的文件处理能力,因此在 pHp 脚本中广泛使用文本数据库。甚至有几个使用文本数据库的优秀论坛程序。但有得有失,文本数据库的安全性低于其他数据库。

2.漏洞解决方案:

作为普通文件,可以下载文本数据库,就像MDb一样。所以我们必须通过保护MDb来保护文本数据库。将文本数据库的后缀更改为.pHp。并加入数据库的第一行。这样,文本数据库就会作为pHp文件使用,第一行就退出执行。即返回一个空页面,从而达到保护文本数据库的目的。

错误路径泄漏

1.漏洞原因:

pHp遇到错误时,会给出错误脚本的位置、行号和原因,例如:

: 在 D:\\\test.php 第 3 行使用 test-'test'

很多人说这没什么大不了的。但是泄露实际路径的后果是难以想象的。对于某些入侵者来说php代码执行漏洞,这些信息非常重要。其实现在很多服务器都有这个问题。

有的网管干脆把pHp配置文件里的设置设为Off,但我觉得这个方法太消极了。有时,我们确实需要 pHp 返回错误消息以进行调试。并且可能需要在发生错误时给用户一个解释,甚至导航到另一个页面。

2.漏洞解决方案:

pHp提供了一个从4.1.0开始的自定义错误处理函数(),但是很少有脚本编写者知道。在很多 pHp 论坛中,我只看到了一些处理这种情况的。使用方法如下:

([, 整数 ])

现在我们使用自定义错误处理来过滤掉实际路径。

复制代码代码如下:

//身份判断为管理员,true为管理员。

//自定义错误处理函数必须有这4个输入变量$,$,$,$,否则无效。

($,$,$,$)

{

//如果你不是管理员,过滤实际路径

如果(!)

{

$=((),"",$);

$=((),"",$);

}

($)

{

案件:

echo ": [ID $] $ (行: $ of $)

\n";

echo "程序已停止运行,请联系管理员。";

//遇到关卡错误时退出脚本

出口;

;

案件:

echo ": [ID $] $ (行: $ of $)

\n";

;

//不显示电平错误

;

}

}

//将错误处理设置为函数

("");

这样就可以很好的解决安全性和调试方便性之间的矛盾。而且你也可以花一点时间思考,让错误信息更美观,以配合网站的风格。但有两点需要注意:

(1), ,,,, 不会被这个句柄处理,也就是会以最原始的方式显示出来。不过,这些错误是编译或者pHp内核错误,一般情况下不会发生。

(2)使用()后,()会失效,即所有的错误(除了上面的错误)都会由自定义函数处理。

关于()的其他信息可以参考pHp官方手册。

pOST 漏洞

1.漏洞原因:

如前所述,依赖注册变量是一个坏习惯。在一些留言簿和论坛程序中,需要严格检查获取页面的方法和提交的时间间隔。防止泛滥的发帖和外部提交。下面我们来看看一个留言板程序的代码:

复制代码代码如下:

...

$=($);

$=($);

$=($);

$fd=("data.php","a");

($fd,"\r\n$&line;$&line;$");

($fd);

显然,如果我们提交 URL “post.php?=&=&="。数据将正常写入文件。该程序不检测变量的来源和浏览器获取页面的方式。如果我们多次提交到这个页面,它就会像洪水一样。现在一些软件利用这个漏洞在论坛或留言簿上发布广告。这是一种可耻的行为(我朋友的留言簿一周就塞满了10多页,无奈)。

2.漏洞解决方案:

在处理和保存数据之前,首先要确定浏览器是如何获取页面的。使用 $[""] 变量来获取浏览器获取页面的方式。检查它是否是“pOST”。脚本中用于记录用户是否通过正常方式提交数据(即填写待提交内容的页面)。或者使用 $[""] 来检测,但不推荐这样做。因为有些浏览器没有设置,有些防火墙也会屏蔽。另外,我们还需要检查提交的内容,看看数据库中是否有重复的内容。以留言板为例php代码执行漏洞,使用确定:

在填写浏览内容的页面,我们在最前面添加:

$[""]=time(); //注册和填写的时间

在接收和保存消息数据的页面上,我们在处理数据之前也使用如下处理:

复制代码代码如下:

if(($[""])!=”pOST”){ die(": Do not .");} //检查页面获取方式是否为pOST

if(!($[""]) or (time()-$[""] <10)){ die(": Do not .");} //检查消息并填写时间

if(($[""]) and (time()-$[""] <120)){ die("错误:两次提交的间隔不能少于2分钟。"); } //查看消息间隔

($[""]); //注销变量,防止进入一次填写页面后多次提交

$[""]=time(); //注册发送消息的时间,防止浇水或恶意攻击

...

数据处理和存储

感谢您的阅读。以上就是《如何防止pHp程序产生的漏洞》的内容。看了这篇文章,相信大家对如何防范pHp程序产生的漏洞有了更深入的了解。每个人都需要通过实践来验证。这就是伊素云。小编会为大家推送更多相关知识点的文章,欢迎关注!

网站标题:pHp脚本滥用1.漏洞原因及学习与理解(一)
文章地址:https://www.cdcxhl.com/news22/297772.html

成都网站建设公司_创新互联,为您提供标签优化品牌网站建设关键词优化建站公司企业网站制作商城网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发