upload-labs基础关卡
# Pass-01
# 过程
第一关,通常随便传把哈哈哈
来个 php 一句话
1 |
|
哦豁,弹窗提示了:该文件不允许上传,请上传.jpg|.png|.gif 类型的文件,当前文件类型为:.php
弹窗提示,没有发请求包,说明是前端验证了,那就去找 js 验证代码,干掉他
方法 1:Ctrl+F 找哪个标签用了这个函数,删掉它,然后点击上传
方法 2:复制 checkFile 函数,将.php 类型加进白名单,在控制台输入运行后点击上传
1 | function checkFile() { |
上传后通过查看器得到文件路径
上菜刀
菜刀没上去,上蚁剑
# 总结
在控台运行函数的方法,我还是一个月之前才知道的(别说 de),明明很容易想到或者尝试到的点…
感觉还是要脑洞大一点,多尝试一些
# Pass-02
date:2020-11-25 22:01:47
# 过程
通过查看器,找到前端的 onsubmit 事件,但是删除后,还是判定文件类型不正确
并没有在前端看见 js 代码,应该是后台判断了
看一下提示:本 pass 在服务端对数据包的 MIME 进行检查!
上传文件,bp 抓包,更改 MIME 类型为 image/png,同时得到路径
上蚁剑连接即可。
# 总结
真百度了好多次了,每次都忘记
“MIME 的全称是 Multipurpose Internet Mail Extensions, 即多用途互联网邮件扩展类型。 这是 HTTP 协议中用来定义文档性质及格式的标准。
文件类型 | 后缀 | 数据包中的文件类型 |
---|---|---|
超文本标记语言文本 | .html | text/html |
xml 文档 | .xml | text/xml |
普通文本文档 | .text | text/plain |
RTF 文本 | .rtf | application/rtf |
PDF 文档 | application/pdf | |
Miscrosoft Word 文件 | .word | application/msword |
PNG 图像 | .png | image/png |
GIF 图形 | .gif | image/gif |
JPEG 图形 | .jpeg,.jpg | image/jpeg |
任意的二进制数据 | application/octet-stream |
# Pass-03
date:2020-11-25 22:53:30
# 过程
不废话直接传 php 上爆破抓包,send to repeater
根据上传 php 文件后的提示,非常有理由认为后台设置了后缀的黑名单
大小写绕过,没绕过去,空格绕过去了但是不解析,那既然是黑名单,就把后缀改成 php4 呗
上蚁剑连接的时候,脚本改成 php4 类型的就可以了
# 总结
据说,空格可以那啥,windows 会忽略空格和点,可是我上传成功不能解析
然后 00 截断上传,右键看源代码是我的一句话,后来查了一下截断上传的条件:
- php 版本小于 5.3.29
- magic_quotes_gpc = Off
唉
# Pass-04
date:2020-11-25 23:03:25
# 过程
提示:
本 pass 禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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 后缀文件!
看了下源码空格大小写啥的,都被弄了
但是没有过滤.htaccess 后缀
要启用.htaccess,要更改 httpd.conf
1 | AllowOverride None |
去掉框住这行的注释符号
上传.htaccess,所有文件都会解析为 php
1 | SetHandler application/x-httpd-php |
然后上传 hqxx.png 图片马
1 | phpinfo(); |
题目也给了路径了,地址栏直接输入就行
# 总结
我最后也没把.png 解析 php 成功
在.htaccess 里面随便输错误字符,报 500,去看 apache 的日志说我输入的错误字符不对,说明我上传的.htaccess 文件是被解析了的
把 httpd.conf 里面所有的 AllowOverride None 都改成了 AllowOverride All,重写模块也开了,文件路径也没有问题,php 版本也调低了,phpstudy 也重启了,但永远就是这样:
我觉得应该还是配置文件的问题,可是到底是哪里出了问题啊!!!
而后修改 htaccess 为,把文件名包含 hqxx 的文件全部以 php 解析:
1 | <FilesMatch "hqxx" > |
发现 a.php 可以解析成功,而 hqxx.php 不能解析,我真真真呵呵了
找了好久终于发现有一个人和我一样的问题了,哭唧唧
在新版中 php 环境默认都是带 nts 的,而在旧版本中则可以选择不带,选一个不带 nts 的 php 版本就可以正常玩了,但是我的 phpstudy 里的 php 全是带 nts 的,谢谢您了
-
.htaccess 上传漏洞
漏洞形成条件
- apache 服务器
- 能够上传.htaccess 文件,一般为黑名单限制。
- AllowOverride All,默认配置为关闭 None。
- LoadModule rewrite_module modules/mod_rewrite.so #模块为开启状态
- 上传目录具有可执行权限。
-
.htaccess 文件 (或者 "分布式配置文件"), 全称是 Hypertext Access (超文本入口)。
概述来说,htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。
启用.htaccess,需要修改 httpd.conf,启用 AllowOverride,并可以用 AllowOverride 限制特定命令的使用。
.htaccess 的主要作用就是实现 url 改写,也就是当浏览器通过 url 访问到服务器某个文件夹时,作为主人,我们可以来接待这个 url,具体地怎样接待它,就是此文件的作用。
# Pass-05
# 过程
看源码,已经不让上传.htaccess 了,但是这次没有把后缀名全转成小写了,也就是说嘿嘿嘿
上传 hqxx.phP
1 | <?php phpinfo(); ?> |
上传成功,地址栏直接输入路径
# 总结
我把 apache 玩崩了,重装都不行,换了 Nginx 哈哈哈
顺便查了下 nginx 用 htaccess 的方法,想看点我
# Pass-06
# 过程
看源码,依然是黑名单
并且将后缀名全部转换为小写了,但是空格啥的没去除了
在文件名末尾加一个空格上传
解析成功
# 总结
利用 Windows 特性 在 Windows 中文件后缀名末尾有空格会自动去掉
# Pass-07
# 过程
看源码,转换了大小写,去除了首位空格
那就在文件末尾加。呗
上传成功,解析成功
# 总结
下一题
# Pass-08
# 过程
上传 hqxx.php::DATA
# 总结
利用 windows 特性:
必须是 windows, 必须是 php, 必须是那个源文件
php 在 window 的时候如果文件名后加上 "::$DATA"
会把 "::$DATA" 之后的数据当成文件流处理,不会检测后缀名
且保持 "::$DATA" 之前的文件名
他的目的就是不检查后缀名
改源代码测试了一下,其实和。空格是一样的,就是利用 windows 特性绕过黑名单,上传到文件夹时,文件后面的 "::DATA…" 已经被去掉了
# Pass-09
# 过程
看提示:本 pass 只允许上传.jpg|.png|.gif 后缀的文件!
看了源码发现,你这个骗子,明明还是黑名单,下次不看提示了
看源码:先删除了末尾的点,然后去掉了::$DATA,后缀转成了小写,最后去除首尾空格
那就 hqxx.php. .
这样最后在末尾就留下了一个点,上传成功
# 总结
跟着代码逻辑走~,可是黑盒都看不到源代码唉
# Pass-10
# 过程
哈哈哈,源代码注释没了
先去除文件名中的所有空格,再把文件名中所有在黑名单中存在的字符置空
那么就,双写,成功绕过
# 总结
下一题
# Pass-11
# 过程
观摩源代码,发现是白名单,允许的类型有’jpg’,‘png’,‘gif’,而且还给文件重命名了
上传 php 抓包发现 save_path=…/upload
源码中文件保存路径就是 $img_path = file_ext;
用 00 截断,在路径后面加上 hqxx.php%00
# 总结
通过字符拼接,连接路径文件名,后台处理后上传到 windows 时,os 看见 %00 自动截断
00 截断的前提条件:PHP 版本小于 5.3.4,PHP 的 magic_quotes_gpc 为 OFF 状态
move_uploaded_file 函数的底层实现类似于 C 语言,遇到 0x00 会截断
# Pass-12
# 过程
上传文件抓包,发现路径也在表单中了,在后面加上 /hqxx.php ,注意后面有一个空格
因为 post 请求没办法解析 %00,所以我们在 hex 中更改数据包
找到对应行,代表空格的 20,改为 00
上传成功
# 总结
为啥网上有人说这是二进制代码,可是这明明不是二进制啊
通常 JPEG/JPG: FF D8 , PNG:89 50,GIF:47 49
- JPEG;.JPE;.JPG,”JPGGraphic File”
- gif,”GIF 89A”
- zip,”Zip Compressed”
- doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”
# Pass-13
# 过程
源代码中读取文件前 2 字节,来判断文件类型是否属于 jpg、png 或者 gif 类型
类型判断成功后,还更改了文件名
这里用文件包含来解析图片马
手动在 upload 文件夹添加一个文件包含的 php
然后浏览器解析
# 总结
unpack () 函数从二进制字符串对数据进行解包。
也就是说本身没有文件包含漏洞的话这个图片马是没有办法解析的,唉
# Pass-14
# 过程
看源码,换了一种方式验证类型
getimagesize () 这个函数功能会对目标文件的 16 进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的
所以还是伪造一个头部信息,上传图片马
图片马的利用可以结合文件包含,解析漏洞等… 反正就是要把他用 php 解析嘛
比如,nginx 解析漏洞,和版本无关,属于用户配置不当产生的
# 总结
getimagesize () 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
实例 1:本地图片文件
1 | <?php |
以上实例输出结果为:
1 | 宽度为:290高度为:69类型为:3属性:width="290" height="69" |
实例 2:远程图片文件
1 | <?php$remote_png_url = 'http://www.runoob.com/wp-content/themes/w3cschool.cc/assets/img/logo-domain-green2.png';$img_data = getimagesize($remote_png_url);print_r($img_data );?> |
以上实例输出结果为:
1 | Array( [0] => 290 [1] => 69 [2] => 3 [3] => width="290" height="69" [bits] => 8 [mime] => image/png) |
返回结果说明
- 索引 0 给出的是图像宽度的像素值
- 索引 1 给出的是图像高度的像素值
- 索引 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
- 索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的
标签 - 索引 bits 给出的是图像的每种颜色的位数,二进制格式
- 索引 channels 给出的是图像的通道值,RGB 图像默认是 3
- 索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如: header (“Content-type: image/jpeg”);
# Pass-15
# 过程
使用 exif_imagetype () 检查是否为图片文件
用图片马进行绕过
但是还得帮 php 安装 exif.so 扩展库
上传成功
# 总结
exif_imagetype ( string $filename ) : int exif_imagetype() 读取一个图像的第一个字节并检查其签名。
# Pass-16
# 过程
看源码,判断了后缀,然后利用 imagecreatefrompng () 等函数创建图片,同时也利用这个函数判断图片类型是否一致了,然后再重命名文件
依然用图片马绕过,但是简单的在文件前加入 GIF89a 已经不可
那就把图片和木马合在一起叭,cmd 执行以下命令
1 | copy pig.jpg/b + a.php/a haha.jpg |
再上传 haha.jpg
往下翻可以看到木马被插在了图片的中间
# 总结
过过过
# Pass-17
# 过程
看源码,是先上传文件移动到 upload 文件夹后,再对后缀进行判断,判断允许后重命名文件再删除原来的文件,否则直接删除文件
那就搞文件竞争,在上传文件和删除文件之间的时间,进行访问上传的文件,并且通过上传的文件创建新的木马
利用 py 脚本不断访问上传的 haha.php
1 | import requestswhile True: requests.get('http://www.upload-labs.com/upload-labs/upload/haha.php') |
然后不断点击发包
上传成功
# 总结
抄作业的感觉,唉
# Pass-18
# 过程
源代码中,先检查了后缀,大小等等,再上传,再重命名
它检查后缀用的白名单,所以试一下截断➕竞争
想法很美好,现实很骨感,看报错信息,是卡在文件名后缀上了
所以直接和之前一样上传图片马哈哈哈
再用文件包含之类的配合…
# 总结
世上无难事只要肯放弃
值得注意的是这里也可以将 php 文件后缀名更改为.php.7z,因为白名单中允许上传.7z 的文件,但是 apache 又不能解析这个格式,所以会把该文件当 php 的格式解析
# Pass-19
# 过程
可以自定义名称
上传 a.php
自定义名称 haha.php.
因为用的黑名单,上传成功
大小写都能绕哈哈哈
# 总结
哈哈哈