上传漏洞(二)

绕过上传漏洞

程序员在防止上传漏洞时可以分为以下两种:

客户端检测:客户端使用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容器版本,要及时更新,如果不需要,关闭危险配置项。

②使用白名单验证文件扩展名。

③接收文件,对文件进行重命名。

④严格控制文件上传路径,只要攻击者不知道文件路径,就很难造成攻击。

posted @ 2018-11-01 21:03  s1lenc3  阅读(288)  评论(0编辑  收藏  举报