XSS at Frappe Framework [AZ | RU | EN]
Azərbaycanca
Kod:
def sanitize_html(html, linkify=False):
"""
Sanitize HTML tags, attributes and style to prevent XSS attacks
Based on bleach clean, bleach whitelist and html5lib's Sanitizer defaults
Does not sanitize JSON, as it could lead to future problems
"""
import bleach
from bleach.css_sanitizer import CSSSanitizer
from bs4 import BeautifulSoup
if not isinstance(html, str):
return html
elif is_json(html):
return html
if not bool(BeautifulSoup(html, "html.parser").find()):
return html
Problem:
sanitize_html funksiyasında olan isinstance və is_json yoxlanışları html teqlərini daxil etmək üçün sui-istifadə edilə bilər.
Təsir:
Bu zəiflik hesabın ələ keçirilməsinə səbəb ola bilər
Nümunə yük (payload):
{" </p> <img src='x'/onerror=print(1) ":" href=123"}
["<img src=x onerror=print(1)>", 2, 3]
Mümkün patch: Mən bütün hallarda məcburi sanitarlaşdırma funksiyası əlavə etməyi məsləhət görürəm, lakin Frappe Framework ilə hazırlanan məhsullar üçün problem ola bilər deyə (əgər json ilə məlumat alıb/verirlərsə), ən yaxşı həll yolu olmaya bilər.
CVSSv3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
İstinad: https://github.com/frappe/frappe/pull/27434
На Русском
Код:
def sanitize_html(html, linkify=False):
"""
Санирует HTML-теги, атрибуты и стили для предотвращения XSS-атак.
Основывается на bleach clean, bleach whitelist и настройках Sanitizer из html5lib.
Не санирует JSON, так как это может привести к будущим проблемам.
"""
import bleach
from bleach.css_sanitizer import CSSSanitizer
from bs4 import BeautifulSoup
if not isinstance(html, str):
return html
elif is_json(html):
return html
if not bool(BeautifulSoup(html, "html.parser").find()):
return html
Проблема: Приверки isinstance и is_json в функции sanitize_html могут быть злоупотреблены путем ввода HTML-тегов.
Влияние: Эта уязвимость может привести к захвату учетной записи.
Пример полезной нагрузки (payload):
{" </p> <img src='x'/onerror=print(1) ":" href=123"}
["<img src=x onerror=print(1)>", 2, 3]
Возможное решение (patch): Рекомендуется добавить принудительную функцию очистки во всех случаях. Однако для продуктов, разработанных с использованием Frappe Framework, это может быть не лучшим решением, так как это может вызвать проблемы, если данные передаются в формате JSON.
CVSSv3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Источник: https://github.com/frappe/frappe/pull/27434.
English
Code:
def sanitize_html(html, linkify=False):
"""
Sanitize HTML tags, attributes and style to prevent XSS attacks
Based on bleach clean, bleach whitelist and html5lib's Sanitizer defaults
Does not sanitize JSON, as it could lead to future problems
"""
import bleach
from bleach.css_sanitizer import CSSSanitizer
from bs4 import BeautifulSoup
if not isinstance(html, str):
return html
elif is_json(html):
return html
if not bool(BeautifulSoup(html, "html.parser").find()):
return html
Problem: The isinstance and is_json checks of sanitize_html function can be misused to insert HTML tags.
Impact: This vulnerability could lead to account takeover.
Example payload:
{" </p> <img src='x'/onerror=print(1) ":" href=123"}
["<img src=x onerror=print(1)>", 2, 3]
Possible patch: I recommend adding a mandatory sanitization function in all cases, but this may not be the best solution for products developed with the Frappe Framework, as it could cause issues if data is passed/received in JSON format.
CVSSv3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Reference: https://github.com/frappe/frappe/pull/27434