title: upload-labs
tags: upload-labs
abbrlink: 80f02bc5

date: 2022-08-14 15:40:44

靶场地址

https://github.com/c0ny1/upload-labs

一句话

<?php @eval($_POST[123]);?>

WebShell连接工具

中国蚁剑

https://github.com/AntSwordProject/antSword

AntSword 加载器

https://github.com/AntSwordProject/AntSword-Loader

菜刀

Pass-01

  1. 写一个一句话文件,后缀改成允许上传的文件类型
  2. bp抓包,把后缀改成.php
  3. 蚁剑连接

    Pass-02

  4. 新建后缀.php的文件
  5. bp抓包
  6. 将Content-Type修改为允许上传的类型(image/jpeg、image/png、image/gif)三选一

    Pass-03

  7. 黑名单验证
  8. 如果黑名单定义不完整的话是可以实现绕过的,用.phtml .phps .php5 .pht进行绕过。这里我们直接上传一个.php5文件
  9. 因为上传上去的文件名会改变,bp抓包数据包中有回显,所以我们还是可以访问的。

    注意

  10. 要在apache的httpd.conf中有如下配置代码:AddType application/x-httpd-php .php .phtml .phps .php5 .pht,如果不配置他是无法解析php5代码的,访问的时候就是一个空白页

    Pass-04

  11. 可以看到禁止上传文件太多了
  12. 首先创建一个.htaccess文件,里面写上代码
    <FilesMatch "1.png">
    SetHandler application/x-httpd-php
    </FilesMatch>
    
  13. 这串代码的意思是如果文件中有一个1.png的文件,他就会被解析为.php.
  14. 再上传一个1.png的文件就能访问了

    注意

    .htaccess文件不能起名字,他就是.htaccess文件,如果你将他改为1.htaccess或者其他的什么名字是不可以的,无法解析。在实战中有可能上传上去这个文件会被自动重命名,被重命名了就不可以了。

    Pass-05

  15. 这一关没有强制将大写转换为小写,所以我们可以上传纯大写或者大小写结合的后缀名
  16. 直接上传一个后缀名为.PHP的文件,上传后或自动改名字bp抓包可以看见
  17. 我们可以看到上传成功,访问

    Pass-06

    注意

  18. Win下`xx.jpg空格和``xx.jpg.`两种文件是不被允许存在的,要是这样命名文件,windows系统会默认删除空格``或者`.`
  19. 我们用burp抓包将filename=“12345.php"改为filename=“12345.php “(12345.php空格)

    Pass-07

  20. 和第七关思路一样,就是把空格换成点

    Pass-08

  21. Windows本地文件系统中的文件流(File Streams):
    当从 Windows shell 命令行指定创建文件时,流的完整名称为 “filename:stream name:stream type”,如示例中所示: “myfile.txt:stream1:$DATA”
  22. 和上一关一样,直接上传,在数据包的php后面直接加上`::$DATA`

    Pass-09

  23. 这一关的思路是它没有循环验证,也就是说这些收尾去空,删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。
  24. 所以我们的绕过思路就很简单,在数据包中把后缀名改为`.php. .`

    Pass-10

  25. 将文件名改为.pphphphpp

    Pass-11

    POST /upload-labs/Pass-11/index.php?save_path=../upload/%00 HTTP/1.1
    

Content-Disposition: form-data; name=“upload_file”; filename=“pi .jpg”

* 但是有环境限制: php版本要小于5.3.4,5.3.4及以上magic_quotes_gpc需要为OFF状态
# Pass-12
跟上一关产不多 只不过是接受值变成了post,她两的差别呢就是get会自行解码,post不会自行解码,我们需要对%00进行编码,选中%00右键
# Pass-13
* 图片+php代码,组成一个图片码进行上传
* 首先制作一个图片码,可以直接用Notepad直接打开图片后面加一个php代码,但是需要16进制,要不然图片可能出错。
* 也可以cmd进行生成,命令语句:copy i.jpg /b + pi.php /a webshell.jpg
* upload-labs/include.php?file=upload/6520220814071149.png
# Pass-14
* getimagesize函数,这个函数的意思是:会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的
* 这关还是用和上关一样的方法,生成带有php代码的图片上传,配合包含漏洞拿下此关。
# Pass-15
* 第15关同14,13关思路一样,操作一样。但是需要打开php_exif,
* exif_imagetype() 读取一个图像的第一个字节并检查其签名。
# Pass-16
本关综合判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后对图片再做了一次二次渲染重新创建,所以在上传图片马的时候将上传后的图片马下载下来进行查看,看看它经过而渲染后的图片中的那些数据没有改变,可以通过16进制编辑器查看,然后我们在这些没有变的地方插入一句话,这样就可以成功上传了。之后的操作与之前的关卡一样
# Pass-17
本关考察的是条件竞争 通过白名单检测后缀名,符合就rename改名,不符合就unlink删除文件 可以用burp来发包不断访问,先写一个php写入文件的1.php然后在不断访问这文件就可以看到我们上传的东西了,而且在访问这文件就可以生成另外一个shell了(通过马生成的)
# Pass-18
和上一关几乎一模一样
# Pass-19
本关考察CVE-2015-2348 move_uploaded_file() 00截断,上传webshell,同时自定义保存名称,直接保存为php是不行的,查看源码发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过
# Pass-20
通过查看源码可以发现:

$file_name经过reset($file) . '.' . $file[count($file) - 1];处理。

如果上传的是数组的话,会跳过$file = explode('.', strtolower($file));。

并且后缀有白名单过滤:

$ext = end($file); $allow_suffix = array('jpg','png','gif');

而最终的文件名后缀取的是$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。