文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

文件包含漏洞总结

2023-09-29 08:29

关注

文件包含漏洞总结

CTF中文件包含漏洞

0x01 什么是文件包含漏洞

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

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

0X03 常见文件包含函数

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

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

0X04 PHP伪协议

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

1、PHP://INPUT

php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oiggv1gi-1660668278431)(https://www.freesion.com/images/551/d3e8f190be87cbddcebd4ff56f733097.png)]

Example 1: 造成任意代码执行

<meta charset="utf8"><?phperror_reporting(0);$file = $_GET["file"];if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){exit('hacker!');}if($file){if ($file!="http://www.baidu.com") echo "tips:flag在当前目录的某个文件中";include($file);}else{echo 'click go baidu';}?>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8p1YUVPc-1660668278432)(https://www.freesion.com/images/123/a2ce0b13307ab26e4cc68676dc58561b.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MdQA4dP7-1660668278432)(https://www.freesion.com/images/407/c9a3f86b2e7a0963ffd33aeb143fb7a7.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JtD11EKh-1660668278433)(https://www.freesion.com/images/802/56d2d1b244d4f66f9389baf6cf1aea4a.png)]
注:利用php://input还可以写入php木马,即在post中传入如下代码:

');?>11

Example 2: 文件内容绕过

//test.php<?phpshow_source(__FILE__);include('flag.php');$a= $_GET["a"];if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){echo "success\n";echo $flag;}

//flag.php

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S9hyEQ3I-1660668278433)(https://www.freesion.com/images/545/c44ee86d42262e102e2e787accf076c1.png)]

2、PHP://FILTER

php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BzmqO240-1660668278434)(https://www.freesion.com/images/100/14bf89c709392d887eecacdabe1b9594.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGcM6yxZ-1660668278434)(https://www.freesion.com/images/518/f3479f40a11a8014b4dacf7ec3b21286.png)]
POC1直接读取xxx.php文件,但大多数时候很多信息无法直接显示在浏览器页面上,所以需要采取POC2中方法将文件内容进行base64编码后显示在浏览器上,再自行解码。

Example 1:

<meta charset="utf8"><?phperror_reporting(0);$file = $_GET["file"];if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){exit('hacker!');}if($file){include($file);}else{echo 'tips';}?>

点击tip后进入如下页面,看到url中出现‘file=flag.php’,如下:
在这里插入图片描述
2.尝试payload:?php://filter/resource=flag.php,发现无法显示内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-liUsbApw-1660668278435)(https://www.freesion.com/images/672/6fb91143347a60c386d6379a3717fc50.png)]
3.尝试payload:?php://filter/read=convert.base64-encode/resource=flag.php,得到一串base64字符,解码得flag在flag.php源码中的注释里:

在这里插入图片描述

3、ZIP://

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

//index.php<meta charset="utf8"><?phperror_reporting(0);$file = $_GET["file"];if (!$file) echo 'upload?';if(stristr($file,"input")||stristr($file, "filter")||stristr($file,"data")){echo "hick?";exit();}else{include($file.".php");}?><!-- flag在当前目录的某个文件中 -->//upload.php<meta charset="utf-8"><form action="upload.php" method="post" enctype="multipart/form-data" > <input type="file" name="fupload" /> <input type="submit" value="upload!" /></form>you can upload jpg,png,zip....<br /><?phpif( isset( $_FILES['fupload'] ) ) {    $uploaded_name = $_FILES[ 'fupload' ][ 'name' ];         //文件名    $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);   //文件后缀    $uploaded_size = $_FILES[ 'fupload' ][ 'size' ];         //文件大小    $uploaded_tmp  = $_FILES[ 'fupload' ][ 'tmp_name' ];     // 存储在服务器的文件的临时副本的名称    $target_path = "uploads\\".md5(uniqid(rand())).".".$uploaded_ext;    if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" || strtolower( $uploaded_ext ) == "zip" ) &&        ( $uploaded_size < 100000 ) ) {        if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {// No            echo '
upload error
'
; } else {// Yes! echo "
".dirname(__FILE__)."\\{$target_path} succesfully uploaded!
"
; } } else { echo '
you can upload jpg,png,zip....
'
; }} ?>

4、DATA://与PHAR://

data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UyyGQQsK-1660668278435)(https://www.freesion.com/images/371/fc44c7f2ae565d56fc4515804db4fe9b.png)]

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

0x05 包含APACHE日志文件

WEB服务器一般会将用户的访问记录保存在访问日志中。那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qttZ0hy7-1660668278437)(https://www.freesion.com/images/151/8b484fa82172bcc96347843d5980b8df.png)]
在这里插入图片描述
  Apache运行后一般默认会生成两个日志文件,Windos下是access.log(访问日志)和error.log(错误日志),Linux下是access_log和error_log,访问日志文件记录了客户端的每次请求和服务器响应的相关信息。
  如果访问一个不存在的资源时,如http://www.xxxx.com/,则会记录在日志中,但是代码中的敏感字符会被浏览器转码,我们可以通过burpsuit绕过编码,就可以把 写入apache的日志文件,然后可以通过包含日志文件来执行此代码,但前提是你得知道apache日志文件的存储路径,所以为了安全期间,安装apache时尽量不要使用默认路径。

参考文章:1.包含日志文件getshell
     2.一道包含日志文件的CTF题

0x06 包含SESSION

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

利用条件:

php的session文件的保存路径可以在phpinfo的session.save_path看到。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9IBjeJgq-1660668278438)(https://www.freesion.com/images/935/4e03e885cc940f444467781b3cc0d42f.png)]
session常见存储路径:

参考文章:一道SESSION包含的CTF题

0x06 包含/PROC/SELF/ENVIRON

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

利用条件:

参考文章:proc / self / environ Injection

0x07 包含临时文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Dh9Iolp-1660668278438)(https://www.freesion.com/images/874/bbd820e541286da7c4e630e74ccc8bfa.JPEG)]
php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有65535中不同的文件名,所以这个方法是可行的。

另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,直接包含即可。这个方法可以参考[LFI With PHPInfo Assistance](https://www.insomniasec.com/downloads/publications/LFI With PHPInfo Assistance.pdf)

类似利用临时文件的存在,竞争时间去包含的,可以看看这道CTF题:XMAN夏令营-2017-babyweb-writeup

0x08 包含上传文件

很多网站通常会提供文件上传功能,比如:上传头像、文档等,这时就可以采取上传一句话图片木马的方式进行包含。

图片马的制作方式如下,在cmd控制台下输入:

进入1.jpg和2.php的文件目录后,执行:

copy 1.jpg/b+2.php 3.jpg

将图片1.jpg和包含php代码的2.php文件合并生成图片马3.jpg

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

")?>

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

0x09 其他包含姿势

文件包含漏洞的绕过方法

0x10 指定前缀绕过

1、目录遍历

使用 …/…/ 来返回上一目录,被称为目录遍历(Path Traversal)。例如 ?file=…/…/phpinfo/phpinfo.php
测试代码如下:

highlight_file(__FILE__);

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

 include.php?file=../../log/flag.txt

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

2、编码绕过

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

2.二次编码

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

0x11 指定后缀绕过

后缀绕过测试代码如下,下述各后缀绕过方法均使用此代码:

highlight_file(__FILE__);

1、利用URL

在远程文件包含漏洞(RFI)中,可以利用query或fragment来绕过后缀限制。
可参考此文章:URI’s fragment

完整url格式:

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

query(?)

Example:(设在根目录下有flag2.txt文件)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWyULcQY-1660668278438)(https://www.freesion.com/images/121/1b5e3da36c6c8462f85e8e839a4f5a61.png)]
在这里插入图片描述
fragment(#)

Example:(设在根目录下有flag2.txt文件)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cYSapPS4-1660668278439)(https://www.freesion.com/images/186/056b03827631551655c321329252a402.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RG0OcBuH-1660668278439)(https://www.freesion.com/images/571/eebf92693d8f84c20ea7cabd6824210b.png)]

2、利用协议

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

zip://

phar://

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

?file=zip://D:\PHPWAMP_IN3\wwwroot\php.zip%23phpinfo
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vSpUEr8M-1660668278439)(https://www.freesion.com/images/271/acf9c12cb3c39fdafda8c0f03a68babf.png)]
?file=phar://../../php.zip/phpinfo
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QtIOtX8E-1660668278441)(https://www.freesion.com/images/718/3a8a53d7cb285b5375d2390a6ba2cfde.png)]

3、长度截断

利用条件:

原理:

利用方法:

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

4、%00截断

利用条件:

利用方法:

注:现在用到%00阶段的情况已经不多了

文件包含漏洞防御

来源地址:https://blog.csdn.net/weixin_53002381/article/details/126377092

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯