?一、文件上传的原理
文件上传漏洞是指 由于程序员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上传可执行的动态脚本文件。如常见的 头像上传,图片上传,oa 办公文件上传,媒体上传,允许用户上传文件的地方如果过滤不严格,恶意用户利用文件上传漏洞,上传有害的可以执行脚本文件到服务器中,可以获取服务器的权限,或进一步危害服务器。
?二、文件上传的危害
非法用户可以上传的恶意文件控制整个网站,甚至是控制服务器,这个恶意脚本文件,又被称为 webshell ,上传 webshell 后门之后可查看服务器信息,目录,执行系统命令等。
?三、文件上传的类型(重点)
?1.前端js绕过
绕过前端 js 检测上传
在文件上传时,用户选择文件时,或者提交时,有些网站会对前端文件名进行验证,一般检测后缀名,是否为上传的格式。如果上传的格式不对,则弹出提示文字。此时数据包并没有提交到服务器,只是在客户端通过 js 文件进行校验,验证不通过则不会提交到服务器进行处理。
上传思路:
按 F12 使用网页审计元素,把校验的上传文件后缀名文件删除,即可上传。把恶意文件改成 js 允许上传的文件后缀,如 jpg、gif、png 等,再通过抓包工具抓取 post 的数据包,把后缀名改成可执行的脚本后缀如 php 、asp、jsp、net 等。即可绕过上传。
火狐浏览器怎么禁止javascript:
在fierfox的地址栏中,输入 about:config ,按enter键进行检索。
在搜索框里输入javascript.enabled ,回车
?2.修改Content-Type绕过
绕过 contnet-type 检测上传
有些上传模块,会对 http 的类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务端是通过 content-type 判断类型,content-type 在客户端可被修改。
思路:
上传脚本文件,抓包把 content-type 修改成 image/jpeg即可绕过上传。
?3.绕黑名单
绕过黑名单上传
上传模块,有时候会写成黑名单限制,在上传文件的时获取后缀名,再把后缀名与程序中黑名单进行检测,如果后缀名在黑名单的列表内,文件将禁止文件上传。
上传图片时,如果提示不允许 php、asp 这种信息提示,可判断为黑名单限制,上传黑名单以外的后缀名即可。在 iis 里 asp 被禁止上传了,可以上传 asa cer cdx 这些后缀,如在网站里允许.net 执行 可以上传 ashx 代替 aspx。如果网站可以执行这些脚本,通过上传后门即可gebshell。在不同的中间件中有特殊的情况,如果在 apache 可以开启 application/x-httpd-php 在 AddType application/x-httpd-php .php .phtml .php3 后缀名为 phtml 、php3 均被解析成 php 有的 apache 版本默认就会开启。上传目标中间件可支持的环境的语言脚本即可,如.phtml、php3。
?4.htaccess 重写解析绕过
上传模块,黑名单过滤了所有的能执行的后缀名,如果允许上传 .htaccess 。htaccess 文件的作用是 可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP 地址的用户、只允许特定 IP 地址的用户、禁止目录列表,以及使用其他文件作为 index 文件等一些功能。在 htaccess 里写入 SetHandler application/x-httpd-php 则可以文件重写成 php 文件。要 htaccess 的规则生效 则需要在 apache 开启 rewrite 重写模块,因为 apache 是多数都开启这个模块,所以规则一般都生效。
上传.htaccess 到网站里.htaccess 内容如下:
FilesMatch "jpg">SetHandler application/x-httpd-php/FilesMatch>
再上传恶意的 jpg 到.htaccess 相同目录里,访问图片即可获取执行脚本。
?5.大小写绕过
有的上传模块 后缀名采用黑名单判断,但是没有对后缀名的大小写进行严格判断,导致可以更改后缀大小写可以被绕过。如 PHP、 Php、 phP、pHp
?6.空格绕过
在上传模块里,采用黑名单上传,如果没有对空格进行去掉可能被绕过。抓包上传,在后缀名后添加空格
? 7.windows 系统特征绕过
在 windows 中文件后缀名. 系统会自动忽略.所以 shell.php. 和 shell.php 的效果一样。所以可以在文件名后面加上.即可绕过。
抓包修改在后缀名后加上.即可绕过。
?8.NTFS 交换数据流::$DATA
如果后缀名没有对:: $ DATA 进行判断,利用 windows 系统 NTFS 特征可以绕过上传。burpsuite 抓包,修改后缀名为 php::$DATA
?9.叠加特征绕过
在 windwos 中如果上传文件名 test.php:.jpg 的时候,会在目录下生产空白的文件名 test.php再利用 php 和 windows 环境的叠加属性,
以下符号在正则匹配时相等双引号” 等于 点号. 大于符号> 等于 问号?小于符号>>或文件名.>> 首先抓包上传 a.php:.php 上传会在目录里生成 a.php 空白文件,接着再a.php 改成 a.>>>
?10.双写后缀名绕过上传
在上传模块,有的代码会把黑名单的后缀名替换成空,例如 a.php 会把 php 替换成空,但是可以使用双写绕过例如 asaspp,pphphp, 即可绕过上传抓包上传,把后缀名改成 pphphp 即可绕过
?11.目录可控%00 截断绕过
使用白名单验证会相对比较安全,因为只允许指定的文件后缀名。但是如果有可控的参数目录,也存在被绕过的风险.代码中使用白名单限制上传的文件后缀名,只允许指定的图片格式。但是$_GET[‘save_path’]服务器接受客户端的值,这个值可被客户端修改。所以会留下安全问题
上传参数可控当 gpc 关闭的情况下,可以用%00 对目录或者文件名进行截断。php 版本小于 5.3.4首先截断攻击,抓包上传将%00 自动截断后门内容。例如 1.php%00.1.jpg 变成 1.php
?12.二次渲染
有些图片上传,会对上传的图片进行二次渲染后在保存,体积可能会更小,图片会模糊一些,但是符合网站的需求。例如新闻图片封面等可能需要二次渲染,因为原图片占用的体积更大。访问的人数太多时候会占用,很大带宽。二次渲染后的图片内容会减少,如果里面包含后门代码,可能会被省略。导致上传的图片马,恶意代码被清除
首先判断图片是否允许上传 gif,gif 图片在二次渲染后,与原图片差别不会太大。所以二次渲染攻击最好用 git 图片马制作图片马将原图片上传,下载渲染后的图片进行对比,找相同处,覆盖字符串,填写一句话后门,或者恶意指令。原图片与渲染后的图片这个位置的字符串没有改变所在原图片这里替换成一句话木马直接上传即可
?四、文件上传的思路
寻找已授权网站的文件上传的模块,例如常见的头像上传,修改上传,文件编辑器中文件上传,图片上传、媒体上传 等等。
通过抓包上传恶意的文件进行测试,上传后缀名 asp php aspx 等的动态语言脚本,查看上传时的返回信息,判断是否能直接上传,如果不能直接上传,再进行测试上传,寻找突破口。
例如上传文件的时候只允许图片格式的后缀,但是修改文件时,却没有限制后缀名,图片文件可以修改成动态语言格式如 php,则可能访问这个文件的 URL 直接 getshell,控制网站。
文件上传时会返回一些代码给客户端,我们可以根据这些值判断上传是否正常值:
0: 没有错误发生,文件上传成功。
1:上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
2:上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
3:文件只有部分被上传。
4: 没有文件被上传
?五、修复方案
在网站中存在上传的模块,做好权限认证,不能让匿名用户可访问。文件上传目录设置为禁止脚本文件执行。这样设置即使被上传后门的动态脚本也不能解析。设置上传白名单,白名单只允许图片上传如,jpg png gif ,其他文件后缀名均不允许上传等等。
?六、语录驿站
我刺瞎自己的双眼,只为记住那最后的红颜!
———— 盲僧