一.学到的知识点:
- bool or die() 当 前面的 为真的时候,后面的就不执行了
- assert()语法 。的知识点如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。跟eval()类似, 不过eval($assertion)只是执行符合php编码规范的$code_str
assert(mixed $assertion, $exception) // 返回值为bool型
assert()会检查 assertion,并在结果为false的时候采取适当的行动。 - 自己的感觉把,就是assert()也是命令执行函数,但是要求比eval的低,只要里面有PHP的代码,然后动一动就能够执行了,详情可以看下面的
- 不足:。不够细心,没有研究透assert函数,并且刚开始没有想到去闭合strops这个函数,闭合后使strops这个函数依旧可以发挥作用。
讲真的没看懂是什么意思, 我这里一演示,就明白了,
第一次实验,感觉他和eval很像,能够执行任意命令
那么这句话, 当assertion结果为false的情况采取行动又是什么意思呢?
这里assertion为 false 也执行了,为true的时候更不用说,也执行,,,
那么这就感觉像一个eval一样, 但是要求比eval更低一点,eval里面必须是严格的PHP代码才能够执行,
但是这个assert()呢,只需要这个字符串里面有PHP的代码就好了!!!
这是我自己的猜测,网上没有找到。
二、我的做题思路
git 得到源码, 然后看index.php
<?php
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
$file = "templates/" . $page . ".php";
// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
//当file中有..时候,是ture,整个比较就是false,就执行后面的。
// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");
?>
page = flag的时候,就好。
直接这样传入flag也不对,当然也不可能这么简单。
三、WP做法:
assert()函数,会将括号中的字符串当作代码来执行,然后返回true或者false
assert("strpos('$file', '..') === false")
wp,就想着,将。
知道了assert能够执行,那就直接一 闭合 strpos(),然后写入我们的任意代码就好了啊
注意PHP中的连接符号使 .
这是分析payload用的,和sql注入一样的道理,尽量使他不报错就好,该闭合的都闭合了
同理,闭合可以,那么直接将后面的给注释掉也可以的呃
一样的道理
然后就命令执行就好了.
根据这里的题意可以flag在 templates/flag.php中,