打开题目链接
是一段php代码,应该是代码审计问题,首先分析源码
目标是输出flag变量,所以flag就在flag变量里面
输出条件有三个
flag变量长度等于$exam的长度,长度为49
flag变量不能包含` , “ , . , \ , ( , ) , [ , ] , _ , flag , echo , print , require , include , die , exit ;
eval($_GET[‘flag’]) === sha1($flag)
前面两个条件好绕过,就是第三个条件比较麻烦
我们可以利用php短标签来绕过
<? ?>和<?= ?>是短标签而<?php ?>是长标签,其中<?= 是代替 <? echo的,<? ?>代替的是<?php ?>,当PHP不支持使用短标签时,请到PHP的安装目录下找到PHP.INI文件:short_open_tag=On。php5默认的标记为<?php ?>
直接利用eval输出$flag变量的值,payload为?flag=$a='dlag';$a{0}='f';?>11111111111111111;<?=$$a;?>,其中?>用于闭合开头的<?php 标记,111…111是用来填充长度的。直接输出flag变量中的flag值,不需要再和sha1($flag)比较。