第一次做文件包含类题目,总结一下
这是一个很明显的文件包含的特征,直接从Get处获取文件名来显示。打开DVWA,可以看到这块的原始代码大致如下
low等级:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
可以看到,这里的应对策略是对输入值进行过滤
但是在做题的时候,需要结合php的伪协议来操作
(1)最常用的应该是php://filter 协议
最原始的是php://filter/resource=d.txt(这里发现如果不是php类型的文件也能读取,只是不是网页形式)
如果当前文件不是php源码,就不能被以页面形式运行,这时候我们先利用伪协议将源码base64编码,再传入include函数,这样就不会被认为是php文件,不会执行,而是直接输出文件的base64编码,我们只需要再解码就可以得到网页源码。
=php://filter/read=convert.base64-encode/resource=include.php
确实是一个获取php源码的好方法。
(2)php://input 可以利用这个协议让后台代码包含我们想让其显示的php代码,例如
(3)file:// 与php://filter类似,访问本地文件,但是只能传入绝对路径
如图,甚至访问到了服务器根目录外的文件(当然,我这里未加任何限制)
更多伪协议可以访问链接https://blog.csdn.net/qq_41289254/article/details/81388343
**
二.面对一些防范机制的绕过姿势
**
在测试了包含点存在包含漏洞以后,并不是都可以使用filter伪协议包含出源码的,因为allow_url_fopen和allow_url_include会影响到fopen和include等函数对于伪协议的支持。
allow_url_include影响php://input的使用,若不打开则无法使用。
当allow_url_fopen打开时,可以包含任意url。
例如只打开allow_url_include时,只能包含远程文件和使用php://input
举个例子
等我做了来更新
下面是其他的一些应对防御机制的方法,暂时还没用到,先留存
- List item
绕过 waf 的方法
字典绕过
在一些CTF中会对一些伪协议的关键词进行过滤,如read、resource等等,下面总结了几条绕过方法,在实战中作为字典来跑。
?f=php://filter/convert.base64-encode/resource=login.php(过滤了操作名read)
?f=php://filter/read=convert.base64-encode/resource=1.jpg/resource=./show.php(正则 /resource=*.jpg/i)
?f=data:text/plain,<?php phpinfo()?>
?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
这里说一下第二条,这是2018 ISCC中的一道题目的绕过方法。
这里用正则匹配了resource=,我们就可以用重写的方法来绕过正则。
-
List item
截断包含 https://blog.csdn.net/zvall/article/details/8951925 -
zip协议和phar协议(以后用到后再细查,现在只需知道这个可以用于绕过对php的限制)
在实战过程中,若发现存在文件上传但是没有办法直接上传php文件,可以传zip压缩文件,我们就利用这两个协议,将php文件打包成zip文件来包含里面的php脚本。
phar://、zip://,都可以看到在phpinfo中有相应的描述。
例如脚本文件为1.php,打包成1.zip,然后再改名为1.jpg,上传之后包含1.jpg中的php文件即可。
经测试其他类型(例如txt)内有php代码,也能被解释为php语言显示