XSS at Frappe Framework [AZ | RU | EN]

Posted on Nov 8, 2024

Huseyn Gadashov

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