【小迪安全】upload-labs 1-21(除了19)(白盒)
目录
- 【小迪安全】upload-labs 1-21(除了19)(白盒)
- Pass-01(前端白名单)
- Pass-02(MIME类型)
- Pass-03(黑名单,其他可以解析成php的后缀)
- Pass-04(黑名单,.htaccess解析)
- Pass-05(黑名单,一次过滤,.user.ini)
- Pass-06(黑名单,大小写)
- Pass-07(黑名单,空格绕过)
- Pass-08(黑名单,点绕过)
- Pass-09(黑名单,::$DATA)
- Pass-10(黑名单,一次过滤)
- Pass-11(黑名单,双写后缀名)
- Pass-12(白名单,%00截断 GET)
- Pass-13(白名单,%00截断 POST)
- Pass-14
- Pass-15(与文件包含漏洞结合,getimagesize)
- Pass-16(与文件包含漏洞结合,exif_imagetype)
- Pass-17(二次渲染)
- Pass-18(条件竞争)
- Pass-19(还没写)
- Pass-20(黑名单,文件夹命名)
- Pass-21(白名单,文件夹命名)
Pass-01(前端白名单)
有白名单,且只是前端过滤。
题解
- 可以先上传一个
.jpg|.png|.gif
格式的文件
-
抓包,将格式改为
.php
,放包
-
打开上传的文件地址
注意:你上传到服务器上时必须能以php代码的形式打开,要不然传上去没用
Pass-02(MIME类型)
$_FILES ['userfile'] ['type']
//文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。
$_FILES ['userfile'] ['tmp_name']
//文件被上传后在服务端储存的临时文件名。
白名单,此代码检测上传文件的 MIME类型
题解
-
正常上传一个php文件
-
抓包,修改 MIME类型 为可以通过过滤的,放包
-
打开上传的文件地址
我把之前上传的给删了
Pass-03(黑名单,其他可以解析成php的后缀)
黑名单,禁止上传的比较少。
trim($FILES['upload_file'] ['name'])
// 去除字符串首尾处的空白字符(或者其他字符)(PHP 4, PHP 5, PHP 7, PHP 8)
$_FILES ['userfile'] ['name']
// 客户端文件的原名称。
deldot(file_name)
//删除文件名末尾的点 例:shell.php. -> shell.php
strrchr($file_name, '.')
//搜索 " . " 在字符串中的位置,并返回从该位置到字符串结尾的所有字符
例:shell.php.jpg -> .jpg
经过实际测试,如果有多个相同的会以最右边出现的为准
strtolower($file_ext)
//把所有字符转换为小写
str_ireplace('::$DATA', '', $file_ext)`
// 把 $ file_ext 中的 "`::$DATA`" 换成第二个表达式(即去除字符串::$DATA)
这题过滤的都可以成为绕过的思路
题解
- 上传
.php5, .php4, .php3, .phtml, .phps, .pht
等后缀的来绕过:这有个前提条件,要有相应的配置文件
配置文件的地址:Apache 的配置文件 httpd.conf 文件里的如下图所示的一行
就如上图所示,它可以把以 phtml 为后缀的 解析成 php 代码。
还可以往上添加其他的如php5等。
所以此题到底要用哪种后缀取决于服务器上的配置文件的,当我们不知道时只能一个一个试。
- 直接上传,并打开文件地址
Pass-04(黑名单,.htaccess解析)
黑名单,但黑名单过滤了很多,包括上一关说的phtml之类的。
但是它没有禁 .htaccess 后缀。
而且存入服务器时没有重命名。
.htaccess解析:只有apache能用,生成伪静态页面,可以通过它来实现解析自定义。
<FilesMatch "shell">
Sethandler application/x-httpd-php
Addhandler php5-script .jpg
</FilesMatch>
//当文件名中有shell时,会解析成php
题解
-
上传 .htaccess 文件
-
上传 shell.jpg
-
打开图片地址
虽然写的是 jpg 后缀,但还是 php 解析
Pass-05(黑名单,一次过滤,.user.ini)
黑名单内容没截完,其中存在上一关的.htaccess后缀
但是它只过滤了一次,可以根据它过滤的顺序构建文件名字。
分析:文件名为:shell.php. .
题解
-
上传 shell.jpg
-
抓包,将 jpg 改为 “php. .”(点空格点),放包
-
查看图片地址
虽然网址上后面有个".
“,但是服务器上看是没有的,操作系统会把最后的”.
"删除。
我本来以为Pass-10与Pass-05是一样的,但我认真比对他们的源代码后,发现Pass-05的黑名单中没有Pass-10中的 “.ini” ,然后我就上网去查,查到了.user.ini文件构成的PHP后门 - phith0n (wooyun.js.org)有个 ".user.ini"
相关网址:https://blog.csdn.net/kingdring/article/details/115922458
需要低版本的php
Pass-06(黑名单,大小写)
黑名单,没有转换为小写的函数。虽然黑名单中要过滤许多参杂着大写的,但是还是不全。
题解
-
上传 shell.PHP
成功上传 -
打开图片地址
Pass-07(黑名单,空格绕过)
黑名单,没有首尾去空。
如果直接在文件名后面加个空格,操作系统会自动把空格去掉,所以只能抓包改后缀。而且传上去的文件会自动把空格删掉。
后面加个空格为什么能绕过黑名单?
代码最后截取的后缀名为 ".php "(后面有个空格),而黑名单里有没有这个,所以就绕过了
题解
-
上传 shell.jpg
-
抓包,修改后缀为".php "(后面有个空格),放包
-
访问图片地址
没有空格
Pass-08(黑名单,点绕过)
黑名单,没有去除文件名的点这个函数
题解
-
上传 shell.php
-
抓包,后缀修改为".php."(多了一个点),放包
-
访问图片地址
Pass-09(黑名单,::$DATA)
黑名单,没有去除 ::$DATA
::$DATA
绕过: “文件名+’::$DATA
’ "
::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持”::$DATA"之前的文件名
必须是windows,必须是php
题解
-
上传 shell.php
突然发现
-
抓包,在文件名后面加个 “::$DATA”,放包
-
访问图片地址
!
直接右键访问图片地址,访问的找不到。但是在服务器上又看到了已上传上去了
对比一下发现地址上多了 “::$DATA
”,服务器把"::$DATA
"自动删除了。
把这个删除再访问即可。
Pass-10(黑名单,一次过滤)
这题可以用Pass-05的一次过滤的思想,详细题解看 Pass-05
如果是黑盒且是一次过滤,那只能一个一个试,把可能的排列顺序都试一遍
Pass-11(黑名单,双写后缀名)
黑名单,其中有一个删除黑名单中出现的名字的后缀,可是只删除了一次,所以我们可以双写后缀名来绕过。
题解
-
上传 shell.pphphp
-
访问图片地址
双写的后缀被删除了一个
Pass-12(白名单,%00截断 GET)
白名单,GET请求有上传地址(上传路径可控),可以用%00截断
%00截断,对方服务器PHP版本要小于5.3.29
题解
- 上传 shell.jpg
- 抓包,在路径后面加个shell.php%00。这样%00后面的就会被截断,上传的路径从
http://x.x.x.x/upload-labs-master/upload/shell.jpg
变成了
http://x.x.x.x/upload-labs-master/upload/shell2.php%00shell.jpg
起作用的只有%00前面的
- 打开图片地址
直接复制图片地址出来是这个
需要把 shell2.php 后面的给删掉
已经上传上去了
Pass-13(白名单,%00截断 POST)
白名单,和上一关相似,不过这关是POST请求有上传地址
POST请求上的%00需要url解码,因为GET请求是写在网站地址上的会自动解码,但POST不是需要手动解码。
题解
-
上传 shell.jpg
-
抓包,修改
-
url解码,放包
-
访问图片地址
Pass-14
文件包含漏洞和文件上传漏洞结合,通过文件头判断了是否为图片,所以要上传一个图片码
-
文件包含漏洞:
让打开的不管是什么后缀 都会用 有文件包含漏洞的脚本语言来执行
-
图片码
命令行形成图片码的命令为
copy zelda.jpg(文件名) /b + shell.php(文件名) /a webshell.jpg
图片码最后存在恶意代码
注意:如果恶意代码的前面显示不全,把那原本写有恶意代码的文件的最前面加上空格,再制作图片码即可
题解
-
制作 一个图片码并上传
-
点开 文件包含漏洞
-
再网址后面加 ?file=upload/文件名
-
file
是给出的代码中说的参数名 -
文件名还是看看图片地址上的名字,可能上传时会改名字
http://x.x.x.x/upload-labs-master/upload/2620220317214430.jpg(这是图片地址)
http://x.x.x.x/upload-labs-master/include.php(这是文件包含漏洞的地址)
如果直接加?file=文件名
就会在 upload-labs-master 文件夹里找图片,这是肯定找不到的,所以要让它在upload 文件夹里面找,需要在文件名前面加个文件夹 ?file=upload/文件名
。如果要在上一级文件夹里面找,就要在文件名前加 ../
,?file=../文件名
。要往上多少级就要写几个../
Pass-15(与文件包含漏洞结合,getimagesize)
白名单,文件包含漏洞和文件上传漏洞结合
这题判断是否为图片,用的是getimagesize函数。使用图片码
getimagesize()
函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
题解
-
上传 webshell2.jpeg(图片码)
-
使用有文件包含漏洞的页面打开
Pass-16(与文件包含漏洞结合,exif_imagetype)
白名单,与文件上传漏洞结合,用exif_imagetype()函数判断文件类型
exif_imagetype()
判断一个图像的类型,读取一个图像的第一个字节并检查其签名。
打开php_exif模块
或者在 php.ini中把 extension=php_exif.dll
给解注释
题解
-
上传 webshell.jpeg(图片码)
-
在存在文件包含漏洞中打开图片
Pass-17(二次渲染)
imagecreatefromjpeg()
由文件或 URL 创建一个新图象。
上传的图片存在恶意代码
经过渲染后没有了恶意代码
这个手工注入不好去绕过,网上说用脚本我还没去了解
Pass-18(条件竞争)
它先把文件保存再服务器中,再判断。这样就需要使用条件竞争
条件竞争:当一个文件被使用时,不能进行其他操作(重命名、删除等)
本题在第一次上传服务器没有改名字,如果改了名字就不好办了
题解
-
上传 shell.php
-
抓包,选择一个修改也没问题的数值,把数据包发送到 Intruder 再在 Positions 模块里选择那个可以修改的数值
-
进行多次发包
点击 右上角的Start attack
-
一直重新加载文件地址,直到打开网页
这是靠运气的,可以在自己搭建的网站源码的 upload 文件里,等一等就会出现上传的文件并会马上消失。
Pass-19(还没写)
之后再研究
Pass-20(黑名单,文件夹命名)
黑名单,自定义名字
取一个 upload-19.php/.
这样的名字。虽然这显示 upload-19 是一个文件夹,但是最后真正上传的还是 upload-19.php
题解
-
上传 shell.php,取名为
upload-19.php/.
看服务器上上传的文件
-
访问文件地址
Pass-21(白名单,文件夹命名)
白名单,自定义名字
所以要命名为 upload-20.php/.jpg
后面的 jpg 就是为了能过白名单。
我们需要自己把名字划分为数组,具体分析如图:
题解
-
上传 shell.php 并命名为
upload-20.php/.jpg
-
抓包,自定义数组,此时数组为
Array([0]=>‘upload-20.php/’ [1]=>’’ [2]=>‘jpg’),放包
-
访问文件地址
此题我多次放包得到的结果为“文件上传失败”,其实显示这个说明已经成功绕过,我本来以为是还有什么问题(比如文件地址不可以那样写),但是最后一次又成功上传了,这我就不知道是什么问题了,可能环境不太稳定吧。