当你的才华
还撑不起你的野心时
那你就应该静下心来学习
代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅。
目录
文件包含漏洞
文件包含漏洞严格来说,属于"代码注入"的一种,其原理就是注入一段用户能控制的脚本或代码,并让服务端执行, 来完成恶意攻击
简介:
开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。
开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用, 但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的,造成文件包含漏洞。
常见的文件包含相关函数有:
-
include()
-
require()
-
include_once()
-
require_once()
include():
执行到include时才包含文件,找不到被包含文件时只会产生警告,代码会继续执行
require():
程序开始运行就预先包含文件,找不到被包含的文件时会产生致命错误,并停运行
include_once()和require_once():
功能和上面一样,但文件中代码已被包含则不会再次包含
文件包含漏洞分类:
-
本地文件包含:包含本地文件,主要出现在模块加载、模板加载和cache调用之处
-
远程文件包含:包含的文件位于远程服务器上,需要设置
allow_url_include = on
本地文件包含漏洞实例
代码如下:
把一下几个php放在同一个目录文件里面fileinclude.php、fileinclude_black.php、fileinclude_white.php、remotefile.php、file.php、local.php、right.php、file.txt
• fileinclude.php
-
if (
isset($_GET[
'file'])) {
-
include($_GET[
'file']);
-
}
-
else{
-
echo
"使用 file 参数包含文件";
-
}
-
?>
• fileinclude_black.php
-
<?php
-
header(
"Content-Type: text/html; charset=utf-8");
-
if (
isset($_GET[
'file'])) {
-
$file = $_GET[
'file'];
-
$file = str_replace(
"http:",
"", $file);
-
$file = str_replace(
"https:",
"", $file);
-
include($file);
-
}
-
else{
-
echo
"使用 file 参数包含文件";
-
}
-
?>
• fileinclude_white.php
-
<?php
-
header(
"Content-Type: text/html; charset=utf-8");
-
-
if (
isset($_GET[
'file'])) {
-
$file = $_GET[
'file'];
-
if($file !=
"right.php")
-
{
-
echo
"错误!不能加载此文件!";
-
exit;
-
}
-
include($file);
-
}
-
else{
-
echo
"使用 file 参数包含文件";
-
}
-
?>
• remotefile.php
-
<?php
-
include($_GET[
'file']);
-
?>
• file.php
-
<?php
-
echo
'你已成功加载file.php';
-
?>
• local.php
-
<?php
-
if( !ini_get(
'display_errors') ) {
-
ini_set(
'display_errors',
'On');
-
}
-
error_reporting(E_ALL);
-
if (
isset($_GET[
'file'])) {
-
$f =$_GET[
'file'];
-
if ($f){
-
}
-
else{
-
print(
"No File Included");
-
}
-
}
-
?>
• right.php
-
<?php
-
echo
"right.php 加载成功";
-
?>
创建一个file.txt 文本,里面存在跟file.php 一样的内容
-
<?php
-
echo
'你已成功加载file.php';
-
?>
访问fileinclude.php
输入?file=file.php,加载同目录下的file.php文件中的代码
成功执行了file.php文件中的代码,使用echo输出了字符串,如果file.php中的代码是一些通用的函数模块,这种代码复用方式无疑会给开发者代码非常大的便捷,而且后期修改也不同到每个文件中修改,只需修改file.php就可以了,类似于配置文件得作用。 但是这里未对用户的输入过滤,所以会出现意料之外的危险。
比如包含一些linux系统上的敏感文件:
输入?file=/etc/passwd
:
可以看到成功执行/etc/passwd 命令
值得注意的是,被包含的文件无论是不是以.php
结尾,服务器都会以php代码的方式解析它。
比如我们输入?file=file.txt
(和file.php内容一样):
PS:
这个特点使得文件包含漏洞经常和文件上传漏洞结合使用。
比如有些地方可以上传头像,图片等,但是由于上传的限制,一般只能上传jpg,png的图片格式,代码无法被直接加载执行,所以这里先上传.jpg .png
等结尾的图片,图片的内容为一句话木马,然后通过本地文件包含的方式将图片包含进来,代码就执行了
我不需要自由,只想背着她的梦
一步步向前走,她给的永远不重