응용 계층

웹 애플리케이션과 웹 서버는 우리의 온라인 존재에 매우 중요하며 이들에 대해 관찰 된 공격은 인터넷에서 시도 된 총 공격의 70 % 이상을 차지합니다. 이러한 공격은 신뢰할 수있는 웹 사이트를 악의적 인 웹 사이트로 변환하려고 시도합니다. 이러한 이유로 웹 서버 및 웹 응용 프로그램 펜 테스트가 중요한 역할을합니다.

웹 서버의 풋 프린트

웹 서버의 안전성을 고려해야하는 이유는 무엇입니까? 전자 상거래 산업의 급속한 성장에 따라 공격자의 주요 표적이 웹 서버이기 때문입니다. 웹 서버 침투 테스트를 위해서는 웹 서버, 호스팅 소프트웨어 및 운영 체제와 함께 실행중인 응용 프로그램에 대해 알아야합니다. 웹 서버에 대한 이러한 정보를 수집하는 것을 웹 서버의 풋 프린트라고합니다.

다음 섹션에서는 웹 서버의 풋 프린트를위한 다양한 방법에 대해 설명합니다.

웹 서버의 풋 프린트 방법

웹 서버는 요청을 처리하고 응답을 제공하기위한 전용 서버 소프트웨어 또는 하드웨어입니다. 이것은 펜 테스터가 웹 서버의 침투 테스트를 수행하는 동안 집중해야 할 핵심 영역입니다.

이제 웹 서버의 풋 프린트를 위해 실행할 수있는 Python으로 구현 된 몇 가지 메소드에 대해 논의 해 보겠습니다.

HTTP 메서드의 가용성 테스트

침투 테스터를위한 아주 좋은 방법은 사용 가능한 다양한 HTTP 메소드를 나열하는 것부터 시작하는 것입니다. 다음은 대상 웹 서버에 연결하고 사용 가능한 HTTP 메서드를 열거 할 수있는 Python 스크립트입니다.

우선 요청 라이브러리를 가져와야합니다.

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)

다음 행은 TRACE 메소드를 전송하여 교차 사이트 추적 (XST) 가능성을 테스트합니다.

if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
   print ('Cross Site Tracing(XST) is possible')

특정 웹 서버에 대해 위의 스크립트를 실행 한 후 웹 서버에서 허용하는 특정 메서드에 대해 200 개의 OK 응답을 받게됩니다. 웹 서버가 명시 적으로 메소드를 거부하면 403 Forbidden 응답을 받게됩니다. XST (교차 사이트 추적) 테스트를위한 TRACE 메서드를 보내면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’]

다음은 try 및 except 블록입니다.

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)

특정 웹 서버에 대해 위의 스크립트를 실행 한 후 헤더 목록에 제공된 헤더에 대한 정보를 얻습니다. 특정 헤더에 대한 정보가 없으면 'No Details Found'메시지가 표시됩니다. 링크에서 HTTP_header 필드에 대해 자세히 알아볼 수도 있습니다.https://www.tutorialspoint.com/http/http_header_fields.htm.

안전하지 않은 웹 서버 구성 테스트

HTTP 헤더 정보를 사용하여 안전하지 않은 웹 서버 구성을 테스트 할 수 있습니다. 다음 Python 스크립트에서는 try / except 블록을 사용하여 텍스트 파일 이름에 저장된 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이라는 파서를 사용할 수 있습니다. 파서는 HTML 및 XML 파일에서 데이터를 가져 오기위한 Python 라이브러리입니다. 함께 사용할 수 있습니다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

위의 스크립트를 실행하면 이전 섹션에서 HTTP 헤더의 풋 프린트에 대한 Python 스크립트에서 얻은 것과 유사한 종류의 헤더 정보를 얻을 수 있습니다.