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 ในส่วนก่อนหน้า