首先介绍一下getshell这个东西:

    websell:就是一种以web形式来操作的后门。

    getshell:的意思是可以通过某种漏洞达到留下后门的操作。

    静态shell:指的是网页的属性是静态页面还是动态页面。

    回到本题

    求getshell(bugku) - 图1

    求getshell(bugku) - 图2

    这是一个文件上传的题目。提示是只能上传图片,这时候就需要拿出我们的bp了

    先试试水,上传一个图片马,使用burp抓包,修改content-type为image/jpeg

    上传失败,可能是对文件进行了过滤:一共三个过滤

    • 请求头部的 Content-Type
    • 文件后缀
    • 请求数据的Content-Type

    这里是黑名单过滤来判断文件后缀,依次尝试php4,phtml,phtm,phps,php5(包括以下字母改变大小写)

    最终发现php5可以绕过

    原来这个题是对文件类型进行了二次判断

    求getshell(bugku) - 图3

    multipart/form-data:

    需要在表单中进行文件上传时,就需要使用该格式,意思是他通过表单对文件格式再进行一次判断,并会在后端进行判断,而且他好像只支持小写字符,所以我们通过对请求头中的Content-Type进行大小写绕过,将multipart/form-data随便大写一个字母就可以了。

    接下来,请求数据的Content-Type字段改为 image/jpeg

    但是一开始没注意到,上面还有一个请求头Content-Type字段,大小写绕过: mULtipart/form-data;

    求getshell(bugku) - 图4

    如果是walf严格匹配,通过修改Content-type后字母的大小写可以绕过检测,使得需要上传的文件可以到达服务器端,而服务器的容错率较高,一般我们上传的文件可以解析。然后就需要确定我们如何上传文件,在分别将后缀名修改为php2, php3, php4, php5, phps, pht, phtm, phtml(php的别名),发现只有php5没有被过滤,成功上传,得到flag

    就是说,我们改变了前面的大小写,破坏了文件上传的要求后,进行文件后缀名的修改,达到flag