เอามาฝากครับ เขียน php อัพโหลดรูปภาพอย่างไร ให้ปลอดภัย

เริ่มโดย iak1, 19 เมษายน 2013, 17:02:14

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

iak1

ก่อนอื่นต้องแนะนำ 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 ปรากฏ ขึ้นมา ครับ





ที่มา  http://basic-hack.blogspot.com/2013/03/php-bypass-hack-upload-shell.html
ต้นฉบับจาก
http://freakyhackers.blogspot.com/2011/12/bypassing-security-and-validations-to.html

!Blogger SEO~~

[direct=https://bit.ly/forexthai]สมัครเทรด Forex [/direct][direct=https://bit.ly/thforex]รายได้เสริม Passive Income $$$[/direct][direct=https://bit.ly/smarthunter]Copy Trade แจ่มมาก[/direct]
[direct=https://bit.ly/traderth][/direct]

xvlnw.com

[direct=https://cloudhost.in.th/wordpress-hosting]ツ ⓌⓄⓇⒹⓅⓇⒺⓈⓈ ⒽⓄⓈⓉⒾⓃⒼ [/direct] :wanwan014:  :D
[direct=https://cloudhost.in.th/cloudhosting.html]Cloud Hosting[/direct] [direct=https://cloudhost.in.th/cloudvps.html]Cloud Server[/direct] [direct=https://cloudhost.in.th/vpshosting.html]Cloud VPS Hosting[/direct] [direct=https://cloudhost.in.th/windowsvps.html]Cloud Windows[/direct] Tel: 080-348-0843 LINE: ixvlnw