第一关(JS绕过)
1.1使用bp进行绕过
先将要上传的php文件的后缀改为png,然后在上传时抓包,将png后缀再改为php,发包,此时上传成功
1.2使用js进行绕过
打开浏览器的检查,将其中的checkFile函数直接删除,即可上传php文件
第二关(mime类型)
常见的MIME类型(通用型):
超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二进制数据 application/octet-stream
分析源代码发现这里只是将content-type做了校验,我们可以在上传时抓取数据包然后更改content-type进行绕过
选择一个php后缀的文件,然后进行抓包,更改content-type,改为image/png
靶场中显示这样子的界面即为上传成功
第三关(黑名单绕过)
查看源代码发现这里对上传文件的后缀进行了限制,php等一些文件都上传不了,我们可以尝试绕过黑名单,例如php3 php4 php5 phtml的文件进行上传:
只需将想上传的php后缀的文件改为php3 php4 php5 phtml中的任意一个即可,然后直接上传就能成功
第四关(黑名单绕过 .htaccess)
补充知识:
.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。
笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
.htaccess文件可以在网站目录树的任何一个目录中,只对该文件所在目录中的文件和子目录有效。
注意:
子目录中的指令会笼盖更高级目录或者主器配置中的指令。
.htaccess文件中的配置指令作用于.htaccess文件所在的目录及其所有子目录,即子目录中的指令会覆盖父目录或者主配置文件中的指令。
所以本关可以先上传一个.htaccess文件,文件内容如下:
SetHandler application/x-httpd-php(将所有的文件以php解析)
随后上传php文件,将后缀改为png或者jpg格式上传即可,然后会被解析为php
第五关(大小写混合绕过)
查看源码发现“file_ext = strtolower($file_ext); //转换为小写”,这一句没有了,所以可以使用大小写进行绕过,例如:1.php改为1.phP
第六关(空格和点配合绕过)
利用Windows系统的文件名特性。文件名最后增加空格和点,写成1.php .,这个需要用burpsuite抓包修改,上传后保存在Windows系统上的文件名最后的一个.会被去掉,实际上保存的文件名就是1.php
第七关(空格和点配合绕过)
跟第六关一样
第八关(基于文件流特性::$DATA来绕过)
本关少了“file_ext = str_ireplace('::DATA', '', file_ext);//去除字符串::DATA”这一句,,我们可以采用Windows文件流特性绕过,文件名改为1.php::$DATA , 上传成功后保存的文件名其实是1.php
第九关(点空格点绕过)
上传文件名后加上点+空格+点,改为
1.php. .
第十关(双写绕过)
由于 file_name = str_ireplace(deny_ext,"", $file_name); 只对文件后缀名进行一次过滤,这样的话,双写文件名绕过,文件名改成1.pphphp
第十一关(%00截断)
这个属于白名单绕过,这是php语言自身的问题,php低版本存在的漏洞。
漏洞的利用条件:php版本<5.3.4,并且magic_quotes_gpc关闭。
分析代码,这是以时间戳的方式对上传文件进行命名,使用上传路径名%00截断绕过,不过这需要对文
件有足够的权限,比如说创建文件夹,上传的文件名写成1.jpg, save_path改成../upload/1.php%00 (1.php%00.jpg经过url转码后会变为1.php�00.jpg),最后保存下来的文件就是1.php
第十二关(0x00绕过)
跟11关原理相同,只是12关改为了POST传参,抓包将%00选中在对其编码即可
第十三关(文件头检查)
绕过文件头检查,添加GIF图片的文件头GIF89a,绕过GIF图片检查。
或者我们使用命令copy 1.jpg /b + shell.php /a webshell.jpg,将php一句话追加到jpg图片末尾,代码
不全的话,人工补充完整。形成一个包含Webshell代码的新jpg图片,然后直接上传即可。但是我们没
有办法拿到shell,应为我们上传的图片马无法被解析成php形式,通常图片马配合%00或者0x00截断上
传,或者配合解析漏洞
本关存在文件包含漏洞
打开此链接后可以检查图片马是否正常
第十四关(文件内容检测-getimagesize()绕过)
补充知识:
getimagesize() 函数用于获取图像尺寸 ,索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2
= JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte
order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
image_type_to_extension() 函数用于获取图片后缀
方法与13关相同
第十五关(文件内容检测-exif_imagetype()绕过)
exif_imagetype() 此函数是php内置函数,用来获取图片类型
方法与13关相同
第十六关(二次渲染)
较难
二次渲染原理:将用户上传过来的文件数据重新读取保存到另外一个文件中,那么在读取写入的过程中,将特
殊的数据剔除掉了
为了方便大家测试,这里提供一张网上某个大佬提供的GIF图片,当时我也找了很久,大家可以保存一下
https://wwe.lanzoui.com/iFSwwn53jaf
第十七关(时间竞争)
本关是能将php文件上传到服务器中的,但是会被服务器迅速删掉,所以我们可以利用条件竞争删除文件时间差绕过。
第一步抓取上传文件的包,清除变量
第二步
第三步,这个地方的线程可以调高一点
随后点击开始攻击,这样页面就会不断上传1.php文件
然后我们写一个python脚本:
import requests
url = "http://xxx.xxx.xxx.xxx/upload-labs/upload/1.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
这个脚本是不断请求服务器中的1.php文件,我们可以在kali中使用此脚本,访问成功会提示OK并退出脚本
第十八关(时间竞争)
本关不能再上传php文件了,需要上传图片马
且本关靶场有点问题需要自己手动修改一下:
后续操作和17关相同,python脚本需要改一下
import requests
url = "http://xxx.xxx.xxx.xx/upload-labs/include.php?file=upload/pass19.png"
while True:
html = requests.get(url)
if ( 'Warning' not in str(html.text)):
print('ok')
break
第十九关
与前面的11和12关类似
move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /.
所以在上传的位置改为upload-19.php/.
第二十关
本关来源于ctf,比较绕,参考别的大佬的解题方法
文件命名规则:$file_name = reset($file) . '.' . $file[count($file) - 1];
reset():将内部指针指向数组中的第一个元素,并输出。
end():将内部指针指向数组中的最后一个元素,并输出。
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] :
$_POST['save_name'];如果save_name不为空则file为save_name,否则file为filename
if (!is_array($file))判断如果file不是数组则以’.’分组
文件名命名规则$file_name = reset($file) . '.' . $file[count($file) - 1];
我们POST传入一个save_name列表:['info20.php', '', 'jpg'],此时
empty($_POST['save_name']) 为假则file为save_name,所以由$ext = end($file);为jpg可以通
过后缀名判断(判断结束后最后一个元素jpg弹出),并且最终文件名组装为upload20.php.
原文始发于微信公众号(泷羽Sec-pp502的安全笔记):文件上传漏洞靶场详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论