bugku web 闪电十六鞭
打开靶场,看样子是代码审计题
$exam的值为return'当前的时间的sha1值',接下来看限制条件:
如果没有用get传参传入flag,则会显示Click here
判断flag的长度与$exam的长度是否一致,若不一致则返回‘长度不允许’
进行关键字过滤
如果传入的flag的值与flag值的sha1值相等的话,则打印出flag,这里我们连flag值都不知道,更别提flag的sha1值了,但是值得注意的是,存在eval()函数,我们可以通过构造php代码来绕过这个规则
接下来就是构造payload的过程,先点击页面的Click here,发现在url处返回了一串字符
根据前文我们不难得出返回的是$exam = return'55c59b2f8361a0c62495127b26415b9cd6b54e1d';,len($exam)=50;
此时再将目光放在过滤的关键字上,发现过滤掉了echo和flag,这是我们实现绕过所必需的两个关键字,只能通过别的方式来替代了
首先要介绍的是php短标签风格:
①开启短标签风格后,能够正常解析 phpinfo(); ?>这样的代码
②可以使用<?=$a?>进行输出。举个例子:<php? echo 'hello'; ?> 等价于 <?='hello';?>
其次,flag被过滤了,可用先赋其他值,再修改的方法绕过
由于[]也被过滤掉了,我们需要用{}来代替其作用。最后,还要保证的一点就是长度,若长度不够,可以在中间插入无关的字符
payload = ?flag=$a='flxg';$a{2}='a';11111111111111111;?><?=$$a;?>,因为短标签格式是可以识别phpinfo() ?>等类似只有?>形式的代码,所以payload前半段不需要加上<?