php代码审计
php代码审计
1(2018HCTF-Warmup)
分析
F12找到提示:source.php
1 | <?php |
因为对php不太熟悉,所以还是看了蛮久的,所以详细解释一下
首先从最下面的if else看起,如果’file’这个变量不为空,并且是字符串,并且checkFile(‘file’)为真,则include这个文件
然后现在再去上面看checkFile这个函数:首先建了一个数组,里面有两个变量“source.php”,”hint.php”,然后if判断若传入的变量page为空或者不是字符串,则输出“you can’t see it”,并且return false。
然后是in_array这个函数,就是判断变量page是否在数组whitelist里面,如果在,return true。
接着是下面的mb_substr函数,就是从第0位开始,返回变量page的mb_strpos($page . ‘?’, ‘?’)位,而mb_strpos则是返回“?”在page里第一次出现的位置,$page . ‘?’就是在page后面加上一个’?’,防止page里面本来没有‘?’,简单地说,这两个函数合在一起就是把问号后面的东西通通丢掉,所以我们就可以在问号后面做文章。
在下面的urldecode函数就是对page进行url解码,因为”只有字母和数字[0-9a-zA-Z]、一些特殊符号”$-_.+!*’(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。”
如果这三个in_array下来还是没有return true,则return false
解决
首先肯定是想着要checkFile为true,但是同时也需要能把包含flag的文件include出来,根据hint,flag应该在文件ffffllllaaaagggg中,刚开始想的是?file=source.php?ffffllllaaaagggg
然后利用某些方法在include把前面的source.php
隐去,但是找了一圈,似乎并没有这种方法,然后去看wp发现是利用/使得source.php
成为一个不存在的目录,然后../
返回上级目录,实测../
只能多不能少,所以ffffllllaaaagggg应该是在根目录中,但是如果这个文件藏在某个目录里面的话,emmmm
payload:?file=hint.php?/../../../../ffffllllaaaagggg
或者:?file=source.php?/../../../../ffffllllaaaagggg
2
文章标题:php代码审计
本文作者:Kyle
发布时间:2020-04-04, 23:14:51
最后更新:2020-09-19, 15:59:52
原始链接:https://silver2835.github.io/2020/04/04/php/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。