来代码
简单分析
从以下两段可以看出需要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了
总结
本题不难,主要是代码审计,只要看懂代码其实是很好解决的
![[Geek 10th]李三的代码审计笔记第一页 [Geek 10th]李三的代码审计笔记第一页](https://cdn.jysafe.cn/wp-content/uploads/2019/10/2019101405190210.png!water.jpg)
![[Geek 10th]李三的代码审计笔记第一页 [Geek 10th]李三的代码审计笔记第一页](https://cdn.jysafe.cn/wp-content/uploads/2019/10/2019101405370253.png!water.jpg)
![[Geek 10th]李三的代码审计笔记第一页 [Geek 10th]李三的代码审计笔记第一页](https://cdn.jysafe.cn/wp-content/uploads/2019/10/2019101405361618.png!water.jpg)

