第一次做文件包含类题目,总结一下 这是一个很明显的文件包含的特征,直接从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; } ?>可以看到,这里的应对策略是对输入值进行过滤
(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
举个例子
题目链接:http://level3.tasteless.eu/等我做了来更新
下面是其他的一些应对防御机制的方法,暂时还没用到,先留存
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语言显示