Upload-Labs 实验操作记录
0x01 安装
下载:https://github.com/c0ny1/upload-labs
环境:简单搭建phpstudy环境即可,记得在upload-labs根目录下创建该文件夹
0x02 文件上传总结
写在前面是因为,实验截图太多了,不利于我阅读😄
- 简单的前端检查:
- 只在前端检查文件的一些属性,如后缀名,文件类型。可以尝试修改前端js代码,或尝试使前端检测函数失效,就是修改当前页面的前端代码,当然可能不成功,再使用burp改后缀名或是文件类型绕过。
- 黑名单过滤:
- 黑名单过滤常常会有过滤不完全的问题。我们可以尝试上传一些其他的可执行文件或配置文件,像cer、 .htacess,之类的,常见的htacess文件的写入内容是使某文件都解析为其他文件,如 AddType application/x-httpd-php .jpg 。
- 白名单过滤:
- 白名单限制在一定程度上能解决文件上传的问题。但是我们可以上传被污染过的文件,比如说图片马,以php为例,图片马的简单制作语句为 copy 1.jpg/b +1.php/a 2.jpg ,但是他正常下只会被当成图片解析,若需要解析为php文件,还要结合文件包含漏洞实现。
- 置空敏感词:
- 一些安全检查会将一些特殊的字符去空,像‘ ’、‘::$DATA’、‘.’、‘php’等等,我们可以尝试双写,或两者结合起来,如果只检查一次,以上方法就可以绕过了。
- 二次渲染:
- 上传图片马时,如果碰到二次渲染的过滤,可以观察你制作的图片马和被渲染后的图片之间的区别,具体点就是打开十六进制编辑器,对比两者,在未变化的区域,也就是未经二次渲染的区域插入代码,绕过。这个处理过的图片马同样需要结合文件包含来使其中的代码执行。
- 重命名:
- 有的时候会碰到上传的文件被重命名,有时是“不可控”,有时是可控,我们可以使用00截断或‘ ’、‘.’、‘::$DATA’等特殊字符实现效果。
0x03 闯关
-
Pass-01
首先判断该环境能解析的语言是什么,观察主页url,可以看到是php文件。那么我们选择上传php文件。
返回信息很快,我们猜测是前端有做后缀名检测。
绕过方法:
- burpsuit,先改后缀名符合检测规则,再抓包修改。
复制图像地址,看到可以解析。
- 前端添加允许可上传的文件类型,F12 打开开发者工具栏,查看器中找到检测js代码,此操作不成功。
- 不调用前端的验证脚本,在form表单处,删除掉此调用行为,直接传入php文件,成功。
-
Pass-02
第二关同第一关,修改后缀名即可绕过前端检测,但其提示信息不同于第一关,经试验,只能通过burp改包绕过。结合提示,应该可以只改文件类型。
那我们看看图片文件类型有哪些:建议测试时使用常见的图片格式
image/bmp | bmp |
image/cis-cod | cod |
image/gif | gif |
image/ief | ief |
image/jpeg | jpe |
image/jpeg | jpeg |
image/jpeg | jpg |
image/pipeg | jfif |
image/svg+xml | svg |
image/tiff | tif |
image/tiff | tiff |
image/x-cmu-raster | ras |
image/x-cmx | cmx |
image/x-icon | ico |
image/x-portable-anymap | pnm |
image/x-portable-bitmap | pbm |
image/x-portable-graymap | pgm |
image/x-portable-pixmap | ppm |
image/x-rgb | rgb |
image/x-xbitmap | xbm |
image/x-xpixmap | xpm |
image/x-xwindowdump | xwd |
参考手册:https://www.w3school.com.cn/media/media_mimeref.asp
绕过上传成功,关键字 文件类型。
-
Pass-03
看起来像是前端黑名单。改后缀再改包也不行,似乎后端也验证了后缀名。查看了一些帖子,做法是利用一些生僻的后缀绕过黑名单,但前提是apache可以解析,需要在httpd.conf文件中添加如下代码,使得这些后缀名解析为php文件。我个人觉得这个方式不太适合实战,毕竟你如果能摸到配置文件那大概也不需要再上传了吧。
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
php一些后缀名
修改完配置文件记得重启apache。
-
Pass-04
过滤得已经挺全了,但是重要的.htaccess 还没过滤。概述来说,htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。
通过 htaccess 文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
SetHandler application/x-httpd-php .jpg 使jpg文件都解析为php文件。。
-
Pass-05
黑名单过滤不完全,使用PHP大写绕过
-
Pass-06
在文件名后加空格
-
Pass-07
后缀名加.绕过
-
Pass-08
后缀加 ::$DATA 绕过,这是windows的特性,php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。
-
Pass-09
初步结合提示,去末尾的点,去空,去字符串::$DATA,但好像只操作一次,按照他过滤的顺序,拼接这些特殊符号,使过滤完的结果还是php.。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $is_upload = false; 2 $msg = null; 3 if (isset($_POST['submit'])) { 4 if (file_exists($UPLOAD_ADDR)) { 5 $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".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"); 6 $file_name = trim($_FILES['upload_file']['name']); 7 $file_name = deldot($file_name);//删除文件名末尾的点 8 $file_ext = strrchr($file_name, '.'); 9 $file_ext = strtolower($file_ext); //转换为小写 10 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA 11 $file_ext = trim($file_ext); //首尾去空 12 13 if (!in_array($file_ext, $deny_ext)) { 14 if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) { 15 $img_path = $UPLOAD_ADDR . '/' . $file_name; 16 $is_upload = true; 17 } 18 } else { 19 $msg = '此文件不允许上传'; 20 } 21 } else { 22 $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!'; 23 } 24 }
-
Pass-10
从提示和源码中看到是去除脚本后缀名,尝试双写绕过。
-
Pass-11
提示信息是路径可控,可能上传后文件会重命名,且是白名单,那么关键词只能是路径了。%00截断可行的前提是 php 版本<5.3.4 ,但是我这里php版本较高,所以复现会不成功。
-
Pass-12
同样是白名单和路径可控,但路径变量出现在post数据中,需要使用0x00截断。
-
Pass-13
看提示是会检查文件头部,任务是上传图片马。
copy a.jpg/b + b.php/a c.jpg
上传后要结合文件包含使图片马被php解析。这里先在upload文件夹下创建一个file.php,内容:
<?php @include $_GET[file]; ?>
-
Pass-14
提示信息显示,使用了 getimagesize()函数检测图片文件。
PHP官方解释: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
提示显示使用了exif_imagetype函数,exif_imagetype()(PHP 4 >= 4.3.0, PHP 5, PHP 7) 读取一个图像的第一个字节并检查其签名。这个同样可以使用图片马绕过。
-
Pass-16
图片经过二次渲染,这里我上传的是gif图片马,三种图片的渲染方式都不一样,详见链接。gif更简单,我们使用这个。上传后下载被渲染后的文件,与渲染前的图片马比较。
前后渲染的文件对比发现这部分及以前的内容是不变的,那么我们可以在这间插入php代码。
emmm,修改过的图片有点丑,但是好像有点眼熟,以后看到这种图片要警惕是否是图片马。
-
pass-17
可以看到,对于上传的文件,最开始没有验证分析,重命名rename,再unlink删除。思路是:通过条件竞争的方式在unlink之前,访问webshell。首先在burp中不断发送上传webshell的数据包然后不断在浏览器中访问,可以通过竞争访问到文件。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
if(isset($_POST['submit'])){ $ext_arr = array('jpg','png','gif'); $file_name = $_FILES['upload_file']['name']; $temp_file = $_FILES['upload_file']['tmp_name']; $file_ext = substr($file_name,strrpos($file_name,".")+1); $upload_file = $UPLOAD_ADDR . '/' . $file_name; if(move_uploaded_file($temp_file, $upload_file)){ if(in_array($file_ext,$ext_arr)){ $img_path = $UPLOAD_ADDR . '/'. rand(10, 99).date("YmdHis").".".$file_ext; rename($upload_file, $img_path); unlink($upload_file); $is_upload = true; }else{ $msg = "只允许上传.jpg|.png|.gif类型文件!"; unlink($upload_file); } }else{ $msg = '上传失败!'; } }
intruder 模块,选择 Null Payloads,就可以单纯发包。再修改下发包速率。
抓取上传的数据包和访问的数据包,不断发包,但是我没有竞争成功😄
不过本人在实践过程中发现可以使用16关的方法,绕过条件竞争。
-
Pass-18
找了其他大佬的一些分析,但是发现,使用16关的方式结合文件包含,可以实现解析。不过这似乎不是作者考察本意,我又试了条件竞争的方式,发现还是无法访问到。
-
Pass-19
自定义重命名,是黑名单,可以添加空格,点,“:$DATA:”等进行文件读取的截断。
☭,到这里就没有啦,欢迎阅读并提出意见哦~