文件上传漏洞是指攻击者上传了一个可执行的脚本文件到服务器,并执通过此脚本文件获得执行服务端命令的能力。这里上传的文件可以是木马,病毒,恶意脚本,钓鱼图片或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。
文件上传功能本身是一个正常业务需求,而问题就在于,服务器如何处理解释这个文件,当处理逻辑不够安全,导致严重后果
进入题目显示无限制的上传,那我们可以随意上传文件尝试后,返回上传文件的相对路径,可以直接访问,并可以执行php代码文件,那我们写一个一句话木马的php文件并上传,利用工具中国蚁剑,通过已知的URL和上传文件相对路径,构造playload的。
连上网站,在工具的文件管理界面找到目标文件获取flag
该题目提示为js前端验证,那应该基本是前端验证文件后缀名
我们可以验证看看用burp开启抓包,上传一个php文件,这时候弹窗提示"该文件不允许上传",但我们的burp并无抓取到数据,可以推测出这里只是用前端js代码写了个前端验证文件后缀的代码
可以看网站源码有文件前端代码
文件检测类型:客户端验证(前端)- JavaScript检查
解题思路有两种
方法1:浏览器禁用JavaScript,js不会验证文件后缀名,就可以直接上传了
方法2:burp抓包 先上传白名单文件(将带有一句话木马php文件的后缀名先改成png或其他白名单信息),再用burp抓包后修改回文件后缀为php。
提示:htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
要点:htaccess负责网页配置,假如我们自定义一个规则,并让服务器运行我们定义的规则,覆盖服务器的.htaccess,便可绕过上传限制
访问url,上传一个php文件显示失败,上传png显示成功
说明后端进行了文件后缀名的验证,可以通过查看源代码也可以看到
进行了文件后缀黑名单的验证过滤
思路
需要构造.htaccess,来让服务器把我们上传的png当作php解析
(1)上传.htaccess(代码如下)
SetHandler application/x-httpd-php
#进行文件名的正则匹配,服务器会对文件名为1.png当做php解析
PS:最开始我尝试用的是下面的,不知道为什么不行,纳闷
AddType application/x-httpd-php .png
(2)上传带有一句话木马 1.png文件(不需要图片马,直接后缀名为png即可)
(3)工具连接获取flag
要点:MIME 绕过,文件通过检测content-type字段,判断上传文件的类型,来检测上传文件是否为黑名单
思路:修改content-type,绕过content-type检测
进入页面,已经说明这里是后端的MIME验证,随意上传一个php文件,提示类型不符合 无法上传,再上传图片类型 可以上传。
上传带有一句话木马的php文件,burp抓包,修改content-type字段来尝让检测 修改成image/png ,放包,提示上传成功,利用蚁剑连接获得flag
image/jpeg :jpg图片格式
image/png :png图片格式
image/gif :gif图片格式
text/plain :纯文本格式
text/xml : XML格式
text/html : HTML格式
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
这道题的要点就是content-type字段内容符合上传文件规则即可,当然换一种思路也可以绕过,将恶意文件先修改后缀为白名单上传,content-type字段检测是jpg格式,然后再用burp修改回php后缀,也可以上传成功
要点:在针对上传文件的检查中,很多应用都是通过判断文件名后缀的方法来验证文件的安全性的,但再某些时候,攻击者通过手动修改上传的POST包,添加0x00,来截断某些函数对文件名的判断在许多语言的函数中,%00被认为终止符,当函数碰到%00,就会停止对后面的判断,00截断就是基于这种逻辑漏洞来绕过检测。
php 版本<5.3.4 才有可能存在此漏洞
test.php ->上传失败
test.jpg ->上传成功
test.png ->上传成功
test.png.php ->上传失败
test.php.png ->上传成功
上传test.php 修改后缀成为 test.jpg ->上传成功
我们大致可以判断出,后端在上传时,只是通过获取上传的文件的最后的后缀,来判断是否可以上传。但上传的内容并无返回url路径,但 且url返回了?road=/var/www/html/upload/ 。根据之前几题的路径去尝试访问也无法访问,说明他的访问方式不对,这时候我们看一下源码,它提供了一部分主要后端代码,简单的解释了一下代码
根据前面的一系列判断,构造恶意代码,上传一句话木马文件(要求后缀必须为白名单),修改原 ?road=/var/www/html/upload/ 的内容为下图的playload,结合上面的代码大致意思就是将上传的文件保存为1.php文件(源码构造的内容会因为%00截断不执行),放包显示上传成功,然后访问1.php可以访问,于是可以利用蚁剑工具连接成功
这里,我们连上后也可以看到之前上传的文件,看到文件名再联系之前源代码应该能大概知道了吧
获取flag
访问网站 提示双写绕过
尝试上传php文件,提示上传成功,但返回的内容文件名的后缀被去除了,根据题目名,应该要双写绕过。
查看源码是黑名单检测,那就有很多的绕过姿势了(对于上传文件的安全检测,利用黑名单检测是非常不安全的行为,这可以导致非常多的绕过文件,应该使用白名单来严格检测文件后缀名)
利用burp抓包,对php进行双写,放包
显示上传成功文件后缀为php,使用蚁剑工具连接
访问,页面提示是文件头检测
(1)先进行一波简单的测试 发现他的前端 js 代码会先对上传文件后缀进行一波检测。 通过修改文件名后缀或者禁用 js脚本可以绕过了(为了方便测试 我直接禁用了)
(2)当我们绕过前端后,发现后端还会MIME验证 根据文件头的content-type字段判断上传文件类型 ,修改成 image/jpg可以绕过
(3)绕过content-type后发现提示是文件错误,按照题目这里应该就是对文件头的检测了 ,在文件内容的最前面加个白名单的文件头内容就可以绕过了。
常用文件头
.gif
GIF89a
JPEG .JPE .JPG
JPGGraphicFile
.zip
ZipCompressed
.doc .xls .xlt .ppt .apr
MS Compound Document v1 or Lotus Approach APRfile
当然也可以直接做一张图片马来上传,只有注意上传后将后缀名改为PHP即可(图片马制作流程见下方)
PS:
图片马制作
在cmd里执行 copy logo.jpg/b+test.php/a test.jpg
logo.jpg为任意图片
test.php为我们要插入的木马代码
test.jpg为我们要创建的图片马
名字可任意 格式图片必须在php文件前面
注意 图片的内容要尽量简短,以防内容过于复杂存在的一些字符会影响到原来的php内容(可以用画图工具直接新建一个画图然后保存)