Lớp ứng dụng
Các ứng dụng web và máy chủ web rất quan trọng đối với sự hiện diện trực tuyến của chúng tôi và các cuộc tấn công được quan sát thấy nhằm vào chúng chiếm hơn 70% tổng số các cuộc tấn công được thực hiện trên Internet. Các cuộc tấn công này cố gắng chuyển đổi các trang web đáng tin cậy thành các trang web độc hại. Vì lý do này, máy chủ web và bút thử nghiệm ứng dụng web đóng một vai trò quan trọng.
In chân máy chủ web
Tại sao chúng ta cần xem xét sự an toàn của máy chủ web? Đó là bởi vì với tốc độ phát triển nhanh chóng của ngành thương mại điện tử, mục tiêu hàng đầu của những kẻ tấn công là máy chủ web. Đối với việc áp dụng máy chủ web, chúng ta phải biết về máy chủ web, phần mềm lưu trữ và hệ điều hành của nó cùng với các ứng dụng đang chạy trên chúng. Thu thập thông tin như vậy về máy chủ web được gọi là dấu chân của máy chủ web.
Trong phần tiếp theo của chúng tôi, chúng tôi sẽ thảo luận về các phương pháp khác nhau để in dấu chân máy chủ web.
Phương pháp in dấu chân máy chủ web
Máy chủ web là phần mềm hoặc phần cứng máy chủ dành riêng để xử lý các yêu cầu và phục vụ các phản hồi. Đây là một lĩnh vực chính mà pentester tập trung vào trong khi thực hiện kiểm tra thâm nhập của các máy chủ web.
Bây giờ chúng ta hãy thảo luận về một số phương pháp, được triển khai bằng Python, có thể được thực thi để in dấu chân máy chủ web -
Kiểm tra tính khả dụng của các phương thức HTTP
Một thực tiễn rất tốt cho người kiểm tra thâm nhập là bắt đầu bằng cách liệt kê các phương thức HTTP có sẵn khác nhau. Sau đây là một tập lệnh Python với sự trợ giúp của chúng tôi có thể kết nối với máy chủ web mục tiêu và liệt kê các phương thức HTTP có sẵn:
Để bắt đầu, chúng ta cần nhập thư viện yêu cầu -
import requests
Sau khi nhập thư viện yêu cầu, hãy tạo một mảng các phương thức HTTP mà chúng tôi sẽ gửi. Chúng tôi sẽ sử dụng một số phương pháp tiêu chuẩn như 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS' và phương pháp không chuẩn 'TEST' để kiểm tra cách máy chủ web có thể xử lý đầu vào không mong muốn.
method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']
Dòng mã sau là vòng lặp chính của tập lệnh, sẽ gửi các gói HTTP đến máy chủ web và in ra phương thức và mã trạng thái.
for method in method_list:
req = requests.request(method, 'Enter the URL’)
print (method, req.status_code, req.reason)
Dòng tiếp theo sẽ kiểm tra khả năng truy tìm trang web chéo (XST) bằng cách gửi phương thức TRACE.
if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
print ('Cross Site Tracing(XST) is possible')
Sau khi chạy tập lệnh trên cho một máy chủ web cụ thể, chúng tôi sẽ nhận được 200 phản hồi OK cho một phương pháp cụ thể được máy chủ web chấp nhận. Chúng tôi sẽ nhận được phản hồi 403 Forbidden nếu máy chủ web từ chối rõ ràng phương pháp này. Khi chúng tôi gửi phương pháp TRACE để thử nghiệm theo dõi trang web chéo (XST), chúng tôi sẽ nhận được405 Not Allowed phản hồi từ máy chủ web nếu không chúng tôi sẽ nhận được thông báo ‘Cross Site Tracing(XST) is possible’.
In chân bằng cách kiểm tra tiêu đề HTTP
Tiêu đề HTTP được tìm thấy trong cả yêu cầu và phản hồi từ máy chủ web. Chúng cũng mang thông tin rất quan trọng về máy chủ. Đó là lý do tại sao người kiểm tra thâm nhập luôn quan tâm đến việc phân tích thông tin thông qua tiêu đề HTTP. Sau đây là một tập lệnh Python để lấy thông tin về tiêu đề của máy chủ web:
Để bắt đầu, hãy để chúng tôi nhập thư viện yêu cầu -
import requests
Chúng tôi cần gửi một yêu cầu GET đến máy chủ web. Dòng mã sau tạo một yêu cầu GET đơn giản thông qua thư viện yêu cầu.
request = requests.get('enter the URL')
Tiếp theo, chúng tôi sẽ tạo một danh sách các tiêu đề mà bạn cần thông tin.
header_list = [
'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]
Tiếp theo là một khối thử và loại trừ.
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)
Sau khi chạy tập lệnh trên cho một máy chủ web cụ thể, chúng tôi sẽ nhận được thông tin về các tiêu đề được cung cấp trong danh sách tiêu đề. Nếu không có thông tin cho một tiêu đề cụ thể thì nó sẽ đưa ra thông báo 'Không tìm thấy chi tiết'. Bạn cũng có thể tìm hiểu thêm về các trường HTTP_header từ liên kết -https://www.tutorialspoint.com/http/http_header_fields.htm.
Kiểm tra cấu hình máy chủ web không an toàn
Chúng tôi có thể sử dụng thông tin tiêu đề HTTP để kiểm tra các cấu hình máy chủ web không an toàn. Trong tập lệnh Python sau, chúng tôi sẽ sử dụng khối try / trừ để kiểm tra tiêu đề máy chủ web không an toàn cho số lượng URL được lưu trong tên tệp văn bảnwebsites.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')
Dấu chân của một ứng dụng web
Trong phần trước, chúng ta đã thảo luận về việc in dấu chân của máy chủ web. Tương tự, việc in dấu chân của một ứng dụng web cũng được coi là quan trọng theo quan điểm của một người kiểm tra thâm nhập.
Trong phần tiếp theo, chúng ta sẽ tìm hiểu về các phương pháp khác nhau để tạo dấu chân của một ứng dụng web.
Phương pháp in chân ứng dụng web
Ứng dụng web là một chương trình máy khách-máy chủ, được chạy bởi máy khách trong một máy chủ web. Đây là một lĩnh vực quan trọng khác mà pentester tập trung vào trong khi thực hiện kiểm tra thâm nhập của ứng dụng web.
Bây giờ chúng ta hãy thảo luận về các phương pháp khác nhau, được triển khai bằng Python, có thể được sử dụng để in dấu chân của một ứng dụng web -
Thu thập thông tin bằng trình phân tích cú pháp BeautifulSoup
Giả sử chúng ta muốn thu thập tất cả các siêu liên kết từ một trang web; chúng ta có thể sử dụng một trình phân tích cú pháp có tên BeautifulSoup. Trình phân tích cú pháp là một thư viện Python để kéo dữ liệu ra khỏi các tệp HTML và XML. Nó có thể được sử dụng vớiurlib bởi vì nó cần một đầu vào (tài liệu hoặc url) để tạo một đối tượng súp và nó không thể tự tìm nạp trang web.
Để bắt đầu, hãy để chúng tôi nhập các gói cần thiết. Chúng tôi sẽ nhập urlib vàBeautifulSoup. Hãy nhớ trước khi nhập BeautifulSoup, chúng ta cần cài đặt nó.
import urllib
from bs4 import BeautifulSoup
Tập lệnh Python đưa ra bên dưới sẽ thu thập tiêu đề của trang web và các siêu liên kết -
Bây giờ, chúng ta cần một biến, có thể lưu trữ URL của trang web. Ở đây, chúng tôi sẽ sử dụng một biến có tên là 'url'. Chúng tôi cũng sẽ sử dụngpage.read() hàm có thể lưu trữ trang web và gán trang web cho biến html_page.
url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()
Các html_page sẽ được gán làm đầu vào để tạo đối tượng súp.
soup_object = BeautifulSoup(html_page)
Hai dòng tiếp theo sẽ in tên tiêu đề có thẻ và không có thẻ tương ứng.
print soup_object.title
print soup_object.title.text
Dòng mã hiển thị bên dưới sẽ lưu tất cả các siêu liên kết.
for link in soup_object.find_all('a'):
print(link.get('href'))
Lấy biểu ngữ
Banner giống như một tin nhắn văn bản chứa thông tin về máy chủ và lấy banner là quá trình tìm nạp thông tin do chính banner đó cung cấp. Bây giờ, chúng ta cần biết cách tạo biểu ngữ này. Nó được tạo ra bởi tiêu đề của gói được gửi đi. Và trong khi máy khách cố gắng kết nối với một cổng, máy chủ sẽ phản hồi vì tiêu đề chứa thông tin về máy chủ.
Tập lệnh Python sau giúp lấy biểu ngữ bằng lập trình socket:
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
Sau khi chạy tập lệnh trên, chúng ta sẽ nhận được loại thông tin tương tự về tiêu đề như chúng ta đã nhận được từ tập lệnh Python về dấu chân của tiêu đề HTTP trong phần trước.