Hacking&Security Workshop

ตอนนี้ MaYaSeVeN ได้ย้าย Blog ไปที่ http://blog.mayaseven.com


Thursday, May 2, 2013

การแฮกเว็บ The Fundamentals of Web Hacking [Web Hacking Series Part 1]

    ช่วงนี้กระแสการแฮกเว็บในไทยมาแรง เพราะอะไร? แแฮกยังไง? แนวทางการป้องกันทำอย่างไร ? ในบทความนี้เราจะมาตอบคำถามเหล่านี้กัน ในมุมของเทคนิคอลเชิงลึกตามสไตล์ MaYaSeVeN เหมือนเดิมครับ

เพราะอะไรเว็บในไทยและต่างประเทศถึงได้โดน Hack กันมากมายเหลือเกินในทุกวันนี้ ?

    ที่ผ่านมาผมไม่ค่อยได้เขียนบทความเกี่ยวกับการแฮกเว็บ Web Application Hacking สักเท่าไหร่ เพราะว่าความรู้ค่อนข้างมีความสุ่มเสี่ยงที่จะนำไปใช้ในทางที่ผิด แต่ทุกวันนี้มี Tools ที่ช่วยในการแฮ็คมากมายและเป็นที่รู้กันแพร่หลายในกลุ่ม Hacker หรือ Script Kiddies ทำให้การแฮ็คทำได้ง่ายมากในปัจจุบัน ซึ่งมันก็มีทั้งข้อดีและข้อเสีย

ข้อเสีย ก็คือมีเว็บที่มีจุดอ่อนถูก Hack กันเป็นว่าเล่น ทั้งที่รู้ตัวและไม่รู้ตัวว่าโดน Hack แล้ว โดยที่คนที่ใช้ Tools เหล่านั้นในการ Hack ไม่จำเป็นต้องมีความรู้อะไรเลยด้วยซ้ำ ย้ำว่าไม่จำเป็นต้องรู้อะไรเลย แค่วาง URL คลิกสองสามทีก็ Hack ได้แล้ว ในเมื่อการ Hack ทำได้ง่ายขนาดนี้ นี่เป็นสาเหตุให้เด็กๆ สามารถที่จะ Hack เว็บซักเว็บนั้นเป็นเรื่องที่ง่ายมาก

ข้อดี ก็คือในส่วนของผู้สร้างระบบซึ่งมีความรู้ในระบบที่ตัวเองสร้างเป็นอย่างดี นั้นก็สามารถใช้ Tools ดังกล่าวในการทดสอบความปลอดภัยของเว็บตัวเองได้อย่างง่ายดาย ขอเพียงแค่ท่านสนใจสักหน่อยเท่านั้นเอง อย่างน้อยที่สุดเว็บที่ท่านสร้างไม่ควรถูก Hack ด้วย Automated Hacking Tools สำเร็จรูปที่เด็กน้อยก็ใช้ Hack ได้

* การใช้ Tools ในการ Scan หาช่องโหว่หรือการพยายามเข้าถึงระบบโดยไม่ได้รับอนุญาติมีความผิดทั้งจำและปรับตาม พรบ. คอมพิวเตอร์ *



แฮกยังไง (How to Hack Web Application) ?

การ Hack เว็บเป็นเรื่องที่ต้องว่ากันยาวมาก มีการเขียนหนังสือกันหลายร้อยหน้าจนถึงเป็นพันหน้า โอเคผมจะเกลิ่นความรู้พื้นฐานและเข้าสู่เนื้อหาที่เป็น Highlight ที่โดน Hack กันทุกวี่ทุกวันในไทยเลยแล้วกัน

ก่อนเข้าสู้เนื้อหาผมขอฝากนิดนึงสำหรับ Script Kiddies ที่ใช้ Tools ในการ Hack โดยที่ไม่รู้ด้วยซ้ำว่า Tools เหล่านั้นมันทำงานอะไรบ้าง ทำงานยังไงบ้าง ผมยินดีและอยากให้อ่านบทความนี้ครับ อย่างน้อยๆพวกคุณก็จะได้มีความรู้ที่ถูกต้องเอาไปคุยกับคนอื่นๆได้ และก็เอาความรู้เหล่านี้ไปประกอบชีพที่ถูกต้องอื่นๆได้ สิ่งที่ผมขอก็คืออยากให้เอาความรู้ไปใช้ในทางที่ถูกต้องไม่เบียดเบียนผู้อื่นแค่นั้นแหละ

เริ่มจาก Scope ของบทความนี้ก่อน





บทความนี้เราจะพูดถึง Web Application Hacking ซึ่งก็ประกอบไปด้วยสองส่วนก็คือ Application/Configuration ซึ่งในบทความนี้เราจะพูดในส่วนของ Web Application เพียงอย่างเดียว


* การที่เครื่องถูก Hack หรือถูกเปลี่ยนหน้าเว็บไม่ได้หมายความว่าจะต้องถูก Hack จากทางเว็บอย่างเดียว บางทีเขียนเว็บขึ้นมาได้ปลอดภัยแต่ก็ถูก Hack จากช่องทางอื่นได้(System Hacking) เรื่องของ Security มีหลาย Layer *


เอาละมาเริ่มกัน Web Application คืออะไร?

Web Application ก็คือโปรแกรมๆหนึ่งที่ถูกเขียนโดย Developers โดยใช้ HTTP(Hypertext Transfer Protocol) เป็นตัวนำส่งข้อความระหว่าง Client(Web Browser) กับ Server(Web Server(Web Application))


* Web Server ก็คือ Service ที่ทำให้ WebApp ทำงานได้ เช่น Apache, Nginx ส่วน Web Application เอาให้เข้าใจง่ายก็ PHP, ASP.NET, JSP ที่เหล่าท่านๆเขียนให้มันทำงานตามที่ต้องนั้นแล * 

เคยสงสัยไหมว่าเวลาเราเปิด Web Browser ใส่ http://google.co.th แล้วกด Enter เนี่ยมันส่งข้อความอะไรไปให้ Web Server? เรามาดูหน้าตาของมันกัน

GET / HTTP/1.1
Host: www.google.co.th
User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: PREF=ID=71f5c062a895f733:U=03229b25b1007df1:FF=0:LD=th:TM=1355918462:LM=1358409261:S=NV6gieg1hjXb3NdD; NID=67=PzOU0A1fwy4Y0Nq_qIshU4doQlyHUaISNByg6_KejVPKrePTa4weJ77j9czRGNX9OA0kKAKXygaj-E7gPOnycj6-e-PzLGbhcxqmNf3zpuDWBjaZNtNjBSkg-TsS10It
Connection: keep-alive

ด้านบนคือข้อความที่ HTTP Request ไปขอหน้าเว็บ www.google.co.th ด้านล่างคือส่วนที่ Google ตอบกลับมาให้ Web Browser ของเรา

HTTP/1.1 200 OK
Date: Sat, 27 Apr 2013 12:46:22 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Content-Length: 96214

<!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage"><head><meta itemprop="image" content="/images/google_favicon_128.png"><title>Google</title><script> ...(ตัดออก)... ส่วนนี้เป็น HTML Code ที่ Browser แปลให้มันหน้าตาดูดีแบบที่เราเห็น

เราจะเห็นว่าในส่วนของ Response ที่ Google ตอบกลับมานั้นมีสองส่วนคือ Header และ Body

ใน HTTP Request ก็มี Body ได้เช่นกัน ด้านล่างคือต้วอย่างการ Login



จากรูปด้านบนพอเราใส่ Username และ Password แล้วกดปุ่ม Login จะได้ข้อความที่ส่งไปให้ Web Server ตามด้านล่าง

POST /mutillidae/index.php?page=login.php HTTP/1.1
Host: 192.168.53.77
User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.53.77/mutillidae/index.php?page=login.php
Cookie: showhints=0; PHPSESSID=kn8g1dfoke1au91ermshskco24
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 64

username=admin&password=p@ssw0rd&login-php-submit-button=Login



*จาก HTTP Request ด้านบนเราจะเห็นได้ว่าถ้ามีการดักจับข้อมูลระหว่างทาง ก็จะทำให้ผู้ดักจับรู้ Username และ Password ของผู้ใช้ วิธีป้องกันคือควรใช้ HTTPS เพื่อทำให้การส่งข้อมูลเป็นแบบเข้ารหัส*

สรุปเนื้อหา HTTP Protocol

1) เป็น Stateless Protocol คือส่งไปแล้วจบ ไม่มีการระบบถึง State ได้ว่าทำอะไรถึงไหนแล้วเพราะเหตุนี้ถึงต้องมี Session หรือ Cookie เข้ามาช่วยในการทำงานที่จำเป็นต้องมี State เช่น ตรวจสอบว่า Client ผ่านการ Login แล้ว เป็นต้่น

2) ใน HTTP Request ต้องมีการระบุ Method ในการส่งค่าเช่น GET, POST, PUT, HEAD, ...

3) ในส่วนของ HTTP Response จะมี HTTP Status Code ระบุสถานะเช่น 200 OK, 404 Not Found, 301 Moved Permanently, 503 Service Unavailable เป็น

4) HTTP Protocol เป็นการส่งข้อมูลแบบไม่เข้ารหัส



โอเคความรู้พื้นฐาน HTTP เอาแค่ก่อน เราจะมาตอบคำถามที่ว่า แฮกเว็บทำยังไง หรือการแฮกเนี่ยมันคือการทำอะไร  การแฮกเนี่ยจริงๆแล้วมันก็คือการกระทำปกติที่ระบบมันสามารถทำงานได้นั้นละครับ ไม่ได้มีการเล่นคุณไสย์ใดๆทั้งสิ้น :P แต่บางทีผลลับมันอาจจะทำให้ผู้ที่มาพบเห็นแปลกใจว่าเฮ้ยมันทำแบบนี้ได้ด้วยเหรอเนี่ย Concept ของมันก็คือ " ทำสิ่งที่เป็นไปไม่ได้ ให้เป็นไปได้ ด้วยวิธีที่เป็นไปได้ " แล้วจะเอามาเทียบกับการแฮกเว็บได้อย่างไร

จำลองสถานการณ์ :
เริ่มจากเราเป็น Client มี Web Browser ที่สามารถเรียกหน้าเว็บได้ ส่วนฝั่ง Server นั้นเป็น Blackbox เราไม่รู้อะไรเกี่ยวกับมันเลย(ซึ่งจริงๆสามารถใช้เทคนิคในการเก็บข้อมูลเป้าหมายได้ แต่ไม่อยู่ใน Scope บทความนี้)

เพราะฉะนั้นสิ่งที่เราจะเล่นกับ Web Application นั้นก็คืออะไรก็ได้ที่สามารถส่ง HTTP Request ได้อาจจะ Web Browser, Wget, Netcat, ... ในความหมายก็คืออะไรที่ทำให้เราส่ง HTTP Request และรับ HTTP Response ได้เอามาใช้แฮกเว็บได้หมด

ส่ง HTTP Request แล้วยังไง ? 

จุดหลักในการแฮกก็คือ Input ที่เราจะส่งไปให้ Web Application ทำงาน ถามว่า Web Application รับ Input จากช่องทางไหนตอบเลยว่าเยอะ เช่น GET, POST, Cookie, User-Agent, และอื่นๆ

ย้อนกลับไปที่ HTTP Request ที่ใช้ในการ Login ผมจะตัดมาในส่วนที่ผมสนใจนะครับ ได้ข้อมูลตามด้านล่าง

POST /mutillidae/index.php?page=login.php HTTP/1.1
username=admin&password=p@ssw0rd&login-php-submit-button=Login

เราจะเห็นว่าเป็นการส่งข้อมูลแบบ POST ไปที่ไฟล์ /mutillidae/index.php?page=login.php ค่าที่ส่งไปคือ username=admin&password=p@ssw0rd&login-php-submit-button=Login
ซึ่งในไฟล์ php ก็ต้องมีการรับค่าจากตัวแปร username และ password เอาไปตรวจสอบว่าเป็นการ Login ที่ถูกต้องหรือไม่

ผม Code ในไฟล์ php บางส่วน

$username = $_REQUEST["username"];
$password = $_REQUEST["password"];
 
  $lQueryString =
  "SELECT * FROM accounts WHERE username='".$username.
  "' AND password='".$password."'";
 
สมมุติถ้าผมส่งค่าให้ $username = "admin" และ $password="' OR '1'='1" ผมก็จะได้ คำสั่ง SQL ที่จะไป Interpret(ประมวลผล) โดย DBMS เป็น

SELECT * FROM accounts WHERE username='admin' AND password='' OR '1'='1'

เราจะเห็นว่าค่าในส่วนของตัวแปร $password นั้นสามารถหลอกให้ DBMS เข้าใจผิดว่าคำสั่งนี้เป็นจริงได้โดยที่ไม่ต้องใส่ Password ที่ถูกต้องที่มีอยู่ใน Database เลย

* สำหรับคนที่ไม่เก็ต ผมจะอธิบายเพิ่ม มันแค่เป็นการเล่นกับ Logic(ตรรกะ) ง่ายๆ เริ่มจาก  password='' OR '1'='1' เราจะเห็นว่า '1'='1' นี้เป็น TRUE แน่นอน และเมื่อ TRUE ไป OR กับอะไรมันก็จะได้ TRUE  ตอนนี้ก็จะกลายเป็น SELECT * FROM accounts WHERE username='admin' AND TRUE จะเห็นว่าแค่ username ที่ส่งไปให้ Web Application มีอยู่ใน Database เท่านั้นเราจะ Login เป็นใครก็ได้เพียงแค่รู้ username เท่านั้น ! *  

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


Injection หรือ SQLi หรือ SQL Injection  คืออะไรกันแน่ ?

ผมสามารถตอบนิยามในรูปแบบของผมให้เข้าใจง่ายๆ 

การ Injection คือการส่งค่าไปให้ Web Application โดยที่เว็บนั้นรับค่าอาจจะเป็น String หรือ Integer เข้าไปแต่ค่าที่ Hacker ส่งไปนั้น ไม่ใช่ String ธรรมดาแต่เป็นคำสั่งที่คาดว่า Web Application นั้นจะ Interpret(ประมวลผล) หรือส่งต่อไป Interpret(ประมวลผล) ค่าที่ Hacker ส่งเข้าไป เช่น ถ้าค่าที่ส่งเข้าไป ส่งต่อให้ DBMS ประมวลผล ก็จะเรียกว่า SQL Injection ถ้าเป็น LDAP ประมวลผล ก็เรียก LDAP Injection ถ้าเป็น Javascript Engine(Web Browser ฝั่ง Client)ประมวลผล ก็เรียก Cross Site Scripting ถ้าเป็น OS ประมวลผล ก็เรียก Command Injection  หรือ ถ้า PHP ประมวลผลเลยก็เรียกว่า  Remote Code Execution(RCE)  ซึ่ง RCE นี้ใช้เรียกในหลายกรณีอยู่ที่ว่าจะอ้างอิงกับอะไร OS หรือ Technology ที่ใช้

สรุป การ Hack มันก็คือการคุยกับ Web Application ปกติ แต่ลูกเล่นมันอยู่ที่ Input ที่ส่งไปเล่นกับ Web Application นั้นเอง :P และยังมีการส่ง Input อีกหลายแบบที่ไม่ได้นำเสนอในบทความนี้ รวมถึงการทำหน้าเว็บรับ Upload ไฟล์จาก Client  มาไว้บน Server ด้วย ส่วนนี้อันตรายมากถ้าไม่จำเป็นควรหลีกเลี่ยงเพราะพลาดในส่วนนี้กันเยอะ แม้กระทั้งเว็บใหญ่ในไทยที่ผมพูดชื่อไปทุกคนรู้จักหรือแม้กระทั้ง Sub Domain ขององค์กรณ์ระดับโลกอย่าง NASA ก็พลาดที่จุดนี้ เพราะการรับไฟล์จาก Client นี้แค่ Hacker  Upload Backdoor  หรือ PHP Shell ขึ้นไปทำงานได้ก็จบข่าวเลยครับ ซึ่งหลายเว็บก็ทำการกรองไฟล์ที่รับขึ้นไปแต่หารู้ไม่ว่าการกรองที่ไม่ถูกต้องนั้นสามารถถูก Bypass ได้อย่างง่ายดาย ในส่วนของสองเว็บที่กล่าวไปนั้นก็มีการกรองไฟล์ที่รับแต่ก็สามารถถูก Bypass ได้ ซึ่งเราจะมาลงลึกกันในแต่ละเทคนิคและการป้องกันใน Part ต่อๆไปครับ

ผลกระทบจากการถูกแฮกถูก Hack จากช่องโหว่ที่แตกต่างกัน ผลกระทบ ความยากง่ายในการ Hack และการป้องกันก็แต่ต่างกันเราจะมาว่ากันในบทความ Part ต่อไป ในรายละเอียดในแต่ละหัวข้อครับ

การป้องกัน
เราจะเห็นว่าที่จริงแล้วหลักการ Hack นั้นก็คือเล่นกับช่องทาง Input ที่ทาง Web Developers ได้สร้างขึ้นมานั้นเอง พอมาถึงตรงนี้ หลายคนที่เขียนเว็บมาจนโปรแล้วก็จะมองเห็นแนวทางในการป้องกัน นั้นคือการ Filter การรับ Input จากผู้ใช้นั้นเอง ซึ่งยังมีรายละเอียดอีกเยอะมากๆผมแนะนำให้กรองที่ฝั่ง Server-Side ในจุดที่สำคัญ
ซึ่งในบทความต่อๆไปผมจะเน้นลงรายละเอียด Function ที่ใช้กรองและเทคนิคการกรองไม่ให้ถูก Bypass ระหว่างนี้ผมแนะนำหนังสือสำหรับคนที่อยากเขียนเว็บให้ปลอดภัยคือเล่มนี้ครับ PHP Pro Security 
http://www.amazon.com/Pro-PHP-Security-Chris-Snyder/dp/1590595084


ในบทความ Part ต่อไปเราจะมาลงลึกกันในแต่ละเทคนิคการ Hack และวิธีการป้องกันในแต่ละเทคนิคกันอย่างละเอียด 

ปล. ตอนแรกผมตั้งใจเขียนให้จบในบทความเดียว แต่เนื้อหาในหัวมีอีกเยอะมาก ผมเลยแก้ไขใหม่ปล่อยเป็น Part ดีกว่าเพราะเดี๋ยวยาวไปคนไทยไม่อ่านครับ :P

สงสัยต้องการสอบถาม หรือ แนะนำ ติชม เพิ่มเติมสามารถเข้ามาพูดคุยกันได้ที่ https://www.facebook.com/pages/MaYaSeVeN/139105159494751

Written by MaYaSeVeN