Pass-11

过滤方式更换成了白名单,但是上传路径采用的直接拼接,可控,可以考虑用%00截断

截断原因:在url中%00等价ascii码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束

上传成功并解析

Pass-12

与第pass11不同是是该关卡利用的是post传输数据,pass11利用的get传输,get可以自动解码%00但是post不可以,因此需要利用0x00截断

上传成功,解析成功

Pass-13

利用copy命令构造图片马,或利用winhex或010editor构造都可以

Copy命令制造:copy 1.jpg /b + phpinfo.php /a shell.jpg

Winhex和010editor方法一样,这里用010editor演示

打开010editor软件

然后打开个正常jpg图片

然后复制头部信息,一般第一行即可

然后Ctrl+N新建个文件,将复制的信息粘入

然后复制webshell,依次粘在后面即可

成品如下图

然后上传文件即可

利用文件包含漏洞成功解析

Payload如下

IP/include.php?file=./upload/9320200121150616.jpg

解析成功

.png  .gif同理可上传成功

 

Pass-14

该关卡利用getimagesize()函数检测是否为图片,这里我们仍然可以利用pass13的思路,不过要做成完成的图片,不能仅复制一个头了,最好复制整个图片文件,建议用copy构造webshell,同样winhex和010editor也可以

构造较完整图片马

然后成功上传

成功利用文件包含漏洞解析

这里有个小小的坑需要注意下,构造图片马的时候让图片尽可能的小,因为较大的图片含有的字符比较多,可能会让php报错从而造成无法解析,尤其是在与关键的<?php>类似的关键词结合的时候,假设前面图片的符号刚好巧合是一个注释符,那么后面的php代码将无法执行从而报错

第一次上传较大的图片的时候就出现了下面这个报错

所以为了尽可能缩小发生的概率,图片马越小越好

 

Pass-15

该关卡利用了exif_imagetype() 函数来判断是否为图片

exif_imagetype() 读取一个图像的第一个字节并检查其签名。

函数详情(https://www.php.net/manual/zh/function.exif-imagetype.php

因为我们构造的图片马为完整的图片,所以利用pass14的图片马也可以绕过检测

同样的上传方法成功利用包含漏洞解析

 

Pass-16

二次渲染问题

利用gif图片图片

首先上传一张常规gif马

文件最后构造webshell

然后成功上传,但是发现解析不了

下载下来上传的图片,然后010editor分析后发现,自己上传的木马被和谐了

查看源代码之后发现了是二次渲染

于是下载下来渲染后的图片,与原构造的图片进行比较

010editor比较文件

或者Ctrl+M快捷键打开也可以

比较出来两个文件异同

然后我们在两个文件相同处进行插入webshell,该方法仅适用于gif图片,其他图片格式不适用

二次渲染后不变处插入webshell

成功上传

然后下载下来刚刚上传的图片,继续查看下十六进制,看webshell有没有被和谐

发现正常上传,于是利用文件包含漏洞检查是否能正常解析

成功解析

对于jpg,png图片格式,利用上述方法不行

参考大佬的思路

需要分析关键块(critical chunk)和辅助块(ancillary chunks)计算图片CRC

大佬写好了脚本,可以直接拿来用

大佬解析https://xz.aliyun.com/t/2657#toc-2

图片及计算代码Github:https://github.com/Yang1k/upload-labs-Pass16

 

 

Pass-17

条件竞争问题

这个题比较坑,成功率不是特别大,再低配置环境下成功率会大些,我用的4核4G的服务器跑了很久没成功,最后是开了多个进程造成服务器出现微小卡顿才成功了。下面看过程。

查看源代码,发现服务器是将上传的文件先临时保存,然后再进行重命名转储,然后将临时保存的文件给unlink掉

所以这里就在临时存储的时候造成了漏洞,如果我们上传一个木马,然后在服务器unlink之前将其执行,那么就达到了我们getshell的目的。操作这一过程用时非常短,需要在代码没有执行完成的时候完成访问即可达到目的,所以成功率比较低,因此对于服务器配置比较高的情况下,我们需要想办法消耗服务器cpu来达到延时目的,多线程并发请求对于中小型的服务器来说是个不错的选择。

清楚了实施过程便可以进行操作了。

首先burp进行抓包,上传我们的木马文件

画绿线的这部分用这个代码是为了更方便的进行一句话木马

<?php fputs(fopen(‘shell.php’,’w’),'<?php phpinfo(); ?>’);?>

创建一个文件名为shell.php文件内容为<?php phpinfo(); ?>

达到的效果是一旦createshell.php访问成功,然后会在当前目录下生成shell.php文件

然后我们将抓到的包发送到intruder里面开始爆破

因为我们不需要传入参数,只需要进行不断访问上传文件,所有这里把payloads变量清空

然后设置爆破20000次

因为我们payload为空,所有设置Payload type为Null payloads

同理抓取访问createshell.php文件的包,仍然丢到intruder,设置爆破20000次,type选择Null

这里需要注意,如果我们不知道上传路径,那么我们可以先上传一张正确的图片获取一下上传路径

获取到上传路径是upload文件夹下

所以我们抓取第二个包的时候访问的地址便是

然后不断爆破访问这个地址

(一开始我用的一个进程,爆破了好几遍没有成功,然后我开了四个进程,每个都爆破20000,造成了服务器卡顿,然后访问成功了)

成功了5次,尝试了上万次

既然访问成功,说明我们的代码执行成功了,那么也就是创建了shell.php文件,访问一下看看

成功解析

这个对于低配服务器实验成功率较高

 

Pass-18

该题目类似第17关的题目,不过由于做了后缀名的判断,所有无法直接上传php文件,需要利用文件包含漏洞进行解析

分析源代码发现,文件上传上之后先进行了move移动操作,然后进行了rename操作,所以我们可以在rename之前搞事情。仍然是条件竞争问题

 

上传木马图片,然后抓包,发送到intruder

开始爆破,爆破设置可参考pass17

另一方面利用文件包含漏洞使createshell.jpg木马图片进行解析执行

两个同时爆破

然后我们从上帝视角看一下是否成功(从靶机服务器看)

发现成功解析,生成了shell.php文件,然后我们访问一下看看能否正常运行

正常解析

 

Pass-19

发现让重命名文件

直接在重命名文件处进行0x00截断即可绕过

然后访问看看能否解析

解析正常

翻阅其他大佬的博客发现下面几种方法也可以绕过

大小写绕过

./绕过

move_uploaded_file底层会调用tsrm_realpath函数导致,递归删除文件名最后的/.导致绕过了后缀名检测

参考链接:https://blog.csdn.net/vhkjhwbs/article/details/89740197

Pass-20

查看源代码发现有文件类型判断检查了MIME,有后缀名判断,采用post方式提交

所以尝试用0x00截断一下,还要修改文件类型

此处进行了2处截断,上传文件和重命名后的文件

发现上传成功

然后利用文件包含漏洞成功解析

然后网上发现有大佬用了另外一种方法,数组的方式

数组+/.绕过

原理:

最终的文件名后缀取的是$file[count($file) – 1],因此我们可以让$file为数组。

$file[0]为smi1e.php/,也就是reset($file),然后再令$file[2]为白名单中的jpg。

此时end($file)等于jpg,$file[count($file) – 1]为空。

而 $file_name = reset($file) . ‘.’ . $file[count($file) – 1];,也就是smi1e.php/.,最终move_uploaded_file会忽略掉/.,最终上传smi1e.php。

参考链接:https://blog.csdn.net/vhkjhwbs/article/details/89740197

成功解析

 

End

说点什么
请务必填写正确的邮件地址,当有回复时您会收到邮件提醒。
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...