PHP脚本滥用1.漏洞原因及学习与理解(一)
2021-10-18
本文主要讲解《如何防止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程序产生的漏洞有了更深入的了解。每个人都需要通过实践来验证。这就是伊素云。小编会为大家推送更多相关知识点的文章,欢迎关注!