{"id":319419,"date":"2021-03-11T15:01:41","date_gmt":"2021-03-11T15:01:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=319419"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=319419","title":{"rendered":"\u041f\u0438\u0448\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Burp Suite \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Python"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1dc\/115\/fe3\/1dc115fe3bfa7a3209b3518748dcf4d7.png\" width=\"720\" height=\"405\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0414\u0443\u043c\u0430\u044e \u043c\u043d\u043e\u0433\u0438\u0435 \u0437\u043d\u0430\u044e\u0442 \u043e \u0442\u0430\u043a\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435, \u043a\u0430\u043a Burp Suite \u043e\u0442 PortSwigger. Burp Suite \u2013 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e Burp \u0438 \u0442\u0430\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043d\u043d\u0443 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u043d \u0435\u0449\u0435 \u0438 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043d\u0430 Python \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043d\u0435 \u0442\u0430\u043a \u0438 \u043c\u043d\u043e\u0433\u043e, \u0434\u0443\u043c\u0430\u044e, \u0437\u0434\u0435\u0441\u044c \u0441\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0442\u043e, \u0447\u0442\u043e Burp \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Java, \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Java. \u041d\u043e \u0447\u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0430\u0442\u044c, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043d\u0443\u0436\u043d\u044b \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e, \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e Bug Bounty. \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0430\u0437\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0434\u043b\u044f Burp Suite \u043d\u0430 Python, \u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043a\u0430\u043d\u0435\u0440 CORS misconfiguration.<\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435<\/h2>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, Burp \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Java, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 Python \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c <a href=\"https:\/\/www.jython.org\/download\" rel=\"noopener noreferrer nofollow\">Jython<\/a> Standalone Edition, \u043a\u0430\u043a \u043e\u0431 \u044d\u0442\u043e\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442 <a href=\"https:\/\/portswigger.net\/burp\/extender\/writing-your-first-burp-suite-extension\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 PortSwigger<\/a>. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c Burp \u0438 \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432 Extender &#8212; Options &#8212; Python environment \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u0434\u043e \u043d\u0430\u0448\u0435\u0433\u043e Jython \u0444\u0430\u0439\u043b\u0430.<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ea7\/a51\/e17\/ea7a51e17729bb0a142d2a37ed68a399.jpg\" alt=\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Python Environment\" title=\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Python Environment\" width=\"902\" height=\"726\"><figcaption>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Python Environment<\/figcaption><\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 Burp \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <a href=\"https:\/\/github.com\/securityMB\/burp-exceptions\" rel=\"noopener noreferrer nofollow\">burp-exceptions<\/a>. \u0415\u0441\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0442\u043e \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Java:<\/p>\n<details class=\"spoiler\">\n<summary>Java \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">java.lang.RuntimeException: org.python.core.PyException   at burp.fl.a(Unknown Source)   at burp.edd.a(Unknown Source)   at burp.e2g.a(Unknown Source)   at burp.e2g.g(Unknown Source)   at burp.i1c.stateChanged(Unknown Source)   at javax.swing.JTabbedPane.fireStateChanged(JTabbedPane.java:416)   at javax.swing.JTabbedPane$ModelListener.stateChanged(JTabbedPane.java:270)   ...<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0438\u0448\u0435\u043c \u043c\u044b \u043d\u0430 Python, \u0438 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 Java, \u0442\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0439 \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u0438 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435. \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Java \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Python \u0432\u0438\u0434:<\/p>\n<details class=\"spoiler\">\n<summary>Python \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">*** PYTHON EXCEPTION Traceback (most recent call last):   File \"\/Users\/mb\/Desktop\/burp extension\/exceptions_fix.py\", line 8, in decorated_function     return original_function(*args, **kwargs)   File \"\/Users\/mb\/Desktop\/burp extension\/CustomEditorTab.py\", line 78, in setMessage     self._txtInput.setEsditable(self._editable) AttributeError: 'burp.ul' object has no attribute 'setEsditable'<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c, \u0434\u0430\u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435:<\/p>\n<ol>\n<li>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c Burp, \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432 Extender &#8212; Options &#8212; Python environment. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0432 \u043f\u043e\u043b\u0435 <strong>Folder for loading modules<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c <a href=\"https:\/\/github.com\/securityMB\/burp-exceptions\/blob\/master\/exceptions_fix.py\" rel=\"noopener noreferrer nofollow\">exceptions_fix.py<\/a> \u0438 \u043a\u043b\u0430\u0434\u0435\u043c \u0435\u0433\u043e \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0444\u0430\u0439\u043b \u0441 \u043d\u0430\u0448\u0438\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0448\u0435\u043c \u0443\u0436\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435<\/p>\n<\/li>\n<\/ol>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c<\/h2>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043a\u0430\u043d\u0435\u0440 CORS \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0414\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c Python \u0444\u0430\u0439\u043b. \u041d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, <strong>cors-scanner.py<\/strong>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a<\/p>\n<pre><code class=\"python\">try:   from exceptions_fix import FixBurpExceptions except ImportError:   pass<\/code><\/pre>\n<p>\u0418\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 <code>burp<\/code> \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b<\/p>\n<pre><code class=\"python\">from burp import IBurpExtender, IScannerCheck, IScanIssue<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a<\/p>\n<pre><code class=\"python\">from java.io import PrintWriter import sys<\/code><\/pre>\n<p>\u0418 \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430 \u0441\u0430\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a:<\/p>\n<pre><code class=\"python\">try:     FixBurpExceptions() except:     pass<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0441 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438 \u043f\u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043e, \u0432\u0440\u0435\u043c\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434<\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 BurpExtender<\/h2>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f &#8212; \u043d\u0430\u0448\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 <a href=\"https:\/\/github.com\/PortSwigger\/active-scan-plus-plus\/blob\/master\/activeScan%2B%2B.py\" rel=\"noopener noreferrer nofollow\">activeScan++<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u043e\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 Python. \u041c\u044b \u0436\u0435 \u043e\u0431\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0438\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043c \u0438 \u0441\u043a\u0430\u043d\u0435\u0440 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"python\">class BurpExtender(IBurpExtender, IScannerCheck):<\/code><\/pre>\n<p><a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/iburpextender.html\" rel=\"noopener noreferrer nofollow\">IBurpExtender<\/a> &#8212; \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0435\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f Burp.<br \/><a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/iscannercheck.html\" rel=\"noopener noreferrer nofollow\">IScannerCheck<\/a> &#8212; \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043a\u0430\u043d\u0435\u0440\u0430, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0438\/\u0438\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0435\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<\/p>\n<pre><code class=\"python\">def registerExtenderCallbacks(self, callbacks):    sys.stdout = PrintWriter(callbacks.getStdout(), True)    self._callbacks = callbacks   self._helpers = callbacks.getHelpers()    callbacks.setExtensionName('CORS Passive Scanner')    callbacks.registerScannerCheck(self)<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0438 \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u0438\u043c\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u0410 \u0442\u0430\u043a \u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0448 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0441\u043a\u0430\u043d\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e<\/p>\n<pre><code class=\"python\">callbacks.registerScannerCheck(self)<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u0432-\u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 <code>registerScannerCheck(..)<\/code> \u043c\u044b \u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043a\u043b\u0430\u0441\u0441\u044b. \u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441 \u0443 \u043d\u0430\u0441 \u043e\u0434\u0438\u043d &#8212; \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c <code>self<\/code>.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<pre><code class=\"python\">def doPassiveScan(self, baseRequestResponse):<\/code><\/pre>\n<p><a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/IHttpRequestResponse.html\" rel=\"noopener noreferrer nofollow\">baseRequestResponse<\/a> &#8212; \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0438 \u043e\u0442\u0432\u0435\u0442\u0435, \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438: \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u043c \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 CORS misconfiguration? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 &#8212; \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u044d\u0442\u0438 \u0434\u0432\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>Access-Control-Allow-Origin<\/p>\n<\/li>\n<li>\n<p>Access-Control-Allow-Credentials<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u0445 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442 \u043d\u0430\u043c \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u0435\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0442\u0435\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432.<\/p>\n<p>\u041d\u0430\u0448\u0438 <code>_helpers<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0432\u044b\u0448\u0435, \u0438\u043c\u0435\u044e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u0430\u043a <a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/IExtensionHelpers.html#analyzeResponse(byte[])\" rel=\"noopener noreferrer nofollow\">analyzeResponse(..)<\/a>, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u043c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0442\u0432\u0435\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0412 <code>analyzeResponse(..)<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0430\u0448 \u043e\u0442\u0432\u0435\u0442 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0448\u0435\u043b \u0432 \u0432\u0438\u0434\u0435 \u0431\u0430\u0439\u0442\u043e\u0432). \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>baseRequestResponse<\/code> (\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441, \u0438 \u043e\u0442\u0432\u0435\u0442, \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>getResponse()<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e,&nbsp;<code>analyzeResponse(..)<\/code>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0423\u0441\u0442\u0430\u0432 \u043e\u0442 \u0441\u043b\u043e\u0432\u0430 &#171;\u043e\u0442\u0432\u0435\u0442&#187; \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0432\u0432\u0438\u0434\u0435 <a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/IResponseInfo.html\" rel=\"noopener noreferrer nofollow\">IResponseInfo<\/a>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u044b\u0445 \u043d\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0443\u0436\u043d\u044b \u043d\u0430\u043c, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c &#8212; \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438. \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0435\u043c \u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>getHeaders()<\/code>. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0438\u0445 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0438 \u0438\u0434\u0443\u0442 \u0432 Java \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<\/p>\n<pre><code class=\"python\">def doPassiveScan(self, baseRequestResponse):    response_headers = list(self._helpers.analyzeResponse(baseRequestResponse.getResponse()).getHeaders())  <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u0438\u0449\u0435\u043c \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 <code>Access-Control-Allow-Origin<\/code> \u043b\u0438\u0431\u043e <code>Access-Control-Allow-Credentials<\/code>.<\/p>\n<pre><code class=\"python\">def doPassiveScan(self, baseRequestResponse):            response_headers = list(self._helpers.analyzeResponse(baseRequestResponse.getResponse()).getHeaders())     for response_header in response_headers:     if 'Access-Control-Allow-Origin' in response_header or 'Access-Control-Allow-Credentials' in response_header:<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e<\/p>\n<pre><code class=\"python\">sys.stdout.println(response_headers)<\/code><\/pre>\n<p>\u0422\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"python\">[u'Access-Control-Allow-Credentials: true', u'cache-control: private, s-maxage=0, no-store, no-cache'] # \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 URL. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0445<\/p>\n<pre><code class=\"python\">request_url = self._helpers.analyzeRequest(baseRequestResponse).getUrl() request_headers = self._helpers.analyzeRequest(baseRequestResponse).getHeaders()<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u0441\u0430\u0439\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043b\u044e\u0431\u043e\u043c\u0443 \u0441\u0443\u0431\u0434\u043e\u043c\u0435\u043d\u0443 \u0438 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 http, \u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 (\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u043e\u0434\u043d\u043e, \u0442\u0443\u0442 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043d\u0430 \u0432\u043a\u0443\u0441 \u0438 \u0446\u0432\u0435\u0442. \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0430\u0439\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0441\u0443\u0431\u0434\u043e\u043c\u0435\u043d\u043e\u0432, \u0442\u043e \u043c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0442\u0435\u0441\u0442\u044b, \u0430 \u0432\u0435\u0434\u044c \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u043a\u0440\u044b\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u0430\u0439\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043b\u044e\u0431\u043e\u043c\u0443 \u0434\u043e\u043c\u0435\u043d\u0443, \u0438 \u0442\u0430\u043a\u0430\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u0442\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a <code>issues<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438, \u0438 \u0432\u0435\u0440\u043d\u0435\u043c \u0438\u0445 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u0441\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">def doPassiveScan(self, baseRequestResponse):            response_headers = list(self._helpers.analyzeResponse(baseRequestResponse.getResponse()).getHeaders())     for response_header in response_headers:     if 'Access-Control-Allow-Origin' in response_header or 'Access-Control-Allow-Credentials' in response_header:        request_url = self._helpers.analyzeRequest(baseRequestResponse).getUrl()       request_headers = self._helpers.analyzeRequest(baseRequestResponse).getHeaders()        issues = []<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0430\u043b\u0430 \u043f\u043e\u0440\u0430 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0438\u0445 payloads.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c Origin \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0421\u0434\u0435\u043b\u0430\u044e \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 &#8212; \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e. \u0415\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0441\u043a\u0430\u043d\u0435\u0440, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Python &#8212; <a href=\"https:\/\/github.com\/chenjj\/CORScanner\" rel=\"noopener noreferrer nofollow\">CORScanner<\/a>, \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0442\u0442\u0443\u0434\u0430. \u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0443\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u043c\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 (\u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e misconfiguration, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 &#8212; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0441\u0432\u043e\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a.<\/p>\n<p>\u041d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 &#8212; URL.<\/p>\n<pre><code class=\"python\">def _generate_payloads(self, url):    host = url.getHost()   protocol = url.getProtocol()    payloads = {}<\/code><\/pre>\n<p>\u0414\u043e\u0441\u0442\u0430\u0435\u043c \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e URL \u0434\u0432\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 &#8212; \u0445\u043e\u0441\u0442 \u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u042f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439. \u0422\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u043a\u043b\u044e\u0447 (\u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0438\u0437 \u0441\u043a\u0430\u043d\u0435\u0440\u0430 \u0441 \u0433\u0438\u0442\u0445\u0430\u0431\u0430), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u041c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">{'trust_any_origin': {'payload_url': 'XXX', 'description': 'YYY', 'severity': 'ZZZ'}}<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043c severity, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 Burp. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043b\u044e\u0431\u043e\u0433\u043e URL \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043e\u043f\u0430\u0441\u043d\u0435\u0435, \u0447\u0435\u043c \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0441\u0443\u0431\u0434\u043e\u043c\u0435\u043d\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0430\u0440\u0433\u0435\u0442\u0430. \u0414\u0430\u043b\u0435\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0445 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c<\/p>\n<pre><code class=\"python\">def _generate_payloads(self, url):    host = url.getHost()   protocol = url.getProtocol()    payloads = {}    # trust any origin   payload_url = '{}:\/\/evil.com'.format(protocol)   payloads['trust_any_origin'] = {'origin': payload_url, 'description': 'Site trust any origin', 'severity': 'High'}    # trust any subdomain   payload_url = '{}:\/\/evil.{}'.format(protocol, host)   payloads['trust_any_subdomain'] = {'origin': payload_url, 'description': 'Site trust any subdomain', 'severity': 'High'}    # trust insecure protocol   if protocol == 'https':     payload_url = 'http:\/\/evil.{}'.format(host)     payloads['trust_http'] = {'origin': payload_url, 'description': 'Site trust insecure protocol', 'severity': 'Medium'}    # trust null   payload_url = 'null'   payloads['trust_null'] = {'origin': payload_url, 'description': 'Site trust null origin', 'severity': 'High'}    # prefix match full url   payload_url = '{}:\/\/{}.evil.com'.format(protocol, host)   payloads['trust_prefix'] = {'origin': payload_url, 'description': 'Site trust prefix', 'severity': 'High'}    # trust invalid dot escape   splitted_host = host.split('.')   payload_host = '{}A{}.{}'.format('.'.join(splitted_host[:-1]), splitted_host[-1], splitted_host[-1])   payload_url = '{}:\/\/{}'.format(protocol, payload_host)   payloads['trust_invalid_regex'] = {'origin': payload_url, 'description': 'Site trust origin with unescaped dot', 'severity': 'High'}    return payloads<\/code><\/pre>\n<p>\u0421\u0434\u0435\u043b\u0430\u044e \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 <code>{'severity': 'Medium'}<\/code> \u0434\u043b\u044f http \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0430\u0442\u0430\u043a\u0438 \u0431\u044b\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0439, \u043d\u0435 \u043d\u0430\u0439\u0434\u0443 \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0441\u044b\u043b\u043a\u0443, \u043d\u043e \u0430\u0432\u0442\u043e\u0440 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b, \u0447\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0440\u0435\u043f\u043e\u0440\u0442 \u0432 Google &#8212; \u0442\u0435 \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438 \u0438 \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0435\u0433\u043e. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0440\u0442 \u0442\u0430\u043a \u0436\u0435 \u0431\u044b\u043b \u043f\u0440\u0438\u043d\u044f\u0442 \u043d\u0430 HackerOne (<a href=\"https:\/\/hackerone.com\/reports\/629892\" rel=\"noopener noreferrer nofollow\">#629892<\/a>). \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0433\u0434\u0430 \u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c &#8212; \u043c\u043d\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043b\u0438 N\/A. \u0422\u0430\u043a \u0447\u0442\u043e \u044f \u0434\u0443\u043c\u0430\u044e \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0440\u0438\u0430\u0433\u0435\u0440\u0430 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c Medium, \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u0435\u0435 \u043f\u0440\u0438\u044f\u043d\u044f\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/572\/bcd\/4d9\/572bcd4d90f883142c1d4084b54c0abb.png\" width=\"946\" height=\"384\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<h2>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u044b<\/h2>\n<p>\u041d\u0443 \u0445\u043e\u0440\u043e\u0448\u043e, \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a <code>doPassiveScan<\/code>. \u041d\u043e \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434<\/p>\n<pre><code class=\"python\">def _add_origin(self, headers, value):   headers = list(headers)   headers.append('Origin: {}'.format(value))   return headers<\/code><\/pre>\n<p>\u0412 \u043d\u0435\u0433\u043e \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043d\u0438\u043c \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 Origin \u0438 \u0432\u0435\u0440\u043d\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e.<\/p>\n<p>\u0418\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u044b, \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>payload_headers<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430\u0448\u0438 \u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0430\u0442\u0430\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0442 <code>_add_origin<\/code><em>.<\/em><\/p>\n<pre><code class=\"python\">def doPassiveScan(self, baseRequestResponse):    response_headers = list(self._helpers.analyzeResponse(baseRequestResponse.getResponse()).getHeaders())     for response_header in response_headers:     if 'Access-Control-Allow-Origin' in response_header or 'Access-Control-Allow-Credentials' in response_header:        request_url = self._helpers.analyzeRequest(baseRequestResponse).getUrl()       request_headers = self._helpers.analyzeRequest(baseRequestResponse).getHeaders()        issues = []       payloads = self._generate_payloads(request_url)        for payload in payloads.values():         payload_headers = self._add_origin(request_headers, payload['origin'])<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u0442\u0435\u043b\u043e. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c offset \u0434\u043b\u044f \u0442\u0435\u043b\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0430\u043c\u043e \u0442\u0435\u043b\u043e, \u0441\u0440\u0435\u0437\u0430\u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443. <\/p>\n<pre><code class=\"python\">body_offset = self._helpers.analyzeRequest(baseRequestResponse).getBodyOffset() request_body = baseRequestResponse.getRequest()[body_offset:]<\/code><\/pre>\n<p>\u0418, \u0435\u0441\u043b\u0438 \u0442\u0435\u043b\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435, \u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 &#8212; \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c None<\/p>\n<pre><code class=\"python\">if len(request_body) == 0:     request = self._helpers.buildHttpMessage(payload_headers, None)   else:     request = self._helpers.buildHttpMessage(payload_headers, request_body)<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 POST \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043d\u0435 \u0442\u0435\u0440\u044f\u043b\u043e\u0441\u044c \u0442\u0435\u043b\u043e, \u043a\u0430\u043a \u043d\u0438 \u0442\u0440\u0443\u0434\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e, \u0434\u043e\u0441\u0442\u0430\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043f\u043e \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435<\/p>\n<pre><code class=\"python\">response = self._callbacks.makeHttpRequest(baseRequestResponse.getHttpService(), request) response_headers = list(self._helpers.analyzeResponse(response.getResponse()).getHeaders())<\/code><\/pre>\n<p>\u0427\u0442\u043e \u043c\u044b \u0438\u0449\u0435\u043c \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e &#8212; \u043d\u0430\u043b\u0438\u0447\u0438\u0435 <code>Access-Control-Allow-Origin<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043b \u043d\u0430\u0448\u0435\u043c\u0443 Origin \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442.<\/p>\n<pre><code class=\"python\">for response_header in response_headers:   if 'Access-Control-Allow-Origin' in response_header:<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f &#8212; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e \u043d\u0435\u0439 Burp, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u043e\u043e\u0431\u0449\u0438\u043b \u043e \u043d\u0435\u0439 \u043d\u0430\u043c. \u041e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u044d\u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>cors-scanner.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def doPassiveScan(self, baseRequestResponse):    response_headers = list(self._helpers.analyzeResponse(baseRequestResponse.getResponse()).getHeaders())     for response_header in response_headers:     if 'Access-Control-Allow-Origin' in response_header or 'Access-Control-Allow-Credentials' in response_header:        request_url = self._helpers.analyzeRequest(baseRequestResponse).getUrl()       request_headers = self._helpers.analyzeRequest(baseRequestResponse).getHeaders()        issues = []       payloads = self._generate_payloads(request_url)        for payload in payloads.values():         payload_headers = self._add_origin(request_headers, payload['origin'])          body_offset = self._helpers.analyzeRequest(baseRequestResponse).getBodyOffset()         request_body = baseRequestResponse.getRequest()[body_offset:]          if len(request_body) == 0:           request = self._helpers.buildHttpMessage(payload_headers, None)         else:           request = self._helpers.buildHttpMessage(payload_headers, request_body)          response = self._callbacks.makeHttpRequest(baseRequestResponse.getHttpService(), request)         response_headers = list(self._helpers.analyzeResponse(response.getResponse()).getHeaders())          for response_header in response_headers:           if 'Access-Control-Allow-Origin' in response_header:       return issues <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c!<\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044f\u0441\u044c \u043e\u0442 <a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/IScanIssue.html\" rel=\"noopener noreferrer nofollow\">IScanIssue<\/a><\/p>\n<pre><code class=\"python\">class CustomScanIssue(IScanIssue):<\/code><\/pre>\n<p>\u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c <code>__init__<\/code><\/p>\n<pre><code class=\"python\">def __init__(self, httpService, url, httpMessages, name, detail, severity):   self._httpService = httpService   self._url = url   self._httpMessages = httpMessages   self._name = name   self._detail = detail   self._severity = severity   self._confidence = 'Certain'   return<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438. URL, \u0438\u043c\u044f, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, severity, confidence \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412\u0441\u044f \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432 Dashboard \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 URL, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b, \u0447\u0442\u043e\u0431\u044b Burp \u043c\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u043b\u0430\u0441\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">class CustomScanIssue(IScanIssue):   def __init__(self, httpService, url, httpMessages, name, detail, severity):     self._httpService = httpService     self._url = url     self._httpMessages = httpMessages     self._name = name     self._detail = detail     self._severity = severity     self._confidence = 'Certain'    def getUrl(self):     return self._url    def getIssueName(self):     return self._name    def getIssueType(self):     return 0    def getSeverity(self):     return self._severity    def getConfidence(self):     return self._confidence    def getIssueBackground(self):     return None    def getRemediationBackground(self):     return None    def getIssueDetail(self):     return self._detail    def getRemediationDetail(self):     return None    def getHttpMessages(self):     return self._httpMessages    def getHttpService(self):     return self._httpService<\/code><\/pre>\n<h2>\u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0412 \u043d\u0430\u0448 \u0431\u043b\u043e\u043a, \u0433\u0434\u0435 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <code>Access-Control-Allow-Origin<\/code> \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043f\u043e\u0441\u043b\u0435 \u0430\u0442\u0430\u043a\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"python\">for response_header in response_headers:   if 'Access-Control-Allow-Origin' in response_header:      issues.append(       CustomScanIssue(         baseRequestResponse.getHttpService(),         request_url,         [response],         'CORS Misconfiguration',         payload['description'],         payload['severity']       )     )                                  break<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>HTTP \u0441\u0435\u0440\u0432\u0438\u0441\u044b<\/p>\n<\/li>\n<li>\n<p>URL, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c<\/p>\n<\/li>\n<li>\n<p><code>response<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 <code>makeHttpRequest<\/code>, \u0441\u044e\u0434\u0430 \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u043a\u0443 \u0432 UI, \u043d\u043e \u043d\u0430\u043c \u0442\u0430\u043a\u043e\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438, \u0443 \u043d\u0430\u0441 \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>Severity, \u0442\u0430\u043a \u0436\u0435 \u0438\u0437 \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u0430<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u043c \u0446\u0438\u043a\u043b, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u043c\u044b \u0443\u0436\u0435 \u043d\u0430\u0448\u043b\u0438 \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0443 \u043d\u0430\u0441 <code>Access-Control-Allow-Origin: *<\/code><\/p>\n<pre><code class=\"python\">if response_header == 'Access-Control-Allow-Origin: *':   return CustomScanIssue(     baseRequestResponse.getHttpService(),     request_url,     [baseRequestResponse],     'CORS Misconfiguration',     'Site trust *',     'Medium' )<\/code><\/pre>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043c\u044b \u044d\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0440\u044f \u043d\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c URL, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 <code>Allow-Origin<\/code> \u0443 \u043d\u0430\u0441 wildcard.<\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>consolidateDuplicateIssues<\/code>. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u0430\u044f \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e URL.<\/p>\n<pre><code class=\"python\">def consolidateDuplicateIssues(self, existingIssue, newIssue):   if existingIssue.getIssueDetail() == newIssue.getIssueDetail():     return -1    return 0<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0443 \u043d\u0430\u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435, \u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e. \u0415\u0441\u043b\u0438 \u043d\u0430\u0448\u043b\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 URL &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c.<\/p>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>cors-scanner.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from burp import IBurpExtender, IScannerCheck, IScanIssue from java.io import PrintWriter import sys  try:     from exceptions_fix import FixBurpExceptions except ImportError:     pass  class BurpExtender(IBurpExtender, IScannerCheck):    def registerExtenderCallbacks(self, callbacks):      sys.stdout = PrintWriter(callbacks.getStdout(), True)      self._callbacks = callbacks     self._helpers = callbacks.getHelpers()      callbacks.setExtensionName('CORS Passive Scanner')      callbacks.registerScannerCheck(self)     def _add_origin(self, headers, value):     headers = list(headers)     headers.append('Origin: {}'.format(value))     return headers     def _generate_payloads(self, url):      host = url.getHost()     protocol = url.getProtocol()      payloads = {}      # trust any origin     payload_url = '{}:\/\/evil.com'.format(protocol)     payloads['trust_any_origin'] = {'origin': payload_url, 'description': 'Site trust any origin', 'severity': 'High'}      # trust any subdomain     payload_url = '{}:\/\/evil.{}'.format(protocol, host)     payloads['trust_any_subdomain'] = {'origin': payload_url, 'description': 'Site trust any subdomain', 'severity': 'High'}      # trust insecure protocol     if protocol == 'https':       payload_url = 'http:\/\/evil.{}'.format(host)       payloads['trust_http'] = {'origin': payload_url, 'description': 'Site trust insecure protocol', 'severity': 'Medium'}      # trust null     payload_url = 'null'     payloads['trust_null'] = {'origin': payload_url, 'description': 'Site trust null origin', 'severity': 'High'}      # prefix match full url     payload_url = '{}:\/\/{}.evil.com'.format(protocol, host)     payloads['trust_prefix'] = {'origin': payload_url, 'description': 'Site trust prefix', 'severity': 'High'}      # trust invalid regex dot escape     splitted_host = host.split('.')     payload_host = '{}A{}.{}'.format('.'.join(splitted_host[:-1]), splitted_host[-1], splitted_host[-1])     payload_url = '{}:\/\/{}'.format(protocol, payload_host)     payloads['trust_invalid_regex'] = {'origin': payload_url, 'description': 'Site trust origin with unescaped dot', 'severity': 'High'}      return payloads     def doPassiveScan(self, baseRequestResponse):              response_headers = list(self._helpers.analyzeResponse(baseRequestResponse.getResponse()).getHeaders())       for response_header in response_headers:       if 'Access-Control-Allow-Origin' in response_header or 'Access-Control-Allow-Credentials' in response_header:          request_url = self._helpers.analyzeRequest(baseRequestResponse).getUrl()         request_headers = self._helpers.analyzeRequest(baseRequestResponse).getHeaders()           if response_header == 'Access-Control-Allow-Origin: *':           return CustomScanIssue(             baseRequestResponse.getHttpService(),             request_url,             [baseRequestResponse],             'CORS Misconfiguration',             'Site trust any origin',             'Medium'            )          issues = []         payloads = self._generate_payloads(request_url)          for payload in payloads.values():           payload_headers = self._add_origin(request_headers, payload['origin'])            body_offset = self._helpers.analyzeRequest(baseRequestResponse).getBodyOffset()           request_body = baseRequestResponse.getRequest()[body_offset:]            if len(request_body) == 0:             request = self._helpers.buildHttpMessage(payload_headers, None)           else:             request = self._helpers.buildHttpMessage(payload_headers, request_body)            response = self._callbacks.makeHttpRequest(baseRequestResponse.getHttpService(), request)           response_headers = list(self._helpers.analyzeResponse(response.getResponse()).getHeaders())            for response_header in response_headers:             if 'Access-Control-Allow-Origin' in response_header:                issues.append(                 CustomScanIssue(                   baseRequestResponse.getHttpService(),                   request_url,                   [response],                   'CORS Misconfiguration',                   payload['description'],                   payload['severity']                 )               )                                            break          return issues          def consolidateDuplicateIssues(self, existingIssue, newIssue):     if existingIssue.getIssueDetail() == newIssue.getIssueDetail():       return -1     return 0  class CustomScanIssue(IScanIssue):   def __init__(self, httpService, url, httpMessages, name, detail, severity):     self._httpService = httpService     self._url = url     self._httpMessages = httpMessages     self._name = name     self._detail = detail     self._severity = severity     self._confidence = 'Certain'    def getUrl(self):     return self._url    def getIssueName(self):     return self._name    def getIssueType(self):     return 0    def getSeverity(self):     return self._severity    def getConfidence(self):     return self._confidence    def getIssueBackground(self):     return None    def getRemediationBackground(self):     return None    def getIssueDetail(self):     return self._detail    def getRemediationDetail(self):     return None    def getHttpMessages(self):     return self._httpMessages    def getHttpService(self):     return self._httpService  try:   FixBurpExceptions() except:   pass<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435, \u0432\u0440\u0435\u043c\u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435.<\/p>\n<h2>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0432 Burp<\/h2>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e &#8212; \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 Extender, \u0434\u0430\u043b\u0435\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0430 Extensions -&gt; Add.<br \/>Extension type &#8212; \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, Python<br \/>Extension file &#8212; \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0448 \u0444\u0430\u0439\u043b<\/p>\n<p>\u0416\u043c\u0435\u043c Next, \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u0414\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u041c\u043e\u0436\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/p>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u0411\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0441 HackerOne \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u044b\u043b\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0430 \u0437\u0430\u0440\u0435\u043f\u043e\u0440\u0447\u0435\u043d\u0430\u044f \u043c\u043d\u043e\u0439 CORS misconfiguration, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0430\u0439\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441 Origin, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c.<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u0445\u043e\u0434\u0438\u0442\u044c &#8212; \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u043d\u0430\u0448\u0438 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u044f\u043c \u0432 \u043b\u0430\u0431\u0430\u0445 PortSwigger.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 &#8212; <a href=\"https:\/\/portswigger.net\/web-security\/cors\/lab-basic-origin-reflection-attack\" rel=\"noopener noreferrer nofollow\">Origin Reflect<\/a>. \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0432\u0441\u0435\u0433\u0434\u0430. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043b\u0430\u0431\u0443, \u043b\u043e\u0433\u0438\u043d\u0438\u043c\u0441\u044f \u0432 \u043d\u0430\u0448 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u043f\u043e\u0434 <code>wiener:peter<\/code>. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u043a\u0441\u0438 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0437\u0430\u043b\u043e\u0433\u0438\u043d\u0438\u043b\u0438\u0441\u044c. \u041a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043b\u043e\u0432\u0438\u043c \u0441\u0440\u0430\u0437\u0443 6 High \u0440\u0435\u043f\u043e\u0440\u0442\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7be\/fa1\/21c\/7befa121ca3027c73cc9b2226deff7c8.jpg\" alt=\"\u0421\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432\u0441\u0435 6 \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u043e\u0432, \u0447\u0442\u043e \u0432\u0435\u0440\u043d\u043e\" title=\"\u0421\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432\u0441\u0435 6 \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u043e\u0432, \u0447\u0442\u043e \u0432\u0435\u0440\u043d\u043e\" width=\"614\" height=\"406\"><figcaption>\u0421\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432\u0441\u0435 6 \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u043e\u0432, \u0447\u0442\u043e \u0432\u0435\u0440\u043d\u043e<\/figcaption><\/figure>\n<p><a href=\"https:\/\/portswigger.net\/web-security\/cors\/lab-null-origin-whitelisted-attack\" rel=\"noopener noreferrer nofollow\">\u0412\u0442\u043e\u0440\u0430\u044f \u043b\u0430\u0431\u0430<\/a> &#8212; \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0441\u0430\u0439\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 <code>Origin: null<\/code><br \/>\u041c\u044b \u0442\u0430\u043a\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0434\u0435\u043b\u0430\u043b\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u043f\u043e\u0434 <code>wiener:peter<\/code>.&nbsp;\u041d\u0435 \u0443\u0434\u0438\u0432\u043b\u044f\u044f\u0441\u044c, \u043b\u043e\u0432\u0438\u043c \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d7\/e12\/cc2\/1d7e12cc217c22a22843ff7c78f10a04.jpg\" alt=\"null origin\" title=\"null origin\" width=\"604\" height=\"311\"><figcaption>null origin<\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f <a href=\"https:\/\/portswigger.net\/web-security\/cors\/lab-breaking-https-attack\" rel=\"noopener noreferrer nofollow\">\u0442\u0440\u0435\u0442\u044c\u044f \u043b\u0430\u0431\u0430<\/a> &#8212; \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0441 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0441\u043f\u043e\u0440\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b. \u041b\u043e\u0433\u0438\u043d\u0438\u043c\u0441\u044f \u0432 \u0430\u043a\u043a\u0430\u0443\u043d\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u0442\u043e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/050\/76e\/78f\/05076e78f0239a8f499008b74c1e3f57.jpg\" alt=\"Medium, \u043a\u0430\u043a \u0438 \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e\" title=\"Medium, \u043a\u0430\u043a \u0438 \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e\" width=\"561\" height=\"304\"><figcaption>Medium, \u043a\u0430\u043a \u0438 \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e<\/figcaption><\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0441\u0430\u0439\u0442\u0430\u0445 (\u0445\u043e\u0442\u044f, \u043e\u0442 \u043b\u0430\u0431\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f), \u043d\u043e \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u0443\u044e \u043c\u043d\u043e\u0439 \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0437\u0430\u043a\u0440\u044b\u043b\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0443\u0431\u0434\u043e\u043c\u0435\u043d \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u0430, \u043d\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0430\u0439\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043b\u044e\u0431\u044b\u0445 \u0441\u0443\u0431\u0434\u043e\u043c\u0435\u043d\u043e\u0432. \u041e\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u043d\u0435\u043b\u0435\u0433\u043a\u043e, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0431\u043e XSS \u043d\u0430 \u0441\u0443\u0431\u0434\u043e\u043c\u0435\u043d\u0435, \u043b\u0438\u0431\u043e subdomain-takeover. \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u044b\u0439 URL, \u0432\u0438\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f5\/6cf\/a74\/7f56cfa74c166aa358b29f070434148d.jpg\" alt=\"\u0420\u0435\u043f\u043e\u0440\u0442 \u0432 dashboard\" title=\"\u0420\u0435\u043f\u043e\u0440\u0442 \u0432 dashboard\" width=\"498\" height=\"322\"><figcaption>\u0420\u0435\u043f\u043e\u0440\u0442 \u0432 dashboard<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5e1\/48b\/15c\/5e148b15c500fe1c2bc0ad672394e551.jpg\" alt=\"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\" title=\"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\" width=\"548\" height=\"136\"><figcaption>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430<\/figcaption><\/figure>\n<h2>\u0418\u0442\u043e\u0433\u0438<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0434\u043b\u044f Burp Suite \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Python. \u042f \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043f\u043e\u0434 \u043d\u0435\u0433\u043e, \u0434\u0430 \u0438 \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0435\u043b\u043e \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u0445 \u043b\u0438\u0431\u043e \u0432 \u043b\u043e\u0433\u0438\u043a\u0435 \u0440\u0430\u0431\u043e\u0442\u044b. \u0421\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 \u0432 Java \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u043b\u044f Python. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 &#8212; \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u0430\u043a CORS misconfiguration. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 &#8212; \u0434\u0430\u043d\u043d\u0430\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u0435\u0441\u043b\u043e\u0432\u0443\u0442\u0430\u044f XSS, \u0438 \u043b\u0435\u0433\u0447\u0435 \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u043c\u043f\u0430\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0438\u0447\u044c, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0435\u043b\u0438\u043a. \u042f \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044e CORS \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u0432\u0435\u0437\u0434\u0435, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0432 \u043a\u0430\u0440\u043c\u0430\u043d\u0435 \u0443\u0436\u0435 Information Disclosure \u0438\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 OTA.<\/p>\n<p>\u0421\u043a\u0430\u043d\u0435\u0440 \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f Burp &#8212; \u0432\u0435\u0449\u044c \u043d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0430\u044f, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f CORS \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 (\u043b\u0438\u0431\u043e \u044f \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b).<\/p>\n<p>Burp &#8212; \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0445\u043e\u0431\u0431\u0438 \u0438 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u0411\u0430\u0433\u0445\u0430\u043d\u0442\u0435\u0440\u044b \u0437\u043d\u0430\u044e\u0442, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0441\u043e\u043a\u0430 \u0431\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044f, \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0438\u0433\u0440\u0430\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u0440\u043e\u043b\u044c. \u042f \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u044e \u0432\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b, \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u0437\u0443\u0447\u0430\u044f \u0440\u0443\u043a\u0430\u043c\u0438. <\/p>\n<p>\u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c &#8212; \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u043b\u0438, \u0431\u0430\u0433\u0445\u0430\u043d\u0442\u0435\u0440\u0430\u043c &#8212; \u0443\u0434\u0430\u0447\u0438! <\/p>\n<p>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0438 \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/546476\/\"> https:\/\/habr.com\/ru\/post\/546476\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0414\u0443\u043c\u0430\u044e \u043c\u043d\u043e\u0433\u0438\u0435 \u0437\u043d\u0430\u044e\u0442 \u043e \u0442\u0430\u043a\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435, \u043a\u0430\u043a Burp Suite \u043e\u0442 PortSwigger. Burp Suite \u2013 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e Burp \u0438 \u0442\u0430\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043d\u043d\u0443 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u043d \u0435\u0449\u0435 \u0438 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043d\u0430 Python \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043d\u0435 \u0442\u0430\u043a \u0438 \u043c\u043d\u043e\u0433\u043e, \u0434\u0443\u043c\u0430\u044e, \u0437\u0434\u0435\u0441\u044c \u0441\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0442\u043e, \u0447\u0442\u043e Burp \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Java, \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Java. \u041d\u043e \u0447\u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0430\u0442\u044c, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043d\u0443\u0436\u043d\u044b \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e, \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e Bug Bounty. \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0430\u0437\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0434\u043b\u044f Burp Suite \u043d\u0430 Python, \u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043a\u0430\u043d\u0435\u0440 CORS misconfiguration.<\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435<\/h2>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, Burp \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Java, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 Python \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c <a href=\"https:\/\/www.jython.org\/download\" rel=\"noopener noreferrer nofollow\">Jython<\/a> Standalone Edition, \u043a\u0430\u043a \u043e\u0431 \u044d\u0442\u043e\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442 <a href=\"https:\/\/portswigger.net\/burp\/extender\/writing-your-first-burp-suite-extension\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 PortSwigger<\/a>. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c Burp \u0438 \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432 Extender &#8212; Options &#8212; Python environment \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u0434\u043e \u043d\u0430\u0448\u0435\u0433\u043e Jython \u0444\u0430\u0439\u043b\u0430.<\/p>\n<figure class=\"bordered full-width\"><figcaption>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Python Environment<\/figcaption><\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 Burp \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <a href=\"https:\/\/github.com\/securityMB\/burp-exceptions\" rel=\"noopener noreferrer nofollow\">burp-exceptions<\/a>. \u0415\u0441\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0442\u043e \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Java:<\/p>\n<details class=\"spoiler\">\n<summary>Java \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">java.lang.RuntimeException: org.python.core.PyException   at burp.fl.a(Unknown Source)   at burp.edd.a(Unknown Source)   at burp.e2g.a(Unknown Source)   at burp.e2g.g(Unknown Source)   at burp.i1c.stateChanged(Unknown Source)   at javax.swing.JTabbedPane.fireStateChanged(JTabbedPane.java:416)   at javax.swing.JTabbedPane$ModelListener.stateChanged(JTabbedPane.java:270)   ...<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0438\u0448\u0435\u043c \u043c\u044b \u043d\u0430 Python, \u0438 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 Java, \u0442\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0439 \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u0438 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435. \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Java \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Python \u0432\u0438\u0434:<\/p>\n<details class=\"spoiler\">\n<summary>Python \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">*** PYTHON EXCEPTION Traceback (most recent call last):   File \"\/Users\/mb\/Desktop\/burp extension\/exceptions_fix.py\", line 8, in decorated_function     return original_function(*args, **kwargs)   File \"\/Users\/mb\/Desktop\/burp extension\/CustomEditorTab.py\", line 78, in setMessage     self._txtInput.setEsditable(self._editable) AttributeError: 'burp.ul' object has no attribute 'setEsditable'<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c, \u0434\u0430\u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435:<\/p>\n<ol>\n<li>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c Burp, \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432 Extender &#8212; Options &#8212; Python environment. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0432 \u043f\u043e\u043b\u0435 <strong>Folder for loading modules<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c <a href=\"https:\/\/github.com\/securityMB\/burp-exceptions\/blob\/master\/exceptions_fix.py\" rel=\"noopener noreferrer nofollow\">exceptions_fix.py<\/a> \u0438 \u043a\u043b\u0430\u0434\u0435\u043c \u0435\u0433\u043e \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0444\u0430\u0439\u043b \u0441 \u043d\u0430\u0448\u0438\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0448\u0435\u043c \u0443\u0436\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435<\/p>\n<\/li>\n<\/ol>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c<\/h2>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043a\u0430\u043d\u0435\u0440 CORS \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0414\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c Python \u0444\u0430\u0439\u043b. \u041d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, <strong>cors-scanner.py<\/strong>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a<\/p>\n<pre><code class=\"python\">try:   from exceptions_fix import FixBurpExceptions except ImportError:   pass<\/code><\/pre>\n<p>\u0418\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 <code>burp<\/code> \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b<\/p>\n<pre><code class=\"python\">from burp import IBurpExtender, IScannerCheck, IScanIssue<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a<\/p>\n<pre><code class=\"python\">from java.io import PrintWriter import sys<\/code><\/pre>\n<p>\u0418 \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430 \u0441\u0430\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a:<\/p>\n<pre><code class=\"python\">try:     FixBurpExceptions() except:     pass<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0441 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438 \u043f\u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043e, \u0432\u0440\u0435\u043c\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434<\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 BurpExtender<\/h2>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f &#8212; \u043d\u0430\u0448\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 <a href=\"https:\/\/github.com\/PortSwigger\/active-scan-plus-plus\/blob\/master\/activeScan%2B%2B.py\" rel=\"noopener noreferrer nofollow\">activeScan++<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u043e\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 Python. \u041c\u044b \u0436\u0435 \u043e\u0431\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0438\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043c \u0438 \u0441\u043a\u0430\u043d\u0435\u0440 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"python\">class BurpExtender(IBurpExtender, IScannerCheck):<\/code><\/pre>\n<p><a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/iburpextender.html\" rel=\"noopener noreferrer nofollow\">IBurpExtender<\/a> &#8212; \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0435\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f Burp.<br \/><a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/iscannercheck.html\" rel=\"noopener noreferrer nofollow\">IScannerCheck<\/a> &#8212; \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043a\u0430\u043d\u0435\u0440\u0430, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0438\/\u0438\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0435\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<\/p>\n<pre><code class=\"python\">def registerExtenderCallbacks(self, callbacks):    sys.stdout = PrintWriter(callbacks.getStdout(), True)    self._callbacks = callbacks   self._helpers = callbacks.getHelpers()    callbacks.setExtensionName('CORS Passive Scanner')    callbacks.registerScannerCheck(self)<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0438 \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u0438\u043c\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u0410 \u0442\u0430\u043a \u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0448 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0441\u043a\u0430\u043d\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e<\/p>\n<pre><code class=\"python\">callbacks.registerScannerCheck(self)<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u0432-\u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 <code>registerScannerCheck(..)<\/code> \u043c\u044b \u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043a\u043b\u0430\u0441\u0441\u044b. \u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441 \u0443 \u043d\u0430\u0441 \u043e\u0434\u0438\u043d &#8212; \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c <code>self<\/code>.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<pre><code class=\"python\">def doPassiveScan(self, baseRequestResponse):<\/code><\/pre>\n<p><a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/IHttpRequestResponse.html\" rel=\"noopener noreferrer nofollow\">baseRequestResponse<\/a> &#8212; \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0438 \u043e\u0442\u0432\u0435\u0442\u0435, \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438: \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u043c \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 CORS misconfiguration? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 &#8212; \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u044d\u0442\u0438 \u0434\u0432\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>Access-Control-Allow-Origin<\/p>\n<\/li>\n<li>\n<p>Access-Control-Allow-Credentials<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u0445 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442 \u043d\u0430\u043c \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u0435\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0442\u0435\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432.<\/p>\n<p>\u041d\u0430\u0448\u0438 <code>_helpers<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0432\u044b\u0448\u0435, \u0438\u043c\u0435\u044e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u0430\u043a <a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/IExtensionHelpers.html#analyzeResponse(byte[])\" rel=\"noopener noreferrer nofollow\">analyzeResponse(..)<\/a>, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u043c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0442\u0432\u0435\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0412 <code>analyzeResponse(..)<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0430\u0448 \u043e\u0442\u0432\u0435\u0442 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0448\u0435\u043b \u0432 \u0432\u0438\u0434\u0435 \u0431\u0430\u0439\u0442\u043e\u0432). \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>baseRequestResponse<\/code> (\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441, \u0438 \u043e\u0442\u0432\u0435\u0442, \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>getResponse()<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e,&nbsp;<code>analyzeResponse(..)<\/code>\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0423\u0441\u0442\u0430\u0432 \u043e\u0442 \u0441\u043b\u043e\u0432\u0430 &#171;\u043e\u0442\u0432\u0435\u0442&#187; \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0432\u0432\u0438\u0434\u0435 <a href=\"https:\/\/portswigger.net\/burp\/extender\/api\/burp\/IResponseInfo.html\" rel=\"noopener noreferrer nofollow\">IResponseInfo<\/a>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u044b\u0445 \u043d\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0443\u0436\u043d\u044b \u043d\u0430\u043c, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c &#8212; \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438. \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0435\u043c \u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>getHeaders()<\/code>. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0438\u0445 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0438 \u0438\u0434\u0443\u0442 \u0432 Java \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<\/p>\n<pre><code class=\"python\">def doPassiveScan(self, baseRequestResponse):    response_headers = list(self._helpers.analyzeResponse(baseRequestResponse.getResponse()).getHeaders())  <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u0438\u0449\u0435\u043c \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 <code>Access-Control-Allow-Origin<\/code> \u043b\u0438\u0431\u043e <code>Access-Control-Allow-Credentials<\/code>.<\/p>\n<pre><code class=\"python\">def doPassiveScan(self, baseRequestResponse):            response_headers = list(self._helpers.analyzeResponse(baseRequestResponse.getResponse()).getHeaders())     for response_header in response_headers:     if 'Access-Control-Allow-Origin' in response_header or 'Access-Control-Allow-Credentials' in response_header:<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e<\/p>\n<pre><code class=\"python\">sys.stdout.println(response_headers)<\/code><\/pre>\n<p>\u0422\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"python\">[u'Access-Control-Allow-Credentials: true', u'cache-control: private, s-maxage=0, no-store, no-cache'] # \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 URL. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0445<\/p>\n<pre><code class=\"python\">request_url = self._helpers.analyzeRequest(baseRequestResponse).getUrl() request_headers = self._helpers.analyzeRequest(baseRequestResponse).getHeaders()<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u0441\u0430\u0439\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043b\u044e\u0431\u043e\u043c\u0443 \u0441\u0443\u0431\u0434\u043e\u043c\u0435\u043d\u0443 \u0438 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 http, \u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 (\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u043e\u0434\u043d\u043e, \u0442\u0443\u0442 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043d\u0430 \u0432\u043a\u0443\u0441 \u0438 \u0446\u0432\u0435\u0442. \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0430\u0439\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0441\u0443\u0431\u0434\u043e\u043c\u0435\u043d\u043e\u0432, \u0442\u043e \u043c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0442\u0435\u0441\u0442\u044b, \u0430 \u0432\u0435\u0434\u044c \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u043a\u0440\u044b\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u0430\u0439\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043b\u044e\u0431\u043e\u043c\u0443 \u0434\u043e\u043c\u0435\u043d\u0443, \u0438 \u0442\u0430\u043a\u0430\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u0442\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a <code>issues<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438, \u0438 \u0432\u0435\u0440\u043d\u0435\u043c \u0438\u0445 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u0441\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">def doPassiveScan(self, baseRequestResponse):            response_headers = list(self._helpers.analyzeResponse(baseRequestResponse.getResponse()).getHeaders())     for response_header in response_headers:     if 'Access-Control-Allow-Origin' in response_header or 'Access-Control-Allow-Credentials' in response_header:        request_url = self._helpers.analyzeRequest(baseRequestResponse).getUrl()       request_headers = self._helpers.analyzeRequest(baseRequestResponse).getHeaders()        issues = []<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0430\u043b\u0430 \u043f\u043e\u0440\u0430 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0438\u0445 payloads.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c Origin \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0421\u0434\u0435\u043b\u0430\u044e \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 &#8212; \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e. \u0415\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0441\u043a\u0430\u043d\u0435\u0440, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Python &#8212; <a href=\"https:\/\/github.com\/chenjj\/CORScanner\" rel=\"noopener noreferrer nofollow\">CORScanner<\/a>, \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0442\u0442\u0443\u0434\u0430. \u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0443\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u043c\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 (\u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e misconfiguration, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 &#8212; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0441\u0432\u043e\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a.<\/p>\n<p>\u041d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 &#8212; URL.<\/p>\n<pre><code class=\"python\">def _generate_payloads(self, url):    host = url.getHost()   protocol = url.getProtocol()    payloads = {}<\/code><\/pre>\n<p>\u0414\u043e\u0441\u0442\u0430\u0435\u043c \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e URL \u0434\u0432\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 &#8212; \u0445\u043e\u0441\u0442 \u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u042f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439. \u0422\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u043a\u043b\u044e\u0447 (\u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0438\u0437 \u0441\u043a\u0430\u043d\u0435\u0440\u0430 \u0441 \u0433\u0438\u0442\u0445\u0430\u0431\u0430), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u041c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">{'trust_any_origin': {'payload_url': 'XXX', 'description': 'YYY', 'severity': 'ZZZ'}}<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043c severity, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 Burp. \u0422\u0430\u043a <\/p>\n<\/p>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-319419","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/319419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=319419"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/319419\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=319419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=319419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=319419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}