Bugku-10.闪电16鞭-php语句构造
代码审计
长度要为len("return'7512158cb1d484b7a54f6c004b943687c4c66015';")=49
由源码知道,$flag可以输出,且输出后就是需要的flag
关于eval()函数
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false
使用短标签可以构造出echo
<? ?>
和<?= ?>
是短标签而<?php ?>
是长标签,其中<?=
是代替<? echo
的,<? ?>
代替的是<?php ?>
,
当你发现你的PHP不支持使用短标签,请到PHP的安装目录下找到php.ini文件,使用Ctrl+F搜索short_open_tag ,
然后将等号后面的Off改成On,再重新启动Apache服务,那么短标签就会被识别了
因此构造<?=$flag;?>
就可以输出了,但是flag被过滤了
$a
构造一个flag字符串,然后echo $$a
,不过[]
被过滤了
用大括号代替方括号
在PHP中,大括号“{}”可以起到如下作用:
- 将多个独立语句合并为一个复合语句,例如 if ... else ...中经常如此使用
- 在变量间接引用中进行定界,避免歧义。例如 ${$my_var[8]}与${$my_var}[8]的区分
- 用于指示字符串变量中的单个字符(下标从0开始),例如
$my_str="1234"; $my_str{1}='5'; //现在 $my_str 内容为 '1534'
因此最后构造
?flag=$a='fla1';$a{3}='g';?><?=$$a;?>111111111111111111
第一个;?>
是为了让代码开头的<?php
闭合,不然<?=$$a?>
无法执行