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()}
?>
 
          

 

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM