Application Layer
เว็บแอปพลิเคชันและเว็บเซิร์ฟเวอร์มีความสำคัญอย่างยิ่งต่อการปรากฏตัวทางออนไลน์ของเราและการโจมตีที่เกิดขึ้นกับแอปพลิเคชันเหล่านี้ถือเป็นมากกว่า 70% ของการโจมตีทั้งหมดที่พยายามบนอินเทอร์เน็ต การโจมตีเหล่านี้พยายามแปลงเว็บไซต์ที่เชื่อถือได้ให้เป็นเว็บไซต์ที่มุ่งร้าย ด้วยเหตุนี้การทดสอบปากกาเว็บเซิร์ฟเวอร์และเว็บแอปพลิเคชันจึงมีบทบาทสำคัญ
ขั้นตอนการพิมพ์ของเว็บเซิร์ฟเวอร์
เหตุใดเราจึงต้องคำนึงถึงความปลอดภัยของเว็บเซิร์ฟเวอร์ เนื่องจากการเติบโตอย่างรวดเร็วของอุตสาหกรรมอีคอมเมิร์ซเป้าหมายหลักของผู้โจมตีคือเว็บเซิร์ฟเวอร์ สำหรับเว็บเซิร์ฟเวอร์ pentesting เราต้องรู้เกี่ยวกับเว็บเซิร์ฟเวอร์ซอฟต์แวร์โฮสติ้งและระบบปฏิบัติการพร้อมกับแอพพลิเคชั่นซึ่งทำงานอยู่ การรวบรวมข้อมูลดังกล่าวเกี่ยวกับเว็บเซิร์ฟเวอร์เรียกว่าการวางรากฐานของเว็บเซิร์ฟเวอร์
ในส่วนต่อไปเราจะพูดถึงวิธีการต่างๆในการวางรากฐานของเว็บเซิร์ฟเวอร์
วิธีการวางรากฐานของเว็บเซิร์ฟเวอร์
เว็บเซิร์ฟเวอร์คือซอฟต์แวร์เซิร์ฟเวอร์หรือฮาร์ดแวร์เฉพาะสำหรับจัดการคำขอและตอบสนอง นี่เป็นประเด็นสำคัญสำหรับผู้ดูแลที่จะมุ่งเน้นในขณะที่ทำการทดสอบการเจาะของเว็บเซิร์ฟเวอร์
ตอนนี้ให้เราพูดถึงวิธีการบางอย่างที่นำไปใช้ใน Python ซึ่งสามารถดำเนินการสำหรับการวางรากฐานของเว็บเซิร์ฟเวอร์ -
การทดสอบความพร้อมใช้งานของวิธี HTTP
แนวทางปฏิบัติที่ดีมากสำหรับผู้ทดสอบการเจาะคือการเริ่มต้นด้วยการระบุวิธีการ HTTP ต่างๆที่มีอยู่ ต่อไปนี้เป็นสคริปต์ Python ด้วยความช่วยเหลือซึ่งเราสามารถเชื่อมต่อกับเว็บเซิร์ฟเวอร์เป้าหมายและระบุวิธีการ HTTP ที่มี -
ในการเริ่มต้นเราต้องนำเข้าไลบรารีคำขอ -
import requests
หลังจากนำเข้าไลบรารีคำขอให้สร้างอาร์เรย์ของวิธี HTTP ซึ่งเรากำลังจะส่ง เราจะใช้วิธีมาตรฐานบางอย่างเช่น 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS' และวิธีการ 'TEST' ที่ไม่ได้มาตรฐานเพื่อตรวจสอบว่าเว็บเซิร์ฟเวอร์สามารถจัดการกับอินพุตที่ไม่คาดคิดได้อย่างไร
method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']
บรรทัดของโค้ดต่อไปนี้คือลูปหลักของสคริปต์ซึ่งจะส่งแพ็กเก็ต HTTP ไปยังเว็บเซิร์ฟเวอร์และพิมพ์วิธีการและรหัสสถานะ
for method in method_list:
req = requests.request(method, 'Enter the URL’)
print (method, req.status_code, req.reason)
บรรทัดถัดไปจะทดสอบความเป็นไปได้ของการติดตามข้ามไซต์ (XST) โดยส่งเมธอด TRACE
if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
print ('Cross Site Tracing(XST) is possible')
หลังจากเรียกใช้สคริปต์ข้างต้นสำหรับเว็บเซิร์ฟเวอร์หนึ่ง ๆ เราจะได้รับคำตอบตกลง 200 คำตอบสำหรับวิธีการเฉพาะที่เว็บเซิร์ฟเวอร์ยอมรับ เราจะได้รับการตอบสนอง 403 Forbidden หากเว็บเซิร์ฟเวอร์ปฏิเสธวิธีการนี้อย่างชัดเจน เมื่อเราส่งวิธีการ TRACE สำหรับการทดสอบการติดตามข้ามไซต์ (XST) เราจะได้รับ405 Not Allowed การตอบกลับจากเว็บเซิร์ฟเวอร์ไม่เช่นนั้นเราจะได้รับข้อความ ‘Cross Site Tracing(XST) is possible’.
การพิมพ์เท้าโดยตรวจสอบส่วนหัว HTTP
ส่วนหัว HTTP พบได้ทั้งในคำขอและการตอบกลับจากเว็บเซิร์ฟเวอร์ พวกเขายังมีข้อมูลที่สำคัญมากเกี่ยวกับเซิร์ฟเวอร์ นั่นคือเหตุผลที่ผู้ทดสอบการเจาะมักสนใจในการแยกวิเคราะห์ข้อมูลผ่านส่วนหัว HTTP ต่อไปนี้เป็นสคริปต์ Python สำหรับรับข้อมูลเกี่ยวกับส่วนหัวของเว็บเซิร์ฟเวอร์ -
ในการเริ่มต้นให้เรานำเข้าไลบรารีคำขอ -
import requests
เราจำเป็นต้องส่งคำขอ GET ไปยังเว็บเซิร์ฟเวอร์ บรรทัดของโค้ดต่อไปนี้สร้างคำขอ GET อย่างง่ายผ่านไลบรารีคำขอ
request = requests.get('enter the URL')
ต่อไปเราจะสร้างรายการส่วนหัวที่คุณต้องการข้อมูล
header_list = [
'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]
ต่อไปคือการลองและยกเว้นบล็อก
for header in header_list:
try:
result = request.header_list[header]
print ('%s: %s' % (header, result))
except Exception as err:
print ('%s: No Details Found' % header)
หลังจากเรียกใช้สคริปต์ด้านบนสำหรับเว็บเซิร์ฟเวอร์หนึ่ง ๆ เราจะได้รับข้อมูลเกี่ยวกับส่วนหัวที่ให้ไว้ในรายการส่วนหัว หากไม่มีข้อมูลสำหรับส่วนหัวเฉพาะก็จะขึ้นข้อความว่า 'ไม่พบรายละเอียด' คุณยังสามารถเรียนรู้เพิ่มเติมเกี่ยวกับฟิลด์ HTTP_header ได้จากลิงค์ -https://www.tutorialspoint.com/http/http_header_fields.htm.
การทดสอบการกำหนดค่าเว็บเซิร์ฟเวอร์ที่ไม่ปลอดภัย
เราสามารถใช้ข้อมูลส่วนหัว HTTP เพื่อทดสอบการกำหนดค่าเว็บเซิร์ฟเวอร์ที่ไม่ปลอดภัย ในสคริปต์ Python ต่อไปนี้เราจะใช้ try / except block เพื่อทดสอบส่วนหัวของเว็บเซิร์ฟเวอร์ที่ไม่ปลอดภัยสำหรับจำนวน URL ที่บันทึกในชื่อไฟล์ข้อความwebsites.txt -
import requests
urls = open("websites.txt", "r")
for url in urls:
url = url.strip()
req = requests.get(url)
print (url, 'report:')
try:
protection_xss = req.headers['X-XSS-Protection']
if protection_xss != '1; mode = block':
print ('X-XSS-Protection not set properly, it may be possible:', protection_xss)
except:
print ('X-XSS-Protection not set, it may be possible')
try:
options_content_type = req.headers['X-Content-Type-Options']
if options_content_type != 'nosniff':
print ('X-Content-Type-Options not set properly:', options_content_type)
except:
print ('X-Content-Type-Options not set')
try:
transport_security = req.headers['Strict-Transport-Security']
except:
print ('HSTS header not set properly, Man in the middle attacks is possible')
try:
content_security = req.headers['Content-Security-Policy']
print ('Content-Security-Policy set:', content_security)
except:
print ('Content-Security-Policy missing')
รอยเท้าของโปรแกรมประยุกต์บนเว็บ
ในส่วนก่อนหน้านี้เราได้กล่าวถึงการวางรากฐานของเว็บเซิร์ฟเวอร์ ในทำนองเดียวกันการวางรากฐานของเว็บแอปพลิเคชันก็ถือเป็นสิ่งสำคัญเช่นกันจากมุมมองของผู้ทดสอบการเจาะ
ในส่วนต่อไปเราจะเรียนรู้เกี่ยวกับวิธีการต่างๆในการวางรากฐานของเว็บแอปพลิเคชัน
วิธีการสร้างรอยเท้าของโปรแกรมประยุกต์บนเว็บ
โปรแกรมประยุกต์บนเว็บคือโปรแกรมไคลเอนต์เซิร์ฟเวอร์ซึ่งเรียกใช้โดยไคลเอนต์ในเว็บเซิร์ฟเวอร์ นี่เป็นอีกประเด็นสำคัญที่ผู้ดูแลต้องให้ความสำคัญในขณะที่ทำการทดสอบการเจาะระบบของเว็บแอปพลิเคชัน
ตอนนี้ให้เราพูดถึงวิธีการต่างๆที่ใช้ใน Python ซึ่งสามารถใช้สำหรับการวางรากฐานของเว็บแอปพลิเคชัน -
การรวบรวมข้อมูลโดยใช้โปรแกรมแยกวิเคราะห์ BeautifulSoup
สมมติว่าเราต้องการรวบรวมไฮเปอร์ลิงก์ทั้งหมดจากหน้าเว็บ เราสามารถใช้โปรแกรมแยกวิเคราะห์ที่เรียกว่า BeautifulSoup ตัวแยกวิเคราะห์เป็นไลบรารี Python สำหรับดึงข้อมูลออกจากไฟล์ HTML และ XML สามารถใช้กับurlib เนื่องจากต้องการอินพุต (เอกสารหรือ URL) เพื่อสร้างวัตถุซุปและไม่สามารถดึงหน้าเว็บด้วยตัวเอง
ในการเริ่มต้นให้เรานำเข้าแพ็คเกจที่จำเป็น เราจะนำเข้า urlib และBeautifulSoup. โปรดจำไว้ว่าก่อนที่จะนำเข้า BeautifulSoup เราจำเป็นต้องติดตั้ง
import urllib
from bs4 import BeautifulSoup
สคริปต์ Python ที่ระบุด้านล่างจะรวบรวมชื่อของหน้าเว็บและไฮเปอร์ลิงก์ -
ตอนนี้เราต้องการตัวแปรซึ่งสามารถจัดเก็บ URL ของเว็บไซต์ได้ ในที่นี้เราจะใช้ตัวแปรชื่อ 'url' เราจะใช้ไฟล์page.read() ฟังก์ชันที่สามารถจัดเก็บหน้าเว็บและกำหนดหน้าเว็บให้กับตัวแปร html_page.
url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()
html_page จะถูกกำหนดให้เป็นอินพุตเพื่อสร้างวัตถุซุป
soup_object = BeautifulSoup(html_page)
สองบรรทัดต่อจากนี้จะพิมพ์ชื่อหัวเรื่องพร้อมแท็กและไม่มีแท็กตามลำดับ
print soup_object.title
print soup_object.title.text
บรรทัดของโค้ดที่แสดงด้านล่างจะบันทึกไฮเปอร์ลิงก์ทั้งหมด
for link in soup_object.find_all('a'):
print(link.get('href'))
การคว้าแบนเนอร์
แบนเนอร์เปรียบเสมือนข้อความตัวอักษรที่มีข้อมูลเกี่ยวกับเซิร์ฟเวอร์และการดึงแบนเนอร์คือกระบวนการดึงข้อมูลที่ได้รับจากแบนเนอร์เอง ตอนนี้เราต้องรู้ว่าแบนเนอร์นี้สร้างขึ้นได้อย่างไร มันถูกสร้างขึ้นโดยส่วนหัวของแพ็กเก็ตที่ถูกส่ง และในขณะที่ไคลเอนต์พยายามเชื่อมต่อกับพอร์ตเซิร์ฟเวอร์จะตอบสนองเนื่องจากส่วนหัวมีข้อมูลเกี่ยวกับเซิร์ฟเวอร์
สคริปต์ Python ต่อไปนี้ช่วยดึงแบนเนอร์โดยใช้การเขียนโปรแกรมซ็อกเก็ต -
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
targethost = str(raw_input("Enter the host name: "))
targetport = int(raw_input("Enter Port: "))
s.connect((targethost,targetport))
def garb(s:)
try:
s.send('GET HTTP/1.1 \r\n')
ret = sock.recv(1024)
print ('[+]' + str(ret))
return
except Exception as error:
print ('[-]' Not information grabbed:' + str(error))
return
หลังจากเรียกใช้สคริปต์ข้างต้นเราจะได้รับข้อมูลประเภทเดียวกันเกี่ยวกับส่วนหัวที่เราได้รับจากสคริปต์ Python ของการกำหนดส่วนหัว HTTP ในส่วนก่อนหน้า