ກວດເຫັນຊ່ອງວ່າງ SQL Injection ໃນ WordPress (CVE-2022–21661)

ກວດເຫັນຊ່ອງວ່າງ SQL Injection ໃນ WordPress (CVE-2022–21661)

ມີການຄົ້ົນພົບຊ່ອງວ່າງຂອງ SQL Injection ໃນປາຍປີ 2021 ໂດຍຊ່ອງວ່າງ SQL Injection ຖືກຄົ້ນພົບໃນຫ້ອງທີ່ທາງ WordPress ກະກຽມໄວ້ສໍາລັບການສືບຄົ້ນຂໍໍ້ມູນ DB:WP_Query ແລະທາງ WordPress ມີການອອກແພັດສໍາລັບແກ້ໄຂຂໍ້ຜິດພາດນີ້ຮຽບຮ້ອຍໃນເວີຊັ່ນຫຼ້າສຸດ 5.8.3

ການວິເຄາະຂໍ້ຜິດພາດ

ໃນ wordpress 5.8.3 ທີ່ໄດ້ມີການແກ້ໄຂຂໍ້ຜິດພາດຮຽບຮ້ອຍແລ້ວ ເມື່ອປຽບທຽບກັບເວີຊັ່ນກ່ອນໜ້ານີ້ທ່າສາມາດເຫັນໄດ້ໃນ function clean_query ທີ່ມີການເພີ່ມການກວດສອບ $query[‘field’] ກ່ອນທີ່ຈະມີການປະມວນຜົນຂອງຕົວແປ $query[‘terms’]

Function clean_query ຖືກຂໍນໍາໃຊ້ຈາກ Function get_sql_for_clause ເມື່ອໄປເບິ່ງລາຍລະອຽດໃນສ່ວນຂອງໂຄດຂອງ function ຈະເຫັນວ່າວຽກຂອງ function ຄືການລວບລວມຂໍ້ມູນນັ້ນເປັນເງື່ອນໄຂໃນ query SQL ແລະກັບໄປທີ່ function ຫຼັກ
ດັ່ງນັ້ນເຮົາຈຶ່ງສາມາດຄວບຄຸມຂໍ້ມູນທີ່ສົ່ງຄືນຂອງຟັງຊັ່ນນີ້ໄດ້ ເຊິ່ງໝາຍຄວາມວ່າເຮົາສາມາດຄວບຄຸມການສືບຄົ້ນ SQL ແລະດໍາເນີນການ SQL Injection ໄດ້

ກັບໄປທີ່ຟັງຊັ່ນ clean_query ຂອງເວີຊັ່ນກ່ອນໜ້າທີ່ມີການແກ້ໄຂຂໍ້ຜິດພາດ ໂດຍຄ່າເລີ່ມຕົ້ນ ຄ່າໃນ $query[‘terms’] ຈະຖືກຍົກເລີກການສ້າງຊໍ້າ ຈາກນັ້ນຮຽກ $this->transform_query( $query, ‘term_taxonomy_id’ ) ;
ເພື່ອຫຼີກລ່ຽງ if $query[‘taxonomy’] ຈະຕ້ອງວ່າງເປົ່າຫຼືຄ່າສໍາລັບ is_taxonomy_hierarchical ໃຫ້ຄືນຄ່າເທັດ

ໃນຟັງຊັ່ນ transform_query ຈະກວດສອບ $query[‘field’] == $resulting_field ຫາກ true ຈະກັບມາ ແລະ ບໍ່ມີການປະມວນຜົນເພີ່ມເຕີມ ດັ່ງນັ້ນ ຫາກຕົວແປ $query[‘field’] เป็น term_taxonomy_id ເຮົາສາມາດອອກຈາກຟັງຊັ່ນໄດ້ໂດຍບໍ່ຕ້ອງ $query [‘ເງື່ອນໄຂ’] ຄ່າຕົວແປ

(ການປຽບທຽບໃນທີ່ນີ້ໃຊ້ == ແລະໄດ້ຮັບຜົນກະທົບຈາກຊ່ອງວ່າງຂອງ Loose comparisons ໃນບາງກໍລະນີ ຂໍ້ຜິດພາດນີ້ສາມາດໃຊ້ເພື່ອສ້າງປະໂຫຍກແບບມີເງື່ອນໄຂໄດ້ຕາມຕ້ອງການ)

ເມື່ອເຂົ້າເງື່ອນໄຂ ແລະ ອອກຈາກ function ໂຄດຈະກັບໄປທີ່ຕໍາແໜ່ງທີ່ຮຽກໃຊ້ function clean_query ໃນນີ້ກໍລະນີຖ້າ function clean_query ມາຈາກ function get_sql_for_clause ຄ່າໃນຕົວແປ $query[‘terms’] ຈະຖືກໃຊ້ສໍາລັບປະກອບ query SQL ແລະ ເປັນເປົ້າໝາຍໂດຍກົງເພື່ອໃຊ້ໃນການສ້າງ SQL Injection

ໂດຍສະຫຼຸບເພື່ອໃຫ້ SQL Injection ເກີດຂຶ້ນຈະຕ້ອງເປັນໄປຕາມສອງເງື່ອນໄຂ:

  1. $query[‘field’] ຄື term_taxonomy_id
  2. $query[‘taxonomy’] ວ່າງເປົ່າຫຼື is_taxonomy_hierarchical($query[‘taxonomy’]) === false

ເມື່ອໃສ່ຄ່າຕາມນີ້ຈະສົ່ງຜົນໃຫ້ເກີດຂໍ້ຜິດພາດດັ່ງຕໍ່ໄປນີ້:

Exploit

ເຖິງວ່າສິ່ງນີ້ຈະເປັນຂໍ້ຜິດພາດຂອງ core wordpress ແຕ່ຖ້າຫາກຮຽກນໍາໃຊ້ຕາມປົກກະຕິຜ່ານ core wordpress ຈະບໍ່ເຮັດໃຫ້ເກີດຂໍ້ຜິດພາດ ດັ່ງນັ້ນເພື່ອເປັນການທົດລອງຂໍ້ຜິດພາດນີ້ ເຮົາຈະຕ້ອງໄດ້ຄົ້ນຫາຂໍ້ຜິດພາດນີ້ຜ່ານໃນ plugin และ theme ຜ່ານການນໍາໃຊ້ WP_Query ເພື່ອການນໍາໃຊ້ສືບຄົ້ນຂໍ້ມູນ ວິທີທີ່ຈະຮູ້ວ່າຂໍ້ຜິດພາດນີ້ເກີດຂຶ້ນເມື່ອນໍາໃຊ້ WP_Query($data) ແລະ $data ເປັນສິ່ງທີ່ທ່ານສາມາດຄວບຄຸມໄດ້
ຕົວຢ່າງເຊັ່ນ WP_Query(json_decode($_POST[‘query_vars’])) ຈາກນັ້ນສ່ວນຂອງຂໍ້ມູນຈະມີລັກສະນະດັ່ງນີ້

query_vars={“tax_query”:{“0”:{“field”:”term_taxonomy_id”,”terms”:[“<inject>”]}}}
ຫຼື
query_vars={“tax_query”:{“0”:{“taxonomy”:”nav_menu”,”field”:true,”terms”:[“<inject>”]}}}

ເມື່ອສ້າງສະພາບແວດລ້ອມສໍາລັບການທົດລອງຜິດພາດ ການເປີດນໍາໃຊ້ຟັງຊັ່ນ DEBUG ຈະເຮັດໃຫ້ສາມາດກວດຈັບ SQL Injection ຜ່ານການອີງຈາກຂໍ້ຜິດພາດໄດ້:

ຂໍ້ມູນອ້າງອີງຈາກ

https://cognn.medium.com/sql-injection-in-wordpress-core-zdi-can-15541-a451c492897