1.信息收集:
从题目及题目描述:直到文件包含漏洞,怎样读取到文件;
2.思路:
<?php
highlight_file(__FILE__);
include("./check.php");
//php包含当前文件并执行指定的文件;
if(isset($_GET['filename'])){
//用于检查特定变量或数组键是否已设置且不为NULL的PHP函数;
$filename = $_GET['filename'];
include($filename);
}
?>
当包含include()函数时,PHP将在当前目录或PHP配置中指定的include_path中搜索文件check.php;
如果找到该文件,将执行其中的代码,并使当前脚本中定义的任何变量或函数在其中可用。
1.找漏洞点;
这个参数filename,,用户可以通过这个参数找到漏洞;
1.当我使用filename=php://filter/read=convert.base64-encode/resource=check.php及用其他参数时被过滤了;
2.漏洞的本质:是对各种输入进行过滤,我们要绕过,不被过滤掉,找到flag;
先去了解各种过滤器:PHP: 可用过滤器列表 - Manual
1.当试用各种字符串过滤器时,显示:没有成功;
2.当试用各种转换过滤器时,用convert.base64-encode 和 convert.base64-decode和convert.quoted-printable-encode 和 convert.quoted-printable-decode过滤器时,显示:
当我试用:convert.iconv.*: 官方文档:convert.iconv.* ¶
php支持的编码格式(部分): 官方文档:支持的字符编码 ¶
该 PHP 扩展支持的字符编码有以下几种:
- UCS-4*
- UCS-4BE
- UCS-4LE*
- UCS-2
- UCS-2BE
- UCS-2LE
- UTF-32*
- UTF-32BE*
- UTF-32LE*
- UTF-16*
- UTF-16BE*
- UTF-16LE*
- UTF-7
- UTF7-IMAP
- UTF-8*
这个使用burp suite,去试每个字符编码格式:
1.进行拦截:
2.字符编码格式复制,并找到一种能绕过的编码组合:
设置payload:两组,把各种字符编码复制,选择一组,有明显返回的:
2.利用漏洞,试:
http://61.147.171.105:55206/?filename=php://filter/convert.iconv.UTF-8*.UTF-32*%20/resource=check.php
改变参数:flag.php,得到flag;
总结:发现这种漏洞没有那么明显,需要不断的去试,要有耐心;