BUUCTF-Web-代码审计-[极客大挑战 2019]Secret File
题目链接:BUUCTF
代码类型:php语言
审计难度:低
知识点:字符串查找函数stristr()
、文件包含函数include()
解题过程:解题步骤在这篇文章中
审计过程
- secr3t.php
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(stristr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
发现一个关键变量$file=$_GET['file'];
,表示secr3t.php页面接受一个叫file的GET参数,因为是ger传参,可以直接通过url进行构造,比如
- test.php
<?php
$file=$_GET['file'];
echo "这是你传入的get参数内容:file=".$file;
?>
在浏览器的url上对test文件进行get传参
?file=Toert
当遇到源码上千行上万行的时,如果看到有可疑的变量,比如说 u s e r n a m e 、 username、 username、password、$file等这种类似名字的变量,遇到这样的变量我们可以通过搜索关键字去针对性审计
搜索关键字$file
,发现$file
变量在stristr()
函数里,再阅读整句代码
if(stristr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
写了一个if语句判断,条件用"||"或运算符处理,当四个stristr()
函数只要有一个返回真,那么条件就处理输出"Oh no!"字符串,stristr()
函数在php中用于字符串查找,如果找到就返回指定查找的关键字和字符串后面的内容并且忽略大小写,官网解释如下
了解完stristr()
函数的用法后,说明这个if整个语句是用于过滤我们传入的file参数,当我们传入的file参数中包含".//"、“tp”、“input”、“data"时,目标就会回显"Oh no!”,最后exit()
程序直接退出,这样的过滤方式称之为黑名单,黑名单可以通过一些规则进行绕过比如大小写,如果源程序用的函数是strstr()
,那就可以进行大小写绕过
如果file参数通过了if判断,最后程序通过include()
函数包含过滤后的$_GET['file']
文件,题目就是让我们绕过这个黑名单通过php伪协议去读取这个文件,黑名单规则就是只要不是禁止的那都是允许的,那也就是说如果过滤函数本身没办法绕过,那我们只要找一个即可以读取flag.php又不在黑名单里的封装协议就行,于是就想到了php://filter协议,这个协议恰好也不在黑名单中,所以最后直接通过php://filter去读出flag.php的内容得到flag
本文只针对代码进审计,解题过程可以去看前面写的BUUCTF-Web-文件包含-[极客大挑战 2019]Secret File