绕过上传漏洞
程序员在防止上传漏洞时可以分为以下两种:
客户端检测:客户端使用Javascript检测,在文件未上传时,就对文件进行验证。
服务端检测:服务端脚本一般会检测文件的MIME类型,检测文件扩展名是否合法,检测文件内容是否合法。
一、客户端检测绕过
(1)Firebug
firebug是火狐浏览器的插件,可以轻松调试前端代码。新版本的火狐浏览器应该自带了这个插件。使用firebug删除javascript的验证事件,javascript验证就会失效。
(2)中间人攻击
使用burpsuit进行中间人攻击,上传前先把文件改为合法名字,用burpsuit拦截请求,此时已经通过了客户端检测,然后在burpsuit中将文件名修改掉,Content-Length也要修改为对应的长度。
客户端验证是防止用户输入错误,减少服务器开销,服务器验证才可以真正防御攻击者。
二、服务端检测
(1)黑名单验证
在黑名单中定义一些不安全的扩展名,服务器收到文件后,与黑名单中的扩展名进行匹配,若匹配到,则认为文件不合法。黑名单过滤是不安全的,因为很可能漏掉一些扩展名。而且还有其他绕过方式,如:大小写绕过,windows下可以用‘asp.‘绕过,‘.’会被忽略。
(2)白名单验证
与黑名单方式相反,上传的文件与白名单的扩展名进行匹配,若匹配到,则上传成功,否则,拒绝上传。
白名单方式也不是绝对安全,如果配合一些解析漏洞,还是会有被攻击的可能,如IIS6.0会将1.asp;1.jpg当做JPG格式,但是会把它当做asp脚本来执行。
(3)MIME验证
MIME类型用来设定某种扩展名文件的打开方式,如GIF图片的MIME为image/gif,CSS文件的MIME类型为text/css。
这种验证方式得绕过也很简单,拦截HTTP上传文件的请求,将Content-Type修改,即可绕过。
(4)目录验证
有些网站在上传文件时,如果上传的目录不存在,则会新建一个文件夹,这是很危险的,如果Web容器为IIS6.0,我上传到一个后缀为.asp的目录,这个目录不存在,就会新建,然后上传恶意文件到这个目录,就会造成攻击。
(5)截断上传攻击
%00截断,比如:username%00admin,则只会显示username,%00之后的字符串被截断了。
我们上传一个1.asp php,然后用burpsuit拦截请求,点击HEX选项将文件名中的空格(16进制是20)改为00,即NULL,然后提交请求,上传的文件为1.asp,这样就造成了%00截断上传。
修复上传漏洞
修复上传漏洞也不难:
①查看Web容器版本,要及时更新,如果不需要,关闭危险配置项。
②使用白名单验证文件扩展名。
③接收文件,对文件进行重命名。
④严格控制文件上传路径,只要攻击者不知道文件路径,就很难造成攻击。
原文地址:https://www.cnblogs.com/whitehawk/p/9892506.html