วิธีการเขียน php ฟอร์มอัพโหลดรูปภาพที่สามารถ Bypass Hack upload shell

ก่อนอื่นต้องแนะนำ Shell ของ Hacker ในภาษาบ้านๆ ก่อนว่า Shell คืออะไร


หลังจากทำความรู้จัก Shell กันแล้ว เรามาดู โค้ด php ของฟอร์มอัพโหลดรูปภาพ

เพื่อจะสร้างฟอร์มที่ปลอดภัยต่อเว็บไซต์ ไม่ให้ถูก Upload Shell และไฟล์ นามสกุลอื่นขึ้นมาแทน
จากโค้ดด้านล่าง เป็นตัวอย่าง ช่องอัพโหลดรูปภาพที่ Upload  Shell หรือไฟล์ .php สำเร็จ



<?php
   $uploaddir = 'uploads/'; // Relative path under webroot
        $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
   if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
       {
          echo "File is valid, and was successfully uploaded.\n";
   }
   else
   {
          echo "File uploading failed.\n";
   }
     ?>

เราจึงต้องมีการตรวจสอบ ประเภทของเนื้อหา
ตรวจสอบประเภทของไฟล์ หากเป็นข้อความ  หรือ .php จะไม่ถูกอัพโหลดขึ้นไป

 <?php
      //checks if file is Gif or not
       if($_FILES['userfile']['type'] != "image/gif")
       {
          echo "Sorry, we only allow uploading GIF images";
          exit;
       }
      $uploaddir = 'uploads/';
      $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
      if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
   {
          echo "File is valid, and was successfully uploaded.\n";
   }
   else
    {
          echo "File uploading failed.\n";
    }
   ?>



โค้ดด้านบนจะตรวจสอบเนื้อหา / ประเภทของชื่อไฟล์ ว่าเป็น GIF หรือไม่หากมีไฟล์อื่น ที่ไม่ใช่ GIF จะปรากฏ HTTP เป็น


"
   POST /upload2.php HTTP/1.1
   TE: deflate,gzip;q=0.3
   Connection: TE, close
   Host: localhost
   User-Agent: libwww-perl/5.803
   Content-Type: multipart/form-data; boundary=xYzZY
   Content-Length: 156
   --xYzZY
   Content-Disposition: form-data; name="userfile"; filename="shell.php"
   Content-Type: text/plain

"



รหัสจะตรวจสอบและเห็นว่าไม่ใช่ GIF และจะไม่อัปโหลดไป
แต่จะยังถูกอัพโหลด ได้ หาก Hacker ทำการ Uplaod 
จาก Data tamper plugin in firefox 
แม้จะมีการตรวจสอบ
"Content-Type" "image / gif" =>

แต่ Shell.php จะสามารถอัพโหลดขึ้นมาเป็นไฟล์ php ได้อยู่
ให้ทำการ เขียนโดย การตรวจสอบขนาดไฟล์รูปภาพ ดั่งโค้ดด้านล่าง


<?php
 $imageinfo = getimagesize($_FILES['userfile']['tmp_name']); //check image size
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg')
{
    echo "Sorry, we only accept GIF and JPEG images\n";
    exit;
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "File uploading failed.\n";
}
?>

ในตัวอย่างข้างต้น getimagesize PHP ฟังก์ชั่นส่งกลับขนาดและประเภทของการตรวจสอบภาพว่าไฟล์เป็นไฟล์รูปภาพที่ถูกต้อง
ตอนนี้เพื่อบายพาสประเภทของการตรวจสอบเราสามารถใช้โปรแกรมเช่น GIMP ไปฝังสคริปต์ PHP ภายในไฟล์รูปภาพที่ข้อมูล Binary นี้....ไฟล์จะถูกอัปโหลดเป็นที่ถูกต้อง  JPEG

   http:// <someSite> / uploads.webshel​​l.gif

  จะแสดงไฟล์รูปภาพที่เหมาะสม (แม้ว่ารหัสจะถูกฝังอยู่ในนั้น)
การตรวจสอบชื่อไฟล์

<?php
   $blacklist = array(".php", ".phtml", ".php3", ".php4");
   foreach ($blacklist as $item)
    {
         if(preg_match("/$item\$/i", $_FILES['userfile']['name']))
       {
              echo "We do not allow uploading PHP files\n";
              exit;
          }
    }
   $uploaddir = 'uploads/';
   $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
   if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
           echo "File is valid, and was successfully uploaded.\n";
   }
   else
   {
           echo "File uploading failed.\n";
   }
?>



ในโค้ดข้างต้น
$blacklist มีส่วนขยายที่จะมีการตรวจสอบไฟล์ที่อัปโหลด
 ฟังก์ชันตรวจสอบชื่อของไฟล์ที่อัพโหลดเพื่อดูว่ามันมีข้อมูลใดในบัญชีดำ หากใช่จะแสดง MSG BOX ปรากฏ ขึ้นมา ครับ

เรียบเรียงโดย Ak1 - www.basic-hack.blogspot.com
Credit : http://freakyhackers.blogspot.com/2011/12/bypassing-security-and-validations-to.html

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

(ไม่ต้องสมัครสมาชิก)

X คอร์สเรียนแฮกเกอร์ - Hacker-Security (Online course and Ebook)