secureCodeBox/secureCodeBox

View on GitHub
scanners/zap/parser/__testFiles__/juice-shop.xml

Summary

Maintainability
Test Coverage
<!--
SPDX-FileCopyrightText: the secureCodeBox authors

SPDX-License-Identifier: Apache-2.0
-->

<?xml version="1.0"?><OWASPZAPReport version="D-2020-10-13" generated="Thu, 22 Oct 2020 07:58:22">
<site name="http://juice-shop:3000" host="juice-shop" port="3000" ssl="false"><alerts><alertitem>
  <pluginid>10098</pluginid>
  <alert>Cross-Domain Misconfiguration</alert>
  <name>Cross-Domain Misconfiguration</name>
  <riskcode>2</riskcode>
  <confidence>2</confidence>
  <riskdesc>Medium (Medium)</riskdesc>
  <desc>&lt;p&gt;Web browser data loading may be possible, due to a Cross Origin Resource Sharing (CORS) misconfiguration on the web server&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFK7mu&amp;sid=0b5CIcRfebjeUP6IAAAN</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/polyfills-es5.js</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/quarantine/juicy_malware_windows_64.exe.url</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJzM-</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/rest/admin/application-configuration</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/rest/products/search?q=</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/eastere.gg</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/assets/public/images/carousel/4.jpg</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/suspicious_errors.yml</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/coupons_2013.md.bak</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJzWy&amp;sid=NHcMgUohTH8k9p2zAAAL</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/main-es5.js</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/assets/public/images/products/permafrost.jpg</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/rest/continue-code</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/main-es2018.js</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/quarantine/juicy_malware_linux_amd_64.url</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJwR_</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/sitemap.xml</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJkNZ</uri>
  <method>GET</method>
  <evidence>Access-Control-Allow-Origin: *</evidence>
  </instance>
  </instances>
  <count>99</count>
  <solution>&lt;p&gt;Ensure that sensitive data is not available in an unauthenticated manner (using IP address white-listing, for instance).&lt;/p&gt;&lt;p&gt;Configure the &quot;Access-Control-Allow-Origin&quot; HTTP header to a more restrictive set of domains, or remove all CORS headers entirely, to allow the web browser to enforce the Same Origin Policy (SOP) in a more restrictive manner.&lt;/p&gt;</solution>
  <otherinfo>&lt;p&gt;The CORS misconfiguration on the web server permits cross-domain read requests from arbitrary third party domains, using unauthenticated APIs on this domain. Web browser implementations do not permit arbitrary third parties to read the response from authenticated APIs, however. This reduces the risk somewhat. This misconfiguration could be used by an attacker to access data that is available in an unauthenticated manner, but which uses some other form of security, such as IP address white-listing.&lt;/p&gt;</otherinfo>
  <reference>&lt;p&gt;http://www.hpenterprisesecurity.com/vulncat/en/vulncat/vb/html5_overly_permissive_cors_policy.html&lt;/p&gt;</reference>
  <cweid>264</cweid>
  <wascid>14</wascid>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>10029</pluginid>
  <alert>Cookie Poisoning</alert>
  <name>Cookie Poisoning</name>
  <riskcode>0</riskcode>
  <confidence>1</confidence>
  <riskdesc>Informational (Low)</riskdesc>
  <desc>&lt;p&gt;This check looks at user-supplied input in query string parameters and POST data to identify where cookie parameters might be controlled. This is called a cookie poisoning attack, and becomes exploitable when an attacker can manipulate the cookie in various ways. In some cases this will not be exploitable, however, allowing URL parameters to set cookie values is generally considered a bug.&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJiBX&amp;sid=i44E23_d7HysXmYyAAAF</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJZAS&amp;sid=xm0oUZMe5lefHrYkAAAB</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJkP3&amp;sid=L5sTGQm7gTPIvgamAAAG</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJwTQ&amp;sid=m1nJpf-U7x4l9EdgAAAK</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJv2N&amp;sid=PktdCTeisMU99B0XAAAJ</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJec3&amp;sid=N2BAvk-LoI6ydM_fAAAD</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYaS&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>POST</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJc38&amp;sid=RwTg5sM3urRvTowDAAAC</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFKABn&amp;sid=OP1vxyAS7ESoZCFeAAAO</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJzWy&amp;sid=NHcMgUohTH8k9p2zAAAL</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJfF2&amp;sid=QfhYpBR7a8XY6KopAAAE</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJqEu&amp;sid=Qno6lcSl69M4txIfAAAI</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJmDG&amp;sid=5CB4rI51v9EBwoLaAAAH</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYaU&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYh4&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>POST</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYKz&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFK7mu&amp;sid=0b5CIcRfebjeUP6IAAAN</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFK4S_&amp;sid=Snz1P_3VBpE70slrAAAM</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFKC2m&amp;sid=wTbs-39HN_Hq77_nAAAP</uri>
  <method>GET</method>
  <param>sid</param>
  </instance>
  </instances>
  <count>19</count>
  <solution>&lt;p&gt;Do not allow user input to control cookie names and values. If some query string parameters must be set in cookie values, be sure to filter out semicolon&apos;s that can serve as name/value pair delimiters.&lt;/p&gt;</solution>
  <otherinfo>&lt;p&gt;An attacker may be able to poison cookie values through URL parameters.  Try injecting a semicolon to see if you can add cookie values (e.g. name=controlledValue;name=anotherValue;).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;This was identified at:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJiBX&amp;sid=i44E23_d7HysXmYyAAAF&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;User-input was found in the following cookie:&lt;/p&gt;&lt;p&gt;io=i44E23_d7HysXmYyAAAF; Path=/; HttpOnly; SameSite=Strict&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The user input was:&lt;/p&gt;&lt;p&gt;sid=i44E23_d7HysXmYyAAAF&lt;/p&gt;</otherinfo>
  <reference>&lt;p&gt;http://websecuritytool.codeplex.com/wikipage?title=Checks#user-controlled-cookie&lt;/p&gt;</reference>
  <cweid>20</cweid>
  <wascid>20</wascid>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>10096</pluginid>
  <alert>Timestamp Disclosure - Unix</alert>
  <name>Timestamp Disclosure - Unix</name>
  <riskcode>0</riskcode>
  <confidence>1</confidence>
  <riskdesc>Informational (Low)</riskdesc>
  <desc>&lt;p&gt;A timestamp was disclosed by the application/web server - Unix&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000/rest/admin/application-configuration</uri>
  <method>GET</method>
  <evidence>1970691216</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/rest/products/search?q=</uri>
  <method>GET</method>
  <evidence>1970691216</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es5.js</uri>
  <method>GET</method>
  <evidence>179464974</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es5.js</uri>
  <method>GET</method>
  <evidence>0000039834</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es2018.js</uri>
  <method>GET</method>
  <evidence>597720130</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es2018.js</uri>
  <method>GET</method>
  <evidence>1801948466</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es5.js</uri>
  <method>GET</method>
  <evidence>1803700518</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/styles.css</uri>
  <method>GET</method>
  <evidence>33335333</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es5.js</uri>
  <method>GET</method>
  <evidence>0000051215</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/styles.css</uri>
  <method>GET</method>
  <evidence>33333333</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es2018.js</uri>
  <method>GET</method>
  <evidence>0000000005</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es5.js</uri>
  <method>GET</method>
  <evidence>0000000005</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/styles.css</uri>
  <method>GET</method>
  <evidence>33334333</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/polyfills-es5.js</uri>
  <method>GET</method>
  <evidence>94906265</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es2018.js</uri>
  <method>GET</method>
  <evidence>1801949248</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es5.js</uri>
  <method>GET</method>
  <evidence>1801948466</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es2018.js</uri>
  <method>GET</method>
  <evidence>1803700518</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/rest/admin/application-configuration</uri>
  <method>GET</method>
  <evidence>1969196030</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/polyfills-es5.js</uri>
  <method>GET</method>
  <evidence>62425156</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es5.js</uri>
  <method>GET</method>
  <evidence>597720130</evidence>
  </instance>
  </instances>
  <count>29</count>
  <solution>&lt;p&gt;Manually confirm that the timestamp data is not sensitive, and that the data cannot be aggregated to disclose exploitable patterns.&lt;/p&gt;</solution>
  <otherinfo>&lt;p&gt;1970691216, which evaluates to: 2032-06-12 22:13:36&lt;/p&gt;</otherinfo>
  <reference>&lt;p&gt;http://projects.webappsec.org/w/page/13246936/Information%20Leakage&lt;/p&gt;</reference>
  <cweid>200</cweid>
  <wascid>13</wascid>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>3</pluginid>
  <alert>Session ID in URL Rewrite</alert>
  <name>Session ID in URL Rewrite</name>
  <riskcode>2</riskcode>
  <confidence>3</confidence>
  <riskdesc>Medium (High)</riskdesc>
  <desc>&lt;p&gt;URL rewrite is used to track user session ID. The session ID may be disclosed via cross-site referer header. In addition, the session ID might be stored in browser history or server logs.&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJwTQ&amp;sid=m1nJpf-U7x4l9EdgAAAK</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>m1nJpf-U7x4l9EdgAAAK</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=websocket&amp;sid=N2BAvk-LoI6ydM_fAAAD</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>N2BAvk-LoI6ydM_fAAAD</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFKABn&amp;sid=OP1vxyAS7ESoZCFeAAAO</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>OP1vxyAS7ESoZCFeAAAO</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJec3&amp;sid=N2BAvk-LoI6ydM_fAAAD</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>N2BAvk-LoI6ydM_fAAAD</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=websocket&amp;sid=PktdCTeisMU99B0XAAAJ</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>PktdCTeisMU99B0XAAAJ</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYaU&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>r2xfyQoKfs1Qc7gKAAAA</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=websocket&amp;sid=RwTg5sM3urRvTowDAAAC</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>RwTg5sM3urRvTowDAAAC</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=websocket&amp;sid=NHcMgUohTH8k9p2zAAAL</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>NHcMgUohTH8k9p2zAAAL</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJv2N&amp;sid=PktdCTeisMU99B0XAAAJ</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>PktdCTeisMU99B0XAAAJ</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=websocket&amp;sid=m1nJpf-U7x4l9EdgAAAK</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>m1nJpf-U7x4l9EdgAAAK</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYh4&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>POST</method>
  <param>sid</param>
  <evidence>r2xfyQoKfs1Qc7gKAAAA</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=websocket&amp;sid=wTbs-39HN_Hq77_nAAAP</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>wTbs-39HN_Hq77_nAAAP</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=websocket&amp;sid=Snz1P_3VBpE70slrAAAM</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>Snz1P_3VBpE70slrAAAM</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=websocket&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>r2xfyQoKfs1Qc7gKAAAA</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJqEu&amp;sid=Qno6lcSl69M4txIfAAAI</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>Qno6lcSl69M4txIfAAAI</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJmDG&amp;sid=5CB4rI51v9EBwoLaAAAH</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>5CB4rI51v9EBwoLaAAAH</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=websocket&amp;sid=0b5CIcRfebjeUP6IAAAN</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>0b5CIcRfebjeUP6IAAAN</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFKC2m&amp;sid=wTbs-39HN_Hq77_nAAAP</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>wTbs-39HN_Hq77_nAAAP</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=websocket&amp;sid=QfhYpBR7a8XY6KopAAAE</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>QfhYpBR7a8XY6KopAAAE</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJkP3&amp;sid=L5sTGQm7gTPIvgamAAAG</uri>
  <method>GET</method>
  <param>sid</param>
  <evidence>L5sTGQm7gTPIvgamAAAG</evidence>
  </instance>
  </instances>
  <count>35</count>
  <solution>&lt;p&gt;For secure content, put session ID in a cookie. To be even more secure consider using a combination of cookie and URL rewrite.&lt;/p&gt;</solution>
  <reference>&lt;p&gt;http://seclists.org/lists/webappsec/2002/Oct-Dec/0111.html&lt;/p&gt;</reference>
  <cweid>200</cweid>
  <wascid>13</wascid>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>10109</pluginid>
  <alert>Modern Web Application</alert>
  <name>Modern Web Application</name>
  <riskcode>0</riskcode>
  <confidence>2</confidence>
  <riskdesc>Informational (Medium)</riskdesc>
  <desc>&lt;p&gt;The application appears to be a modern web application. If you need to explore it automatically then the Ajax Spider may well be more effective than the standard one.&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000</uri>
  <method>GET</method>
  <evidence>&lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js&quot;&gt;&lt;/script&gt;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/polyfills-es2018.js</uri>
  <method>GET</method>
  <evidence>&lt;script&gt;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/sitemap.xml</uri>
  <method>GET</method>
  <evidence>&lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js&quot;&gt;&lt;/script&gt;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/tutorial-es2018.js</uri>
  <method>GET</method>
  <evidence>&lt;a&gt;&quot;,&apos;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/</uri>
  <method>GET</method>
  <evidence>&lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js&quot;&gt;&lt;/script&gt;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/polyfills-es5.js</uri>
  <method>GET</method>
  <evidence>&lt;a&gt;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/</uri>
  <method>GET</method>
  <evidence>&lt;a href=&quot;&quot;&gt;ftp&lt;/a&gt;</evidence>
  </instance>
  </instances>
  <count>7</count>
  <solution>&lt;p&gt;This is an informational alert and so no changes are required.&lt;/p&gt;</solution>
  <otherinfo>&lt;p&gt;No links have been found while there are scripts, which is an indication that this is a modern web application.&lt;/p&gt;</otherinfo>
  <reference>&lt;p&gt;&lt;/p&gt;</reference>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>90033</pluginid>
  <alert>Loosely Scoped Cookie</alert>
  <name>Loosely Scoped Cookie</name>
  <riskcode>0</riskcode>
  <confidence>1</confidence>
  <riskdesc>Informational (Low)</riskdesc>
  <desc>&lt;p&gt;Cookies can be scoped by domain or path. This check is only concerned with domain scope.The domain scope applied to a cookie determines which domains can access it. For example, a cookie can be scoped strictly to a subdomain e.g. www.nottrusted.com, or loosely scoped to a parent domain e.g. nottrusted.com. In the latter case, any subdomain of nottrusted.com can access the cookie. Loosely scoped cookies are common in mega-applications like google.com and live.com. Cookies set from a subdomain like app.foo.bar are transmitted only to that domain by the browser. However, cookies scoped to a parent-level domain may be transmitted to the parent, or any subdomain of the parent.&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJiBX&amp;sid=i44E23_d7HysXmYyAAAF</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJf4l</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJmAk</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJv2N&amp;sid=PktdCTeisMU99B0XAAAJ</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJkNZ</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFKC1F</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYaS&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>POST</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJq6f</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJc38&amp;sid=RwTg5sM3urRvTowDAAAC</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFKAAX</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJeSU</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJec3&amp;sid=N2BAvk-LoI6ydM_fAAAD</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYh4&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>POST</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFK4Is</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJY_O</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJwTQ&amp;sid=m1nJpf-U7x4l9EdgAAAK</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJfF2&amp;sid=QfhYpBR7a8XY6KopAAAE</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJZAS&amp;sid=xm0oUZMe5lefHrYkAAAB</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFK7mu&amp;sid=0b5CIcRfebjeUP6IAAAN</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJwR_</uri>
  <method>GET</method>
  </instance>
  </instances>
  <count>35</count>
  <solution>&lt;p&gt;Always scope cookies to a FQDN (Fully Qualified Domain Name).&lt;/p&gt;</solution>
  <otherinfo>&lt;p&gt;The origin domain used for comparison was: &lt;/p&gt;&lt;p&gt;juice-shop&lt;/p&gt;&lt;p&gt;io=i44E23_d7HysXmYyAAAF&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</otherinfo>
  <reference>&lt;p&gt;https://tools.ietf.org/html/rfc6265#section-4.1&lt;/p&gt;&lt;p&gt;https://owasp.org/www-project-web-security-testing-guide/v41/4-Web_Application_Security_Testing/06-Session_Management_Testing/02-Testing_for_Cookies_Attributes.html&lt;/p&gt;&lt;p&gt;http://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_cookies&lt;/p&gt;</reference>
  <cweid>565</cweid>
  <wascid>15</wascid>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>10021</pluginid>
  <alert>X-Content-Type-Options Header Missing</alert>
  <name>X-Content-Type-Options Header Missing</name>
  <riskcode>1</riskcode>
  <confidence>2</confidence>
  <riskdesc>Low (Medium)</riskdesc>
  <desc>&lt;p&gt;The Anti-MIME-Sniffing header X-Content-Type-Options was not set to &apos;nosniff&apos;. This allows older versions of Internet Explorer and Chrome to perform MIME-sniffing on the response body, potentially causing the response body to be interpreted and displayed as a content type other than the declared content type. Current (early 2014) and legacy versions of Firefox will use the declared content type (if one is set), rather than performing MIME-sniffing.&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJzM-</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYKz&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJc38&amp;sid=RwTg5sM3urRvTowDAAAC</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFK7mu&amp;sid=0b5CIcRfebjeUP6IAAAN</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJwR_</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJv0-</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFKABn&amp;sid=OP1vxyAS7ESoZCFeAAAO</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJmAk</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJkNZ</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJeSU</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYaU&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJY_O</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYaS&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>POST</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJfF2&amp;sid=QfhYpBR7a8XY6KopAAAE</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJq6f</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJZAS&amp;sid=xm0oUZMe5lefHrYkAAAB</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJh_q</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFK7eA</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFKC1F</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFK4Is</uri>
  <method>GET</method>
  <param>X-Content-Type-Options</param>
  </instance>
  </instances>
  <count>35</count>
  <solution>&lt;p&gt;Ensure that the application/web server sets the Content-Type header appropriately, and that it sets the X-Content-Type-Options header to &apos;nosniff&apos; for all web pages.&lt;/p&gt;&lt;p&gt;If possible, ensure that the end user uses a standards-compliant and modern web browser that does not perform MIME-sniffing at all, or that can be directed by the web application/web server to not perform MIME-sniffing.&lt;/p&gt;</solution>
  <otherinfo>&lt;p&gt;This issue still applies to error type pages (401, 403, 500, etc.) as those pages are often still affected by injection issues, in which case there is still concern for browsers sniffing pages away from their actual content type.&lt;/p&gt;&lt;p&gt;At &quot;High&quot; threshold this scan rule will not alert on client or server error responses.&lt;/p&gt;</otherinfo>
  <reference>&lt;p&gt;http://msdn.microsoft.com/en-us/library/ie/gg622941%28v=vs.85%29.aspx&lt;/p&gt;&lt;p&gt;https://owasp.org/www-community/Security_Headers&lt;/p&gt;</reference>
  <cweid>16</cweid>
  <wascid>15</wascid>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>10027</pluginid>
  <alert>Information Disclosure - Suspicious Comments</alert>
  <name>Information Disclosure - Suspicious Comments</name>
  <riskcode>0</riskcode>
  <confidence>1</confidence>
  <riskdesc>Informational (Low)</riskdesc>
  <desc>&lt;p&gt;The response appears to contain suspicious comments which may help an attacker. Note: Matches made within script blocks or files are against the entire content not only comments.&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000/tutorial-es2018.js</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/main-es5.js</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es2018.js</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/main-es2018.js</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/polyfills-es2018.js</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/vendor-es5.js</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/polyfills-es5.js</uri>
  <method>GET</method>
  </instance>
  </instances>
  <count>7</count>
  <solution>&lt;p&gt;Remove all comments that return information that may help an attacker and fix any underlying problems they refer to.&lt;/p&gt;</solution>
  <otherinfo>&lt;p&gt;The following comment/snippet was identified via the pattern: \bQUERY\b&lt;/p&gt;&lt;p&gt;(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{s2oO:function(e,t,o){&quot;use strict&quot;;o.r(t),o.d(t,&quot;hasInstructions&quot;,(function(){return q})),o.d(t,&quot;startHackingInstructorFor&quot;,(function(){return M}));var a={&quot;&quot;:[&quot;&lt;em&gt;&quot;,&quot;&lt;/em&gt;&quot;],_:[&quot;&lt;strong&gt;&quot;,&quot;&lt;/strong&gt;&quot;],&quot;\n&quot;:[&quot;&lt;br /&gt;&quot;],&quot; &quot;:[&quot;&lt;br /&gt;&quot;],&quot;-&quot;:[&quot;&lt;hr /&gt;&quot;]};function r(e){return e.replace(RegExp(&quot;^&quot;+(e.match(/^(\t| )+/)||&quot;&quot;)[0],&quot;gm&quot;),&quot;&quot;)}function n(e){return(e+&quot;&quot;).replace(/&quot;/g,&quot;&amp;quot;&quot;).replace(/&lt;/g,&quot;&amp;lt;&quot;).replace(/&gt;/g,&quot;&amp;gt;&quot;)}function i(e){return new Promise(t=&gt;{setTimeout(t,e)})}function s(e,t,o={ignoreCase:!0}){return async()=&gt;{const a=document.querySelector(e);for(;a.value!==t&amp;&amp;(!o.ignoreCase||a.value.toLowerCase()!==t.toLowerCase());)await i(100)}}function l(e,t,o={ignoreCase:!0}){return async()=&gt;{const a=document.querySelector(e);for(;a.value===t&amp;&amp;(!o.ignoreCase||a.value.toLowerCase()!==t.toLowerCase());)await i(100)}}function u(e){return async()=&gt;{const t=document.querySelector(e);for(;!t.value||&quot;&quot;===t.value;)await i(100)}}function p(e){return async()=&gt;{const t=document.querySelector(e);t||console.warn(`Could not find Element with selector &quot;${e}&quot;`),await new Promise(e=&gt;{t.addEventListener(&quot;click&quot;,()=&gt;e())})}}function d(e,t){return async()=&gt;{for(;;){const o=document.querySelector(e);if(o&amp;&amp;o.innerHTML===t)break;await i(100)}}}function c(e){return()=&gt;i(e)}function h(e){return async()=&gt;{for(;window.location.hash!==&quot;#/&quot;+e;)await i(100)}}function f(){return async()=&gt;{for(;null===localStorage.getItem(&quot;token&quot;);)await i(100)}}function m(){return async()=&gt;{for(;null!==localStorage.getItem(&quot;token&quot;);)await i(100)}}function g(){let e=!1;const t=new Image;return Object.defineProperty(t,&quot;id&quot;,{get:function(){e=!0}}),async()=&gt;{for(;console.dir(t),!e;)await i(100)}}const b={name:&quot;Login Admin&quot;,hints:[{text:&quot;To start this challenge, you&apos;ll have to log out first.&quot;,fixture:&quot;#navbarAccount&quot;,unskippable:!0,resolved:m()},{text:&quot;Let&apos;s try if we find a way to log in with the administrator&apos;s user account. To begin, go to the _Login_ page via the _Account_ menu.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:h(&quot;login&quot;)},{text:&quot;To find a way around the normal login process we will try to use a **SQL Injection** (SQLi) attack.&quot;,fixture:&quot;#email&quot;,resolved:c(8e3)},{text:&quot;A good starting point for simple SQL Injections is to insert quotation marks (like `\&quot;` or `&apos;`). These mess with the syntax of an insecurely concatenated query and might give you feedback if an endpoint is vulnerable or not.&quot;,fixture:&quot;#email&quot;,resolved:c(15e3)},{text:&quot;Start with entering `&apos;` in the **email field**.&quot;,fixture:&quot;#email&quot;,unskippable:!0,resolved:s(&quot;#email&quot;,&quot;&apos;&quot;)},{text:&quot;Now put anything in the **password field**. It doesn&apos;t matter what.&quot;,fixture:&quot;#password&quot;,unskippable:!0,resolved:u(&quot;#password&quot;)},{text:&quot;Press the _Log in_ button.&quot;,fixture:&quot;#rememberMe&quot;,unskippable:!0,resolved:p(&quot;#loginButton&quot;)},{text:&quot;Nice! Do you see the red `[object Object]` error at the top? Unfortunately it isn&apos;t really telling us much about what went wrong...&quot;,fixture:&quot;#rememberMe&quot;,resolved:c(1e4)},{text:&quot;Maybe you will be able to find out more information about the error in the JavaScript console or the network tab of your browser!&quot;,fixture:&quot;#rememberMe&quot;,resolved:c(1e4)},{text:&quot;Did you spot the error message with the `SQLITE_ERROR` and the entire SQL query in the console output? If not, keep the console open and click _Log in_ again. Then inspect the occuring log message closely.&quot;,fixture:&quot;#rememberMe&quot;,resolved:c(3e4)},{text:&quot;Let&apos;s try to manipulate the query a bit to make it useful. Try out typing `&apos; OR true` into the **email field**.&quot;,fixture:&quot;#email&quot;,unskippable:!0,resolved:s(&quot;#email&quot;,&quot;&apos; OR true&quot;)},{text:&quot;Now click the _Log in_ button again.&quot;,fixture:&quot;#rememberMe&quot;,unskippable:!0,resolved:p(&quot;#loginButton&quot;)},{text:&quot;Mhh... The query is still invalid? Can you see why from the new error in the console?&quot;,fixture:&quot;#rememberMe&quot;,resolved:c(8e3)},{text:&quot;We need to make sure that the rest of the query after our injection doesn&apos;t get executed. Any Ideas?&quot;,fixture:&quot;#rememberMe&quot;,resolved:c(8e3)},{text:&quot;You can comment out anything after your injection payload from query using comments in SQL. In SQLite databases you can use `--` for that.&quot;,fixture:&quot;#rememberMe&quot;,resolved:c(1e4)},{text:&quot;So, type in `&apos; OR true--` into the email field.&quot;,fixture:&quot;#email&quot;,unskippable:!0,resolved:s(&quot;#email&quot;,&quot;&apos; OR true--&quot;)},{text:&quot;Press the _Log in_ button again and sit back...&quot;,fixture:&quot;#rememberMe&quot;,unskippable:!0,resolved:p(&quot;#loginButton&quot;)},{text:&quot;That worked, right?! To see with whose account you just logged in, open the _Account_ menu.&quot;,fixture:&quot;#navbarAccount&quot;,unskippable:!0,resolved:p(&quot;#navbarAccount&quot;)},{text:&quot;\u{1f389} Congratulations! You have been logged in as the **administrator** of the shop! (If you want to understand why, try to reproduce what your `&apos; OR true--` did _exactly_ to the query.)&quot;,fixture:&quot;app-navbar&quot;,resolved:c(2e4)}]},y={name:&quot;DOM XSS&quot;,hints:[{text:&quot;For this challenge, we&apos;ll take a close look at the _Search_ field at the top of the screen.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:c(8e3)},{text:&quot;Let&apos;s start by searching for all products containing `owasp` in their name or description.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:s(&quot;#searchQuery input&quot;,&quot;owasp&quot;)},{text:&quot;Now hit enter.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:d(&quot;#searchValue&quot;,&quot;owasp&quot;)},{text:&quot;Nice! You should now see many cool OWASP-related products.&quot;,fixture:&quot;.fill-remaining-space&quot;,resolved:c(8e3)},{text:&quot;You might have noticed, that your search term is displayed above the results?&quot;,fixture:&quot;app-search-result&quot;,resolved:c(8e3)},{text:&quot;What we will try now is a **Cross-Site Scripting (XSS)** attack, where we try to inject HTML or JavaScript code into the application.&quot;,fixture:&quot;app-search-result&quot;,resolved:c(15e3)},{text:&quot;Change your search value into `&lt;h1&gt;owasp` to see if we can inject HTML.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:s(&quot;#searchQuery input&quot;,&quot;&lt;h1&gt;owasp&quot;)},{text:&quot;Hit enter again.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:d(&quot;#searchValue&quot;,&quot;&lt;h1&gt;owasp&lt;/h1&gt;&quot;)},{text:&quot;Hmm, this doesn&apos;t look normal, does it?&quot;,fixture:&quot;.noResult&quot;,resolved:c(8e3)},{text:&quot;If you right-click on the search term and inspect that part of the page with your browser, you will see that our `h1`-tag was _actually_ embedded into the page and is not just shown as plain text!&quot;,fixture:&quot;.noResult&quot;,resolved:c(16e3)},{text:&quot;Let&apos;s now try to inject JavaScript. Type `&lt;script&gt;alert(xss)&lt;\/script&gt;` into the search box now.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:s(&quot;#searchQuery input&quot;,&quot;&lt;script&gt;alert(xss)&lt;\/script&gt;&quot;)},{text:&quot;Hit enter again.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:d(&quot;#searchValue&quot;,&quot;&lt;script&gt;alert(xss)&lt;\/script&gt;&quot;)},{text:&quot;\u{1f614} This didn&apos;t work as we hoped. If you inspect the page, you should see the `script`-tag but it is not executed for some reason.&quot;,fixture:&quot;.noResult&quot;,resolved:c(1e4)},{text:&apos;Luckily there are _many_ different XSS payloads we can try. Let\&apos;s try this one next: &lt;code&gt;&amp;lt;iframe src=&quot;javascript:alert(&amp;#96;xss&amp;#96;)&quot;&amp;gt;&lt;/code&gt;.&apos;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:s(&quot;#searchQuery input&quot;,&apos;&lt;iframe src=&quot;javascript:alert(`xss`)&quot;&gt;&apos;)},{text:&quot;Hit enter one more time. If an alert box appears, you must confirm it in order to close it.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:d(&quot;#searchValue&quot;,&apos;&lt;iframe src=&quot;javascript:alert(`xss`)&quot;&gt;&lt;/iframe&gt;&apos;)},{text:&quot;\u{1f389} Congratulations! You just successfully performed an XSS attack!&quot;,fixture:&quot;.noResult&quot;,resolved:c(8e3)},{text:&quot;More precisely, this was a **DOM XSS** attack, because your payload was handled and improperly embedded into the page by the application frontend code without even sending it to the server.&quot;,fixture:&quot;.noResult&quot;,resolved:c(16e3)}]},x={name:&quot;Score Board&quot;,hints:[{text:&quot;This application is riddled with security vulnerabilities. Your progress exploiting these is tracked on a _Score Board_.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:c(1e4)},{text:&quot;You won&apos;t find a link to it in the navigation or side bar, though. Finding the _Score Board_ is in itself actually one of the hacking challenges.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(12e3)},{text:&quot;You could just start guessing the URL of the _Score Board_ or comb through the client-side JavaScript code for useful information.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(12e3)},{text:&quot;You find the JavaScript code in the DevTools of your browser that will open with `F12`.&quot;,fixture:&quot;app-navbar&quot;,resolved:g()},{text:&quot;Look through the client-side JavaScript in the _Sources_ tab for clues. Or just start URL guessing. It&apos;s up to you!&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:h(&quot;score-board&quot;)},{text:&quot;\u{1f389} Congratulations! You found the _Score Board_! Good luck and happy hacking!&quot;,fixture:&quot;app-score-board&quot;,resolved:c(6e4)}]},v={name:&quot;Privacy Policy&quot;,hints:[{text:&quot;Log in with any user to begin this challenge. You can use an existing or freshly registered account.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:f()},{text:&quot;Great, you are logged in! Now open the _Account_ menu.&quot;,fixture:&quot;#navbarAccount&quot;,resolved:p(&quot;#navbarAccount&quot;)},{text:&quot;Open the _Privacy &amp; Security_ sub-menu and click _Privacy Policy_.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:h(&quot;privacy-security/privacy-policy&quot;)},{text:&quot;\u{1f389} That was super easy, right? This challenge is a bit of a joke actually, because nobody reads any fine print online... \u{1f648}&quot;,fixture:&quot;app-navbar&quot;,resolved:c(6e4)}]},w={name:&quot;Login Jim&quot;,hints:[{text:&quot;To start this challenge, you&apos;ll have to log out first.&quot;,fixture:&quot;#navbarAccount&quot;,unskippable:!0,resolved:m()},{text:&quot;Let&apos;s try if we find a way to log in with Jim&apos;s user account. To begin, go to the _Login_ page via the _Account_ menu.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:h(&quot;login&quot;)},{text:&quot;As you would expect you need to supply Jim&apos;s email address and password to log in regularly. But you might have neither at the moment.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(15e3)},{text:&quot;If we had at least the email address, we could then try a **SQL Injection** (SQLi) attack to avoid having to supply a password.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(15e3)},{text:&quot;So, let&apos;s go find out Jim&apos;s email! Luckily the shop is very bad with privacy and leaks emails in different places, for instance in the product reviews.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(15e3)},{text:&quot;Go back to the product list and click on some to open their details dialog which also hold the user reviews.&quot;,fixture:&quot;.fill-remaining-space&quot;,resolved:h(&quot;search&quot;)},{text:&quot;Once you found a user review by Jim and learned his email, go to the _Login_ screen.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:h(&quot;login&quot;)},{text:&quot;Supply Jim&apos;s email address in the **email field**.&quot;,fixture:&quot;#email&quot;,unskippable:!0,resolved:s(&quot;#email&quot;,&quot;jim@juice-sh.op&quot;)},{text:&quot;Now put anything in the **password field**. Let&apos;s assume we don&apos;t know it yet, even if you happen to already do.&quot;,fixture:&quot;#password&quot;,unskippable:!0,resolved:l(&quot;#password&quot;,&quot;ncc-1701&quot;)},{text:&quot;Press the _Log in_ button.&quot;,fixture:&quot;#rememberMe&quot;,unskippable:!0,resolved:p(&quot;#loginButton&quot;)},{text:&quot;This didn&apos;t work, but did you honestly expect it to? We need to craft an SQLi attack first!&quot;,fixture:&quot;#rememberMe&quot;,resolved:c(1e4)},{text:&quot;You can comment out the entire password check clause of the DB query by adding `&apos;--` to Jim&apos;s email address!&quot;,fixture:&quot;#email&quot;,unskippable:!0,resolved:s(&quot;#email&quot;,&quot;jim@juice-sh.op&apos;--&quot;)},{text:&quot;Now click the _Log in_ button again.&quot;,fixture:&quot;#rememberMe&quot;,unskippable:!0,resolved:p(&quot;#loginButton&quot;)},{text:&quot;\u{1f389} Congratulations! You have been logged in as Jim!&quot;,fixture:&quot;app-navbar&quot;,resolved:c(5e3)}]},k={name:&quot;View Basket&quot;,hints:[{text:&quot;This challenge is about **Horizontal Privilege Escalation**, meaning you are supposed access data that does not belong to your own account but to another user&apos;s.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(18e3)},{text:&quot;To start this challenge, you&apos;ll have to log in first.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:f()},{text:&quot;First, go to the _Your Basket_ page to view your own shopping basket. It&apos;s likely to be empty, if you didn&apos;t add anything yet.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:h(&quot;basket&quot;)},{text:&quot;To pass this challenge, you will need to peak into another user&apos;s basket while remaining logged in with your own account.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(8e3)},{text:&quot;If the application stores a reference to the basket somewhere in the browser, that might be a possible attack vector.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(12e3)},{text:&quot;Open the browser&apos;s _Development Tools_ and locate the _Session Storage_ tab. Similar to \u{1f36a}s, it can be used to store data in key/value pairs for each website.&quot;,fixture:&quot;app-navbar&quot;,resolved:g()},{text:&quot;Look over the names of the used session keys. Do you see something that might be related to the shopping basket? Try setting it to a different value! \u270d\ufe0f&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,async resolved(){let e=sessionStorage.getItem(&quot;bid&quot;);for(;sessionStorage.getItem(&quot;bid&quot;)===e;)await i(100)}},{text:&quot;Great, you have changed the `bid` value which might be some ID for the shopping basket!&quot;,fixture:&quot;app-navbar&quot;,resolved:c(8e3)},{text:&quot;Now, go to any other screen and then back to _Your Basket_. If nothing happens you might have set an invalid or non-existing `bid`. Try another in that case.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,async resolved(){let e=sessionStorage.getItem(&quot;itemTotal&quot;);for(;sessionStorage.getItem(&quot;itemTotal&quot;)===e;)await i(100)}},{text:&quot;\u{1f389} Congratulations! You are now viewing another user&apos;s shopping basket!&quot;,fixture:&quot;app-navbar&quot;,resolved:c(15e3)}]},_={name:&quot;Forged Feedback&quot;,hints:[{text:&quot;To start this challenge, first go to the _Customer Feedback_ page.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:h(&quot;contact&quot;)},{text:&quot;This challenge is about broken access controls. To pass it, you need to impersonate another user while providing feedback.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(1e4)},{text:&quot;If you would now submit feedback, it would be posted by yourself while logged in or anonymously while logged out.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(1e4)},{text:&quot;We will now search for any mistake the application developers might have made in setting the author of any new feedback.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(1e4)},{text:&quot;Open the browser&apos;s _Development Tools_ and try finding anything interesting while inspecting the feedback form.&quot;,fixture:&quot;app-navbar&quot;,resolved:g()},{text:&quot;There is more than meets the eye among the fields of the form... \u{1f609}&quot;,fixture:&quot;app-navbar&quot;,resolved:c(8e3)},{text:&quot;Once you found the field that shouldn&apos;t even be there, try manipulating its value to one that might represent another user!&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,async resolved(){let e=document.getElementById(&quot;userId&quot;).value;for(;document.getElementById(&quot;userId&quot;).value===e;)await i(100)}},{text:&quot;You found and changed the invisible `userId`! Now submit the form to complete the challenge.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:p(&quot;#submitButton&quot;)},{text:&quot;\u{1f389} Congratulations, you successfully submitted a feedback as another user!&quot;,fixture:&quot;app-navbar&quot;,resolved:c(15e3)}]},S={name:&quot;Password Strength&quot;,hints:[{text:&quot;To start this challenge, you&apos;ll have to log out first.&quot;,fixture:&quot;#navbarAccount&quot;,unskippable:!0,resolved:m()},{text:&quot;In this challenge we&apos;ll try to log into the administrator&apos;s user account using his original credentials.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(7e3)},{text:&quot;If you don&apos;t know it already, you must first find out the admin&apos;s email address. The user feedback and product reviews are good places to look into. When you have it, go to the _Login_ page.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:h(&quot;login&quot;)},{text:&quot;Enter the admin&apos;s email address into the **email field**.&quot;,fixture:&quot;#email&quot;,unskippable:!0,resolved:s(&quot;#email&quot;,&quot;admin@juice-sh.op&quot;)},{text:&quot;Now for the password. Lucky for us, the admin chose a really, really, **really** stupid one. Just try any that comes to your mind!&quot;,fixture:&quot;#password&quot;,unskippable:!0,resolved:u(&quot;#password&quot;)},{text:&quot;\u{1f926}\u200d\u2642\ufe0f Nah, that was wrong! Keep trying! I&apos;ll tell you when you&apos;re one the right track.&quot;,fixture:&quot;#password&quot;,unskippable:!0,resolved:s(&quot;#password&quot;,&quot;admin&quot;)},{text:&quot;Okay, you are one the right track, but this would have been the worst password in the world for an admin. He spiced it up a little bit with some extra non-letter characters. Keep trying!&quot;,fixture:&quot;#password&quot;,unskippable:!0,resolved:s(&quot;#password&quot;,&quot;admin1&quot;)},{text:&quot;\u{1f525} Yes, it&apos;s getting warmer! Try adding some more numbers maybe?&quot;,fixture:&quot;#password&quot;,unskippable:!0,resolved:s(&quot;#password&quot;,&quot;admin12&quot;)},{text:&quot;\u{1f9ef} It&apos;s getting hot! Just one more digit...&quot;,fixture:&quot;#password&quot;,unskippable:!0,resolved:s(&quot;#password&quot;,&quot;admin123&quot;)},{text:&quot;Okay, now press the _Log in_ button.&quot;,fixture:&quot;#rememberMe&quot;,unskippable:!0,resolved:p(&quot;#loginButton&quot;)},{text:&quot;\u{1f389} Congratulations! You have been logged in as the **administrator** of the shop thanks to his very ill chosen password!&quot;,fixture:&quot;app-navbar&quot;,resolved:c(2e4)}]},L={name:&quot;Bonus Payload&quot;,hints:[{text:&quot;Assuming you did the **DOM XSS** tutorial already, this one just uses a funnier payload on the _Search_ field.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:c(1e4)},{text:&quot;Enter or paste this payload into the _Search_ field: &lt;code&gt;&amp;lt;iframe width=&amp;quot;100%&amp;quot; height=&amp;quot;166&amp;quot; scrolling=&amp;quot;no&amp;quot; frameborder=&amp;quot;no&amp;quot; allow=&amp;quot;autoplay&amp;quot; src=&amp;quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/771984076&amp;amp;color=%23ff5500&amp;amp;auto&amp;lowbar;play=true&amp;amp;hide&amp;lowbar;related=false&amp;amp;show&amp;lowbar;comments=true&amp;amp;show&amp;lowbar;user=true&amp;amp;show&amp;lowbar;reposts=false&amp;amp;show&amp;lowbar;teaser=true&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/code&gt;.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:s(&quot;#searchQuery input&quot;,&apos;&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/771984076&amp;color=%23ff5500&amp;auto_play=true&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;/iframe&gt;&apos;)},{text:&quot;Make sure your speaker volume is cranked up. Then hit enter.&quot;,fixture:&quot;.fill-remaining-space&quot;,unskippable:!0,resolved:d(&quot;#searchValue&quot;,&apos;&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; allow=&quot;autoplay&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/771984076&amp;color=%23ff5500&amp;auto_play=true&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&quot;&gt;&lt;/iframe&gt;&apos;)},{text:&quot;\u{1f389} Congratulations and enjoy the music!&quot;,fixture:&quot;.noResult&quot;,resolved:c(5e3)}]},I={name:&quot;Login Bender&quot;,hints:[{text:&quot;To start this challenge, you&apos;ll have to log out first.&quot;,fixture:&quot;#navbarAccount&quot;,unskippable:!0,resolved:m()},{text:&quot;Let&apos;s try if we find a way to log in with Bender&apos;s user account. To begin, go to the _Login_ page via the _Account_ menu.&quot;,fixture:&quot;app-navbar&quot;,unskippable:!0,resolved:h(&quot;login&quot;)},{text:&quot;As you would expect you need to supply Bender&apos;s email address and password to log in regularly. But you might have neither at the moment.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(15e3)},{text:&quot;If we had at least the email address, we could then try a **SQL Injection** (SQLi) attack to avoid having to supply a password.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(15e3)},{text:&quot;So, let&apos;s go find out Bender&apos;s email! Luckily the shop is very bad with privacy and leaks emails in different places, for instance in the user feedback.&quot;,fixture:&quot;app-navbar&quot;,resolved:c(15e3)},{text:&quot;Go to the _About Us_ page where user feedback is displayed among other things.&quot;,fixture:&quot;app-navbar&quot;,resolved:h(&quot;about&quot;)},{text:&quot;Once you found an entry by Bender in the feedback carousel leaking enough of his email to deduce the rest, go to the _Login_ screen.&quot;,fixture:&quot;app-about&quot;,unskippable:!0,resolved:h(&quot;login&quot;)},{text:&quot;Supply Bender&apos;s email address in the **email field**.&quot;,fixture:&quot;#email&quot;,unskippable:!0,resolved:s(&quot;#email&quot;,&quot;bender@juice-sh.op&quot;)},{text:&quot;Now put anything in the **password field**. Let&apos;s assume we don&apos;t know it yet, even if you happen to already do.&quot;,fixture:&quot;#password&quot;,unskippable:!0,resolved:l(&quot;#password&quot;,&quot;OhG0dPlease1nsertLiquor!&quot;)},{text:&quot;Press the _Log in_ button.&quot;,fixture:&quot;#rememberMe&quot;,unskippable:!0,resolved:p(&quot;#loginButton&quot;)},{text:&quot;This didn&apos;t work, but did you honestly expect it to? We need to craft an SQLi attack first!&quot;,fixture:&quot;#rememberMe&quot;,resolved:c(1e4)},{text:&quot;You can comment out the entire password check clause of the DB query by adding `&apos;--` to Bender&apos;s email address!&quot;,fixture:&quot;#email&quot;,unskippable:!0,resolved:s(&quot;#email&quot;,&quot;bender@juice-sh.op&apos;--&quot;)},{text:&quot;Now click the _Log in_ button again.&quot;,fixture:&quot;#rememberMe&quot;,unskippable:!0,resolved:p(&quot;#loginButton&quot;)},{text:&quot;\u{1f389} Congratulations! You have been logged in as Bender!&quot;,fixture:&quot;app-navbar&quot;,resolved:c(5e3)}]},T={name:null,hints:[{text:&quot;\u{1f613} Sorry, this hacking challenge does not have a step-by-step tutorial (yet) ... \u{1f9ed} Can you find your own way to solve it?&quot;,fixture:&quot;app-navbar&quot;,resolved:c(15e3)},{text:&quot;\u270d\ufe0f Do you want to contribute a tutorial for this challenge? [Check out our documentation](https://pwning.owasp-juice.shop/part3/tutorials.html) to learn how! \u{1f3eb}&quot;,fixture:&quot;app-navbar&quot;,resolved:c(15e3)},{text:&quot;And now: \u{1f47e} **GLHF** with this challenge!&quot;,fixture:&quot;app-navbar&quot;,resolved:c(1e4)}]},B=[x,b,w,y,v,k,_,S,L,I];function C(e){const t=document.querySelector(e.fixture);if(!t)return null;const o=document.createElement(&quot;div&quot;);o.id=&quot;hacking-instructor&quot;,o.style.position=&quot;absolute&quot;,o.style.zIndex=&quot;20000&quot;,o.style.backgroundColor=&quot;rgba(50, 115, 220, 0.9)&quot;,o.style.maxWidth=&quot;400px&quot;,o.style.minWidth=e.text.length&gt;100?&quot;350px&quot;:&quot;250px&quot;,o.style.padding=&quot;16px&quot;,o.style.borderRadius=&quot;8px&quot;,o.style.whiteSpace=&quot;initial&quot;,o.style.lineHeight=&quot;1.3&quot;,o.style.top=&quot;24px&quot;,!0!==e.unskippable&amp;&amp;(o.style.cursor=&quot;pointer&quot;),o.style.fontSize=&quot;14px&quot;,o.style.display=&quot;flex&quot;,o.style.alignItems=&quot;center&quot;;const i=document.createElement(&quot;img&quot;);i.style.minWidth=&quot;64px&quot;,i.style.minHeight=&quot;64px&quot;,i.style.width=&quot;64px&quot;,i.style.height=&quot;64px&quot;,i.style.marginRight=&quot;8px&quot;,i.src=&quot;/assets/public/images/hackingInstructor.png&quot;;const s=document.createElement(&quot;span&quot;);s.style.flexGrow=&quot;2&quot;,s.innerHTML=function e(t){var o,i,s,l,u,p=/((?:^|\n+)(?:\n---+|\* \*(?: \*)+)\n)|(?:^```(\w*)\n([\s\S]*?)\n```$)|((?:(?:^|\n+)(?:\t|  {2,}).+)+\n*)|((?:(?:^|\n)([&gt;*+-]|\d+\.)\s+.*)+)|(?:\!\[([^\]]*?)\]\(([^\)]+?)\))|(\[)|(\](?:\(([^\)]+?)\))?)|(?:(?:^|\n+)([^\s].*)\n(\-{3,}|={3,})(?:\n+|$))|(?:(?:^|\n+)(#{1,3})\s*(.+)(?:\n+|$))|(?:`([^`].*?)`)|(  \n\n*|\n{2,}|__|\*\*|[_*])/gm,d=[],c=&quot;&quot;,h=0,f={};function m(e){var t=a[e.replace(/\*/g,&quot;_&quot;)[1]||&quot;&quot;],o=d[d.length-1]==e;return t?t[1]?(d[o?&quot;pop&quot;:&quot;push&quot;](e),t[0|o]):t[0]:e}function g(){for(var e=&quot;&quot;;d.length;)e+=m(d[d.length-1]);return e}for(t=t.replace(/^\[(.+?)\]:\s*(.+)$/gm,(function(e,t,o){return f[t.toLowerCase()]=o,&quot;&quot;})).replace(/^\n+|\n+$/g,&quot;&quot;);s=p.exec(t);)i=t.substring(h,s.index),h=p.lastIndex,o=s[0],i.match(/[^\\](\\\\)*\\$/)||(s[3]||s[4]?o=&apos;&lt;pre class=&quot;code &apos;+(s[4]?&quot;poetry&quot;:s[2].toLowerCase())+&apos;&quot;&gt;&apos;+r(n(s[3]||s[4]).replace(/^\n+|\n+$/g,&quot;&quot;))+&quot;&lt;/pre&gt;&quot;:s[6]?((u=s[6]).match(/\./)&amp;&amp;(s[5]=s[5].replace(/^\d+/gm,&quot;&quot;)),l=e(r(s[5].replace(/^\s*[&gt;*+.-]/gm,&quot;&quot;))),&quot;&gt;&quot;===u?u=&quot;blockquote&quot;:(u=u.match(/\./)?&quot;ol&quot;:&quot;ul&quot;,l=l.replace(/^(.*)(\n|$)/gm,&quot;&lt;li&gt;$1&lt;/li&gt;&quot;)),o=&quot;&lt;&quot;+u+&quot;&gt;&quot;+l+&quot;&lt;/&quot;+u+&quot;&gt;&quot;):s[8]?o=&apos;&lt;img src=&quot;&apos;+n(s[8])+&apos;&quot; alt=&quot;&apos;+n(s[7])+&apos;&quot;&gt;&apos;:s[10]?(c=c.replace(&quot;&lt;a&gt;&quot;,&apos;&lt;a href=&quot;&apos;+n(s[11]||f[i.toLowerCase()])+&apos;&quot;&gt;&apos;),o=g()+&quot;&lt;/a&gt;&quot;):s[9]?o=&quot;&lt;a&gt;&quot;:s[12]||s[14]?o=&quot;&lt;&quot;+(u=&quot;h&quot;+(s[14]?s[14].length:&quot;=&quot;===s[13][0]?1:2))+&quot;&gt;&quot;+e(s[12]||s[15])+&quot;&lt;/&quot;+u+&quot;&gt;&quot;:s[16]?o=&quot;&lt;code&gt;&quot;+n(s[16])+&quot;&lt;/code&gt;&quot;:(s[17]||s[1])&amp;&amp;(o=m(s[17]||&quot;--&quot;))),c+=i,c+=o;return(c+t.substring(h)+g()).trim()}(e.text),o.appendChild(i),o.appendChild(s);const l=document.createElement(&quot;div&quot;);return l.style.position=&quot;relative&quot;,l.style.display=&quot;inline&quot;,l.appendChild(o),t.parentElement.insertBefore(l,t),l}function j(e){return new Promise(t=&gt;{e.addEventListener(&quot;click&quot;,t)})}function q(e){return void 0!==B.find(({name:t})=&gt;t===e)}async function M(e){const t=B.find(({name:t})=&gt;t===e)||T;for(const o of t.hints){const e=C(o);if(!e){console.warn(`Could not find Element with fixture &quot;${o.fixture}&quot;`);continue}e.scrollIntoView();const t=[o.resolved()];!0!==o.unskippable&amp;&amp;t.push(j(e)),await Promise.race(t),e.remove()}}}}]);&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</otherinfo>
  <reference>&lt;p&gt;&lt;/p&gt;</reference>
  <cweid>200</cweid>
  <wascid>13</wascid>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>10038</pluginid>
  <alert>Content Security Policy (CSP) Header Not Set</alert>
  <name>Content Security Policy (CSP) Header Not Set</name>
  <riskcode>1</riskcode>
  <confidence>2</confidence>
  <riskdesc>Low (Medium)</riskdesc>
  <desc>&lt;p&gt;Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft to site defacement or distribution of malware. CSP provides a set of standard HTTP headers that allow website owners to declare approved sources of content that browsers should be allowed to load on that page — covered types are JavaScript, CSS, HTML frames, fonts, images and embeddable objects such as Java applets, ActiveX, audio and video files.&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000/ftp/coupons_2013.md.bak</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYh4&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>POST</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/sitemap.xml</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/package.json.bak</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/suspicious_errors.yml</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYaS&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>POST</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/eastere.gg</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/quarantine</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp</uri>
  <method>GET</method>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/ftp/encrypt.pyc</uri>
  <method>GET</method>
  </instance>
  </instances>
  <count>13</count>
  <solution>&lt;p&gt;Ensure that your web server, application server, load balancer, etc. is configured to set the Content-Security-Policy header, to achieve optimal browser support: &quot;Content-Security-Policy&quot; for Chrome 25+, Firefox 23+ and Safari 7+, &quot;X-Content-Security-Policy&quot; for Firefox 4.0+ and Internet Explorer 10+, and &quot;X-WebKit-CSP&quot; for Chrome 14+ and Safari 6+.&lt;/p&gt;</solution>
  <reference>&lt;p&gt;https://developer.mozilla.org/en-US/docs/Web/Security/CSP/Introducing_Content_Security_Policy&lt;/p&gt;&lt;p&gt;https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html&lt;/p&gt;&lt;p&gt;http://www.w3.org/TR/CSP/&lt;/p&gt;&lt;p&gt;http://w3c.github.io/webappsec/specs/content-security-policy/csp-specification.dev.html&lt;/p&gt;&lt;p&gt;http://www.html5rocks.com/en/tutorials/security/content-security-policy/&lt;/p&gt;&lt;p&gt;http://caniuse.com/#feat=contentsecuritypolicy&lt;/p&gt;&lt;p&gt;http://content-security-policy.com/&lt;/p&gt;</reference>
  <cweid>16</cweid>
  <wascid>15</wascid>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>10017</pluginid>
  <alert>Cross-Domain JavaScript Source File Inclusion</alert>
  <name>Cross-Domain JavaScript Source File Inclusion</name>
  <riskcode>1</riskcode>
  <confidence>2</confidence>
  <riskdesc>Low (Medium)</riskdesc>
  <desc>&lt;p&gt;The page includes one or more script files from a third-party domain.&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000</uri>
  <method>GET</method>
  <param>//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js</param>
  <evidence>&lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js&quot;&gt;&lt;/script&gt;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/sitemap.xml</uri>
  <method>GET</method>
  <param>//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js</param>
  <evidence>&lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js&quot;&gt;&lt;/script&gt;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/</uri>
  <method>GET</method>
  <param>//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js</param>
  <evidence>&lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js&quot;&gt;&lt;/script&gt;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/</uri>
  <method>GET</method>
  <param>//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js</param>
  <evidence>&lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js&quot;&gt;&lt;/script&gt;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/sitemap.xml</uri>
  <method>GET</method>
  <param>//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js</param>
  <evidence>&lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js&quot;&gt;&lt;/script&gt;</evidence>
  </instance>
  <instance>
  <uri>http://juice-shop:3000</uri>
  <method>GET</method>
  <param>//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js</param>
  <evidence>&lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js&quot;&gt;&lt;/script&gt;</evidence>
  </instance>
  </instances>
  <count>6</count>
  <solution>&lt;p&gt;Ensure JavaScript source files are loaded from only trusted sources, and the sources can&apos;t be controlled by end users of the application.&lt;/p&gt;</solution>
  <reference>&lt;p&gt;&lt;/p&gt;</reference>
  <cweid>829</cweid>
  <wascid>15</wascid>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>10020</pluginid>
  <alert>X-Frame-Options Header Not Set</alert>
  <name>X-Frame-Options Header Not Set</name>
  <riskcode>2</riskcode>
  <confidence>2</confidence>
  <riskdesc>Medium (Medium)</riskdesc>
  <desc>&lt;p&gt;X-Frame-Options header is not included in the HTTP response to protect against &apos;ClickJacking&apos; attacks.&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYh4&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>POST</method>
  <param>X-Frame-Options</param>
  </instance>
  <instance>
  <uri>http://juice-shop:3000/socket.io/?EIO=3&amp;transport=polling&amp;t=NLFJYaS&amp;sid=r2xfyQoKfs1Qc7gKAAAA</uri>
  <method>POST</method>
  <param>X-Frame-Options</param>
  </instance>
  </instances>
  <count>2</count>
  <solution>&lt;p&gt;Most modern Web browsers support the X-Frame-Options HTTP header. Ensure it&apos;s set on all web pages returned by your site (if you expect the page to be framed only by pages on your server (e.g. it&apos;s part of a FRAMESET) then you&apos;ll want to use SAMEORIGIN, otherwise if you never expect the page to be framed, you should use DENY. ALLOW-FROM allows specific websites to frame the web page in supported web browsers).&lt;/p&gt;</solution>
  <reference>&lt;p&gt;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options&lt;/p&gt;</reference>
  <cweid>16</cweid>
  <wascid>15</wascid>
  <sourceid>3</sourceid>
</alertitem>
<alertitem>
  <pluginid>2</pluginid>
  <alert>Private IP Disclosure</alert>
  <name>Private IP Disclosure</name>
  <riskcode>1</riskcode>
  <confidence>2</confidence>
  <riskdesc>Low (Medium)</riskdesc>
  <desc>&lt;p&gt;A private IP (such as 10.x.x.x, 172.x.x.x, 192.168.x.x) or an Amazon EC2 private hostname (for example, ip-10-0-56-78) has been found in the HTTP response body. This information might be helpful for further attacks targeting internal systems.&lt;/p&gt;</desc>
  <instances>
  <instance>
  <uri>http://juice-shop:3000/rest/admin/application-configuration</uri>
  <method>GET</method>
  <evidence>192.168.99.100:3000</evidence>
  </instance>
  </instances>
  <count>1</count>
  <solution>&lt;p&gt;Remove the private IP address from the HTTP response body.  For comments, use JSP/ASP/PHP comment instead of HTML/JavaScript comment which can be seen by client browsers.&lt;/p&gt;</solution>
  <otherinfo>&lt;p&gt;192.168.99.100:3000&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</otherinfo>
  <reference>&lt;p&gt;https://tools.ietf.org/html/rfc1918&lt;/p&gt;</reference>
  <cweid>200</cweid>
  <wascid>13</wascid>
  <sourceid>3</sourceid>
</alertitem>
</alerts></site></OWASPZAPReport>