cisp-pte的一道文件包含题目笔记

0x00:

原本以为pte考试很简单,做了以前的真题 卧槽 还是有点难度的

0x01:

payload:echo ({${system("cat ../key.php")}});

进页面是一个文件包含的题目说明

图片待补**

此题考查的不是伪协议读文件,也不是包含日志文件拿shell等等

一开始踩坑了,在这方面试了很多次

后来才想起来查看view.html,查看源代码,得到后门代码

所以此题的利用点是:包含这个view.html进行命令执行

呐 只要解开这个后门代码即可。

解析这个payload
echo ({${system("cat ../key.php")}});
整个逻辑是这样的
此处的preg_match带了\e 可以拿来命令执行,执行的就是第二个参数 \1(\1就是我们正则匹配到的第一个数值)
所以这里的preg_match就是一个eval(\1)
所以此题有两个eval
嵌套是这样的
eval(\1)
而\1也需要被eval解析一下 就是 \1=eval(echo ({${system("cat ../key.php")}});)
所以整个逻辑是
第1步:eval(echo ({${system("cat ../key.php")}});) 此时需要一个eval来进行代码执行。eval已经耗费完了
第2步:\1={${system("cat ../key.php")}}
第3步:eval(\1) 此时需要一个eval来进行代码执行
第四步 因为eval(\1)已经执行完毕了 所以就只剩下了 {${system("cat ../key.php")}}
第五步:所以{${}}的用处就体现出来了,把这个system("cat ../key.php") 当做变量来执行,如果不加{${}}就是独立的system("cat ../key.php") 就解析成了字符串

解析:这里涉及到了php的动态变量,${}里面的值会当做变量值解析然后输出,例如${phpinfo()}就会输出phpinfo页面
那么{${system("cat ../key.php")}}解析过程就是 {$True}={null}=""空
所以页面就正常输出了我们想执行的命令
https://xz.aliyun.com/t/2557
这个博客说的很好
摘抄在下面

下面再说说我们为什么要匹配到 {${phpinfo()}} 或者 ${phpinfo()} ,才能执行 phpinfo 函数,这是一个小坑。这实际上是 PHP可变变量 的原因。在PHP中双引号包裹的字符串中可以解析变量,而单引号则不行。 ${phpinfo()} 中的 phpinfo() 会被当做变量先执行,执行后,即变成 ${1} (phpinfo()成功执行返回true)。如果这个理解了,你就能明白下面这个问题:

var_dump(phpinfo()); // 结果:布尔 true
var_dump(strtolower(phpinfo()));// 结果:字符串 '1'
var_dump(preg_replace('/(.*)/ie','1','{${phpinfo()}}'));// 结果:字符串'11'

var_dump(preg_replace('/(.*)/ie','strtolower("\\1")','{${phpinfo()}}'));// 结果:空字符串''
var_dump(preg_replace('/(.*)/ie','strtolower("{${phpinfo()}}")','{${phpinfo()}}'));// 结果:空字符串''
这里的'strtolower("{${phpinfo()}}")'执行后相当于 strtolower("{${1}}") 又相当于 strtolower("{null}") 又相当于 '' 空字符串

可以自己本地测试一下,动态变量只支持php5

<?php
preg_replace('/(.*)/ie','strtolower("\\1")','{${phpinfo()}}');
?>

还有如下的这种php动态调用

<?php
${phpinfo()}
?>
 
   
  
 



猜你喜欢

转载自www.cnblogs.com/Tkitn/p/12099483.html