前置知識
eval: 把字符串按照 PHP 代碼來執行,例如eval(“echo 1;”);這個函數擁有回顯
system:使php程序執行系統命令,例如,system(“ls”);就是查看當前目錄,這個擁有回顯
preg_match:查找字符串是否匹配一個正則表達式。參數1是正則表達式,參數2是字符串,其他可選參數請自行學習
linux基礎命令:
- ls:展示當前目錄下的所有文件
- cat:輸出當前文件的所有內容
- tac:從最后一行開始逐行向上遍歷輸出當前文件的所有內容
信息收集
這里學習php不是一蹴而就的,我剛開始學習的時候也是直接搭建了php的網站,把題目復制到本地,然后自己調試,以此來學習php的函數。我希望讀者也能如我一樣有一個自己的php網站,用于學習這些php函數代碼。
這里的preg_match("/flag/i", $c)
表示變量$c
是否存在flag這個子字符串,最后的/
表示需要遵循的匹配規則,i
是大小寫忽略
所以這句代碼的意思是,$c
里是否有flag,大小寫忽略,例如fLAg也能正確匹配
而取反后,我們的提交的參數c不能包含flag字樣
解題
這里僅提供一些解題的思路,起到拋磚引玉的作用,我不可能列舉出所有的方法,想到啥就寫啥了。
這里我們使用system(“ls”);查看當前目錄,是否存在我們想要的flag
方法1
接下來,我們本應該system("cat flag.php");
即可,但flag被過濾了,我們的輸入中有flag就不會執行eval。想要繞過flag非常簡單,只需要tac fla*
就可以了
為什么不用cat而是tac呢,因為cat獲取了完整的php內容,包括<?php ... ?>和注釋,這會被eval()
當做代碼解析,這不是我們希望看到的,我們希望獲得的就是php的源碼。
方法2
c=system("cp fla* a.txt");
將flag.php復制到a.txt
方法3
我們可以給system
傳變量,這樣$c里沒有flag,而我們在其他變量里傳入flag.php就能完美繞過它的限制
web28 ?? 目錄 ?? web30