upload-labs
最近一直再搞内网方面的知识,感觉自己越学越菜
拿了一个学院的后台,有文件上传,但方法都试过了,还是没法成功,编辑器也是,于是就先交edusrc,感觉自己还是对文件上传不够熟悉,把靶场操作一遍,练练手
这个靶场是upload-labs,github上有
pass-01
第一个前端
老js脚本了
去掉checkfile()
或者禁用js都行
pass-02
对文件的类型抓包
未知的是
Content-Type: application/octet-stream
正常的是
Content-Type: image/jpeg
这个又叫mime绕过验证
pass-03
trim 移除字符串两侧的空白字符或其他预定义字符。
strrchr 来进行指定第二个参数对第一个参数的后面的截取读取
黑名单的采用
是不安全的,现在都采用白名单
限制的不全,有php5、php3、phtml等可以上传
这是需要在apahce的环境下才行
因为是php环境,所以一定要上传相关php的脚本木马才可以兼容
pass-04
通过.htaccess的攻击
因为没有过滤这个在黑名单
<FilesMatch "shana">
SetHandler application/x-httpd-php
</FilesMatch>
上传shana图片,就解析了shana.jpg
那个htaccess是指定的文件解析
还有一种全部解析为php的.htaccess
SetHandler application/x-httpd-php
只有apache有
注意靶场环境
这个.htaccess是为伪静态实现的
但也可以通过来攻击
pass-05
大小写绕过
这种只适合在win下,linux没有这个特殊的配置
pass-06
大小写,增加了当前时间和随机数的照片地址
pass-07
末尾增加空格,并且大小写同pass06
少了trim函数
pass-08
少了之前的
$file_name = deldot($file_name);//删除文件名末尾的点
直接加在文件后.
过滤掉黑名单
并且计算机不会识别.
就变成了php文件
pass-09
少了一个检查的
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
直接在文件后加::$DATA
原理:
备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。
加了后自己就就上传取消了这个,跟空格差不多
pass-10
对于过滤的文件名的后缀只执行一次
所以可构造
chenyouxiu.php. .
从而上传
pass-11
str_ireplace是后面的参数跟前面的参数比较,如果跟前面的一样,就过滤
但还是一次的
直接
.phphpp
这个跟xss的那个绕过滤的差不多
pass-12
是个白名单
相对黑名单比较安全
substr() 函数返回字符串的一部分。
strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
就是不断地对文件末尾的点进行去除
白名单使用%00截断
这个前提是
1、PHP 版本 < 5.3.4
2、php.ini 中 magic_quotes_gpc=off
这个是get不用转换%00
因为url会自动转换
因为
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
这行的意思是
get路径然后/然后随机值加日期加文件名
%00就是把url后的截断,从而使上传的jpg变成了php的代码
pass-13
这个跟上一个不同的是请求上的
get变post了
post不会自动转化,路径在下面,直接ctrl+shift+u
然后进行
其实有两种截断在post下
可以输入%00然后ctrl+shift+u
或者hex20改为00
还可以输入+
然后在hex找到对应的目录
然后更改2b为00
同样是截断的方法
ps:还是burpsuite1.7.37好用,新的它的十六进制对%00和+有问题
pass-14
文件包含有个include的file参数进行,使用包含参数?file=xxx.jpg
然后就把图片变成php格式的了
这个是对文件头的识别
jpg,png,gif都有相关
switch($typeCode){
case 255216:
$fileType = 'jpg';
break;
case 13780:
$fileType = 'png';
break;
case 7173:
$fileType = 'gif';
break;
default:
$fileType = 'unknown';
}
return $fileType;
1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。
2.Jpg图片文件包括2字节:FF D8。
3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
4.Bmp图片文件包括2字节:42 4D。即为 BM。
然后使用一句话木马,利用c32等16进制
还可以使用ps的文件简介的文件标题那里插入一句话
或者
copy 图片/b+地址.php 图漂片别名.jpg
然后还是上传一个图片
利用解析漏洞
pass-15
这个高级了
使用的getimagesize的php函数
这个函数的意思就是获取图像,成功返回一个数组,返回失败产生错误
所以要是要是一个图片在加马,不能只是光加头的马
然后解析漏洞
pass-16
又来一个新的函数
exif_imagetype 获取图片信息的函数
一样文件包含
pass-17
一样
pass-18
二次渲染
这个比较不清楚
unlink函数是删除的作用
利用条件竞争删除文件时间差绕过
主要是把文件都先上传到指定的带自己当前的文件名的目录,然后判断后再进行重命名,如果占用就不会rename,所以这样就不断地访问上传的文件的图片的目录的路径的图片,然后使他无法重命名
然后利用bp的null paylaod进行放包不断,使得访问成功,并且不会重命名和判断是否是正常文件,但是这有个问题,就文件一直一会消失一会出现...很好玩
还有一个方法
还可以使用apache的解析漏洞,apache默认情况下是从后往前解析,如果后面的不对,就会接着向前,但apache不解析7z
所以还得向前
就变成了
x.php.7z
x.php
前提还是得不断发包,才行
pass-19
有两个文件
利用require_once引用了myupload.php
看翻译注释知道了这还是一个竞争上传
先检查后缀、大小、然后上传
不对就删除
对了就改名
在类中又定义了上传类型
var $cls_arr_ext_accepted = array(
".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
".html", ".xml", ".tiff", ".jpeg", ".png" );
用7z上传,就可以利用apache的解析特性来绕过
从而解析php文件
pass-20
还是黑名单
但名字需要自己命名
可以使用PHp来绕过
还可以使用截断
还可以使用php.来进行
总之各种偏僻的空格.也中
/.也行
pass-21
这个代码是白名单
然后针对jpeg,png,gif的mime检查
然后对文件填充自己输入的名字
再取.后面的后缀
并且判断是否为jpg类的格式
在进行文件的命名
还有ext=end($file)指的是对文件的最后一个元素进行存储到ext下
然后验证和allow_suffix
$file_name = reset($file) . '.' . $file[count($file) - 1];
参考
x.jpg
分为三部分
x
.
jpg
然后可以当作数组为
x[0]=x x[1]=. x[2]=jpg
然后count就是减去一,就是二,也就是后缀jpg
其中reset指的就是第一个零数组
count($file) - 1就是第二个数组的后缀
然后就可以使用参数来进行
根据原始抓包数据知道
命名的文件叫save_name
然后更改为save_name[0]和save_name[2],为什么没有1
因为1的数组是文件的后缀,没有就为空,然后就为空
从而构造为
先用保存的文件名来绕过mime的检测
然后构造数组
然后构造后就是ma.php空
就是ma.php
总结
实战下不知道上传的情况,因为没有源码,只能尝试,一般都是白名单,还需要不断的积累