来代码
简单分析
从以下两段可以看出需要url参数且值必须由http://
开头
empty($_GET["url"]) && die(); if (!startsWith($url,"http://")) { die("Not allow !"); }
不难发现for循环是取得flag的关键:
每一次循环都会访问我们提供的url并取得访问结果,
然后,将结果与arr[$i]
进行比较
而,arr
这个数组由前部分代码得到:
$password = "If I knew where I would die, I would never go there."; $arr = explode(' ', $password); $arr[0] == 'If'; $arr[1] == 'I'; . . .
也就是说,我们所提供的url每次访问的结果要与arr数组结果一样;
先放着,来看下一层
if($i == sizeof($arr)-1)
这一句,不难看出只有当for循环到最后一次是才成立,也就是说我们的url要经受住所有的验证,才能避免die("password is wrong");
回到上面,即我们第一次访问要输出If
,第二次输出I
……
那么我们就可以写这么一段PHP代码:
<?php $password = "If I knew where I would die, I would never go there."; $arr = explode(' ', $password); $str = file_get_contents('1.log'); echo $arr[$str]; $logFile = '1.log'; file_put_contents($logFile, $str + 1 );
需在同级目录下新建内容为0的1.log
文件
然后flag就GET了
总结
本题不难,主要是代码审计,只要看懂代码其实是很好解决的