WordPress Plugin Survey & Poll 1.5.7.3 — sql injection
เป็นบทความสำหรับการศึกษาเท่านั้นนะครับ
โอเค มาเริ่มกัน
ช่องโหว่นี้คืออะไร ?
เป็นช่องโหว่ของ plugin survey & poll ของ wordpress
โดย plugin นี้จะเปิดให้มีการส่ง sql payload ไปยัง database โดยตรง ทำให้เราทำ sql injection เพื่อหาค่าที่ต้องการได้
โอเค มาเริ่มกัน
โดยเราจะทำตาม step POC ตาม link https://www.exploit-db.com/exploits/45411
- ตาม POC ขั้นแรกคือ “เริ่มจากทำการลองเข้า instance ที่มีช่องโหว่นี้ แล้วทำการใช้งาน ui เพื่อตอบคำถามในเว็บ จะเจอว่าเว็บจะให้ cookie ชื่อ wp_sap มา โดย cookie นี้ เมื่อส่งกลับไปให้เว็บ จะเป็นการนำค่าใน cookie ไปใส่ใน sql SELECT syntax” => ข้อนี้เราลองใช้เว็บตามปกติแล้วเจอว่าเว็บ error เมื่อส่งคำตอบ งั้นข้ามไปข้อต่อไปกัน
- “ทำการใส่ 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 มาละนะ