ปลั๊กอิน WordPress GDPR Cookie Consent ที่ช่วยให้ผู้ใช้ปฏิบัติตาม GDPR ได้ง่าย พบว่ามีช่องโหว่ Improper Access Controls ช่องโหว่นี้นำไปสู่ช่องโหว่ร้ายแรงอย่าง Privilege Escalation และ Stored XSS บนเว็บไซต์ ปลั๊กอิน GDPR Cookie Consent ถูกใช้งานอยู่บนเว็บไซต์ WordPress มากกว่า 700,000 ไซต์ ณ ขณะเขียน
Timeline ของช่องโหว่
- รายงาน – 4 กุมภาพันธ์ 2020
- แก้ไข – 10 กุมภาพันธ์ 2020
- เวอร์ชันที่ได้รับผลกระทบ – ทุกเวอร์ชัน <=1.8.2
- เวอร์ชันที่ Patch แล้ว – 1.8.3
ช่องโหว่รายงานไปที่ wordpress.org ก่อน หลังจากนั้นปลั๊กอินถูกลบออกจาก WordPress Repository ชั่วคราว WordPress ยกเลิก Ban จากปลั๊กอินทันทีเมื่อ Patch พร้อมวันที่ 10 กุมภาพันธ์
ใครที่อยู่บน เวอร์ชัน <=1.8.2 อาจถูกแฮ็ก ดังนั้นอัปเดตเป็น Patched Version = 1.8.3 เร็วที่สุดเท่าที่จะทำได้
เข้าใจช่องโหว่ของ GDPR Plugin
ช่องโหว่อยู่ที่ cli_policy_generator ใน --construct method cli_policy_generator ที่รันผ่าน WordPress AJAX API – ajax_policy_generator ขาด Capability Checks สำคัญ ทำให้แม้จะส่ง Nonce Code ผ่าน AJAX แต่ก็ไม่ได้ Verify ใน PHP Framework ทั้งหมด
ajax_policy_generator อนุญาต 3 Actions: autosave_contant_data, save_contentdata และ get_policy_pageid
สอง Actions – autosave_contant_data, save_contentdata รู้สึกอ่อนต่อการโจมตี ในขณะที่ autosave_contant_data นำไปสู่ Privilege Escalation, save_contentdata นำไปสู่ Stored XSS
ช่องโหว่ใน save_contentdata
save_contentdata ของ cli_policy_generator อนุญาตให้ GDPR Cookie บันทึกเป็น Page Post Type การนצלช่องโหว่นี้ ผู้ใช้ที่ยืนยันตัวตนแล้ว (Authenticated) ด้วย Permission ต่ำสุดคือ Subscriber สามารถเปลี่ยน Post Status ได้ ผู้ใช้ที่ยืนยันตัวตนแล้วคนไหนก็ตาม สามารถ Publish Post, หรือย้าย Published Post ไป Draft หรือแย่กว่า ย้ายเว็บไซต์ทั้งหมดไป Draft ทำให้ Crash
public function save_contentdata() { $out=array( 'response'=>true, 'er'=>'' ); $content_data=isset($_POST['content_data']) ? $_POST['content_data'] : array(); $page_id=(int) isset($_POST['page_id']) ? $_POST['page_id']*1 : 0; $enable_webtofee_powered_by=(int) isset($_POST['enable_webtofee_powered_by']) ? $_POST['enable_webtofee_powered_by']*1 : 0; $id=wp_insert_post( array( 'ID'=>$page_id, //if ID is zero it will create new page otherwise update 'post_title'=>'Cookie Policy', 'post_type'=>'page', 'post_content'=>Cookie_Law_Info_Cli_Policy_Generator::generate_page_content($enable_webtofee_powered_by,$content_data,0), 'post_status' => 'draft', //default is draft ) ); if(is_wp_error($id)) { $out=array( 'response'=>false, 'er'=>__('Error','cookie-law-info'), //'er'=>$id->get_error_message(), ); }else { Cookie_Law_Info_Cli_Policy_Generator::set_cookie_policy_pageid($id); $out['url']=get_edit_post_link($id); } return $out; }
ช่องโหว่ใน autosave_contant_data
autosave_constant_data บันทึก GDPR Cookie ชั่วคราวใน cli_pg_content_data ขณะ Admin กำลังแก้ไข
เนื่องจากขาด Validation Checks ใน cli_pg_content_data ผู้ใช้ที่ยืนยันตัวตนแล้วคนไหนก็ตาม สามารถฉีด Malicious JavaScript Code เข้าเว็บไซต์ที่มี GDPR Cookie Consent Plugin
public function autosave_contant_data() { global $wpdb; $scan_table=$wpdb->prefix.$this->main_tb; $out=array( 'response'=>true, 'er'=>'' ); $content_data=isset($_POST['content_data']) ? $_POST['content_data'] : array(); $page_id=isset($_POST['page_id']) ? $_POST['page_id'] : ''; $enable_webtofee_powered_by=(int) isset($_POST['enable_webtofee_powered_by']) ? $_POST['enable_webtofee_powered_by']*1 : 0; if(is_array($content_data)) { $content_html=Cookie_Law_Info_Cli_Policy_Generator::generate_page_content($enable_webtofee_powered_by,$content_data); update_option('cli_pg_content_data',$content_html); }else { $out=array( 'response'=>false, 'er'=>__('Error','cookie-law-info') ); } return $out; }
มี Patch แล้ว! อัปเดตตอนนี้
อัปเดตเป็นเวอร์ชันล่าสุด 1.8.3 และปกป้องเว็บไซต์ด้วย Firewall
Astra Firewall ปกป้องเว็บไซต์จากโจมตีอย่าง XSS, SQLi, CSRF, LFI, RFI, Spam, Bad Bots, OWASP Top 10 และมากกว่านั้น เริ่มต้นกับ Astra ง่ายมาก นี่คือวิธี:
- เลือกแผนและ Sign Up
- ติดตั้ง Astra โดยทำตาม Self-served Steps 2-3 ขั้นตอน (ใช้เวลา <5 นาที)
แค่นี้ Astra Firewall กำลังปกป้องคุณจากโจมตีที่อาจมาถึง คุณสามารถ Monitor เว็บไซต์จาก Astra Dashboard ได้
ยังไม่แน่ใจ? รับ Astra Demo จากที่นี่
หากมีคำถาม Comment ด้านล่างหรือส่งข้อความ เราสัญญาตอบกลับ 🙂