
HTTP REQUEST SMUGGLING ແມ່ນຫຍັງ? Web Developer ຄວນຮູ້ເຖິງຄວາມອັນຕະລາຍຂອງຊ່ອງໂຫວ່ນີ້ໄວ້. ເພາະເປັນຊ່ອງໂຫວ່ທີ່ຍັງບໍ່ເປັນທີ່ຮູ້ຈັກຫຼາຍ ເຊິ່ງລາຍລະອຽດຈະເປັນແນວໃດໄປເບິ່ງນຳກັນເລີຍ
HTTP REQUEST SMUGGLING ແມ່ນຫຍັງ?
HTTP REQUEST SMUGGLING ແມ່ນ ການໂຈມຕີ web server ທີ່ໃຊ້ Protocol http1.1 ເປັນຫຼັກ, ເປັນການໂຈມຕີທີ່ສົ່ງ http request ໄປ 1 request ທີ່ມີ 2 request ໃນນັ້ນ. ເຊິ່ງກ່ອນອື່ນໝົດເຮົາຈະມາເວົ້າເຖິງປັດໄຈຂອງການເກີດ http request smuggling ກ່ອນ ແລ້ວຈະມາສາທິດການໂຈມຕີ .
ຕົວຢ່າງ :
ຖ້າເຮົາສົ່ງ request ໄປຫາ server ທີ່ມີ Header Content-Length 2 ອັນ ທີ່ມີຄວາມຍາວຕ່າງກັນແລ້ວຈະເກີດຫຍັງຂຶ້ນ?

- Frontend ຈະເຫັນ Content-Length: 15 (ສົມມຸດວ່າມັນໃຫ້ຄວາມສຳຄັນກັບ Content-Length ໂຕທຳອິດທີ່ເຫັນ) ແລ້ວສົ່ງ “user=jellyfishG” ໄປຫາ Backend
- Backend (server)ຈະເຫັນ Content-Length: 14 (ສົມມຸດວ່າມັນມັນໃຫ້ຄວາມສຳຄັນກັບ Content-Length ໂຕສຸດທ້າຍທີ່ເຫັນ) “user=jellyfish”
ແລ້ວ ໂຕ G ຫາຍໄປໃສ?
ເວລາເຮົາ request ເທື່ອຕໍ່ໄປ

backed ຈະເຫັນແບບນີ້

ເຫັນວ່າໂຕ G ບໍ່ໄດ້ຫາຍໄປໃສ ມັນພຽງໄປຕໍ່ໃສ່ request ຖັດໄປ.
ນີ້ແມ່ນພື້ນຖານຂອງຊ່ອງໂຫວ່ http request smuggling ເກີດຈາກການທີ Backed (server) ໃຫ້ຄວາມສຳຄັນກັບ Content-Length ໂຕສຸດທ້າຍທີ່ເຫັນເຮັດໃຫ້ຈັດການກັບ request ບໍ່ໝົດເລີຍມີຜົນກະທົບຕໍ່ request ຖັດໄປ. ແຕ່ໃນປັດຈຸບັນບໍ່ສາມາດໃຊ້ວີທີນີ້ໄດ້ແລ້ວ ເຊິ່ງກໍມີການສົ່ງຂໍ້ມູນແບບໃໝ່ມາແທນນັ້ນກໍຄື Transfer-Encoding: chunked.
ເຮົາມາຮຽນຮູ້ກ່ອນວ່າ Transfer-Encoding: chunked ມີວີທີສົ່ງຂໍ້ມູນແນວໃດ
Transfer-Encoding: chunked
{length of content in hex}
{content}
0\r\n
\r\n
- ການສົ່ງຂໍ້ມູນແບບ Transfer-Encoding: chunked ຕ້ອງຂຶ້ນຕົ້ນດ້ວຍຄ່າ hexadecimal ຂອງຄວາມຍາວຂໍ້ມູນທີ່ຈະສົ່ງ.
- ຂໍ້ມູນທີ່ຈະສົ່ງ
- ລົງທ້າຍດ້ວຍເລກສູນ (0) ຕາມດ້ວຍ \r\n\r\n (Enter 2 ເທື່ອ)

ຖ້າເຮົາລວມການສົ່ງຂໍ້ມູນ ທັງ Content-Length ແລະTransfer-Encoding: chunked ຈະໄດ້ແບບນີ້

ການໂຈມຕີ
ເຮົາຕ້ອງຮູ້ວ່າ backed (server) ນັ້ນໃຫ້ຄວາມສຳຄັນໂຕໃດລະຫວ່າງ Content-Length ຫຼື Transfer-Encoding: chunked ເຮົາຈຶ່ງສາມາດສ້າງ payload ໄດ້.
ສ່ວນວີທີຫາວ່າ backed (server) ໃຫ້ຄວາມສຳຄັນໂຕໃດແມ່ນເຮົາຈະພາເຮັດໃນ Lab

ວີທີຜ່ານ lab ແມ່ນໃຫ້ລັກເອົາ cookie ຂອງ victim ໂດຍໃຊ້ຊ່ອງໂຫວ່ http request smuggling
ເຮົາມາເລີ່ມກັນເລີຍ
ໜ້າຕາ Lab


ລອງສົ່ງ request post ທຳມະດາໄປເບິ່ງວ່າ ສາມາດສົ່ງໄດ້ບໍ່

ບາດນີ້ ຕື່ມ header Transfer-Encoding: chunked

ແປວ່າສາມາດສົ່ງຂໍ້ມູນທັງ Content-Length ແລະ Transfer-Encoding: chunked ພ້ອມກັນໄດ້.
ມາຫາວ່າ backed (server) ໃຫ້ຄວາມສຳຄັນໂຕໃດດ້ວຍວີທີເພີ່ມ ແລະ ຫຼຸດຄວາມຍາວຂອງ Content-Length ເພື່ອເບິ່ງວ່າ Fronted ແລະ Backed ໃຫ້ຄວາມສຳຄັນໂຕໃດ




ເຫັນວ່າຄວາມຍາວຂອງຂໍ້ມູນແບບ Content-Length ສົ່ງໄປເກີນ ຫຼື ໜ້ອຍກ່ອນບໍ່ໄດ້ ສະແດງວ່າ Fronted ໃຫ້ຄວາມສຳຄັນ Content-Length
ບາດນີ້ມາລອງກັບ Transfer-Encoding: chunked ໂດຍການຕື່ມໂຕ G ໃສ່ຫຼັງສຸດ

ສົ່ງໄປໄດ້
ລອງສົ່ງໄປອີກເທື່ອ

“Not Found” ?
ມາເບິ່ງພຶດຕິກຳຂອງ backed (server) ກ່ອນວ່າຖ້າເຮົາສົ່ງ GGET ແລ້ວ ມັນຈະ response ກັບມາແນວໃດ

response ຄືກັນ ສະແດງວ່າ backed (server) ໃຫ້ຄວາມສຳຄັນກັບ Transfer-Encoding: chunked, ແບບນີ້ເຮົາກໍສາມາດຄວບຄຸມ request ຂອງຄົນອື່ນໄດ້
ເປົ້າໝາຍຂອງເຮົາແມ່ນລັກເອົາ cookie ຂອງ victim ເຊິ່ງໃນ lab ມັນຈະມີບ່ອນ comment ເຮົາສາມາດຄວບຄຸມ request ຂອງ victim ໄປ comment ໄດ້.
request ຂອງ comment

ສັງເກດວ່າ Content-Length ແມ່ນ 106 ຖ້າເຮົາຢາກເອົາ request ຂອງຄົນອື່ນໄປ comment ເຮົາຕ້ອງໄດ້ເພີ່ມ Content-Length ຂຶ້ນ.
ເອົາ request ໄປປະກອບກັນ

ແປງ content-length ຂອງ request ທີ 2 ເປັນ 500 ແລ້ວ ສົ່ງໄປ 2 ເທື່ອ

ເຫັນວ່າມັນຈະໄດ້ request ຂອງເຮົາ ຢູ່ໃນ comment ນຳ, ແຕ່ເຮົາຕ້ອງການ cookie ຂອງ victim ເຮົາຕ້ອງສົ່ງ request ໄປເທື່ອດຽວແລ້ວ ລໍຖ້າໃຫ້ victim request

ໄດ້ request ຂອງ victim ມາບໍ່ໝົດ ເຮົາຕ້ອງໄດ້ຕື່ມ content-length ໄປເລື້ອຍໆຈົນກວ່າຈະໄດ້

ແປງ cookie ແລ້ວ refresh

ພຽງແຕ່ເທົ່ານີ້ເຮົາກໍ່ສາມາດປອມໂຕເປັນ victim ໄດ້ແລ້ວ.
ນອກຈາກການລັກຂໍ້ມູນແລ້ວ http request smuggling ຍັງມີເທັກນິກການໂຈມຕີທີໜ້າສົນໃຈອີກຫຼາຍເທັກນິກທີບໍ່ໄດ້ເອົາມາຂຽນໃນບົດຄວາມນີ້ຖ້າໃຜສົນໃຈສາມາດສຶກສາຕື່ມໄດ້ທີ່ນີ້.
Reference
https://portswigger.net/web-security/request-smuggling/exploiting/lab-capture-other-users-requests
