.. | ||
browext-clickjacking.md | ||
browext-permissions-and-host_permissions.md | ||
browext-xss-example.md | ||
README.md |
Mbinu ya Kupima Usalama wa Kifaa cha Kivinjari
Jifunze kuhusu kuvamia AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako ikionekana kwenye HackTricks au kupakua HackTricks kwa PDF Angalia MIPANGO YA USAJILI!
- Pata bidhaa rasmi za PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa kipekee wa NFTs
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za kuvamia kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Taarifa Msingi
Vifaa vya kivinjari huandikwa kwa JavaScript na hulandwa na kivinjari nyuma. Ina DOM yake lakini inaweza kuingiliana na DOM za tovuti nyingine. Hii inamaanisha inaweza kuhatarisha usiri, uadilifu, na upatikanaji wa tovuti nyingine (CIA).
Sehemu Kuu
Muundo wa vifaa vya kivinjari unaonekana vizuri wakati unavyoonekana na una sehemu tatu. Hebu tuangalie kila sehemu kwa undani.
![](/Mirrors/hacktricks/media/commit/548f9f3924d4fd2933f976d0717fde8b8192b964/.gitbook/assets/image%20%2816%29%20%281%29.png)
Vifaa vya Maudhui
Kila skripti ya maudhui ina ufikiaji wa moja kwa moja kwa DOM ya ukurasa wa wavuti mmoja na hivyo inaweza kuwa na ufikiaji wa matokeo mabaya. Hata hivyo, skripti ya maudhui haina ruhusa nyingine isipokuwa uwezo wa kutuma ujumbe kwa msingi wa kifaa cha kivinjari.
Msingi wa Kifaa cha Kivinjari
Msingi wa kifaa cha kivinjari una ruhusa/upatikanaji mwingi wa kifaa cha kivinjari, lakini msingi wa kifaa cha kivinjari unaweza kuingiliana na maudhui ya wavuti kupitia XMLHttpRequest na skripti za maudhui. Pia, msingi wa kifaa cha kivinjari haujapata ufikiaji wa moja kwa moja kwa kifaa cha mwenyeji.
Binari ya Asili
Kifaa cha kivinjari kuruhusu binari ya asili ambayo inaweza kupata kifaa cha mwenyeji kwa ruhusa kamili za mtumiaji. Binari ya asili inaingiliana na msingi wa kifaa cha kivinjari kupitia Interface ya Programu ya Maombi ya Netscape ya Kawaida (NPAPI) inayotumiwa na Flash na programu-jalizi zingine za kivinjari.
Mipaka
{% hint style="danger" %} Ili kupata ruhusa kamili za mtumiaji, mshambuliaji lazima kumshawishi kifaa cha kivinjari kupitisha matokeo mabaya kutoka kwa skripti ya maudhui kwenda kwa msingi wa kifaa cha kivinjari na kutoka kwa msingi wa kifaa cha kivinjari kwenda kwa binari ya asili. {% endhint %}
Kila sehemu ya kifaa cha kivinjari imegawanywa kutoka kwa nyingine kwa mipaka madhubuti ya kinga. Kila sehemu inaendeshwa katika mchakato tofauti wa mfumo wa uendeshaji. Skripti za maudhui na msingi wa kifaa cha kivinjari zinaendeshwa katika mchakato wa mchanga usiofikika na huduma nyingi za mfumo wa uendeshaji.
Zaidi ya hayo, skripti za maudhui zinaendeshwa kutoka kwa kurasa zao za wavuti zinazoambatana na kuendeshwa katika rundo tofauti la JavaScript. Skripti ya maudhui na ukurasa wa wavuti wana ufikiaji wa DOM sawa chini, lakini hawabadilishani pointi za JavaScript, kuzuia kuvuja kwa utendaji wa JavaScript.
manifest.json
Kifaa cha kivinjari cha Chrome ni folda ya ZIP tu na faili ya .crx kwenye upanuzi wa faili. Msingi wa kifaa cha kivinjari ni faili ya manifest.json
kwenye mizizi ya folda, ambayo inabainisha muundo, ruhusa, na chaguzi nyingine za usanidi.
Mfano:
{
"manifest_version": 2,
"name": "My extension",
"version": "1.0",
"permissions": [
"storage"
],
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
"background": {
"scripts": [
"background.js"
]
},
"options_ui": {
"page": "options.html"
}
}
content_scripts
Vipande vya maudhui vinapakia wakati wowote mtumiaji anapoelekea kwenye ukurasa unaofanana, katika kesi yetu ukurasa wowote unaofanana na https://example.com/*
na usiofanana na *://*/*/biashara*
regex. Vinatekelezwa kama skripti za ukurasa wenyewe na kuwa na ufikivu wa kiholela kwenye Modeli ya Vitu vya Nyaraka (DOM) ya ukurasa.
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
Ili kujumuisha au kutoa nje URL zaidi, pia ni rahisi kutumia include_globs
na exclude_globs
.
Hii ni skripti ya maudhui mfano ambayo itaongeza kitufe cha kuelezea kwenye ukurasa wakati API ya uhifadhi inatumika kuchukua thamani ya message
kutoka kwa uhifadhi wa programu-jalizi.
chrome.storage.local.get("message", result =>
{
let div = document.createElement("div");
div.innerHTML = result.message + " <button>Explain</button>";
div.querySelector("button").addEventListener("click", () =>
{
chrome.runtime.sendMessage("explain");
});
document.body.appendChild(div);
});
![](/Mirrors/hacktricks/media/commit/548f9f3924d4fd2933f976d0717fde8b8192b964/.gitbook/assets/image%20%2823%29.png)
Ujumbe hutumwa kwa kurasa za upanuzi na skripti ya maudhui wakati kitufe hiki kinapobonyezwa, kupitia matumizi ya API ya runtime.sendMessage(). Hii ni kutokana na kikomo cha skripti ya maudhui katika upatikanaji wa moja kwa moja wa APIs, na storage
ikiwa miongoni mwa visa vichache. Kwa utendaji zaidi ya visa hivi, ujumbe hutumwa kwa kurasa za upanuzi ambazo skripti za maudhui zinaweza kuzungumza nazo.
{% hint style="warning" %}
Kulingana na kivinjari, uwezo wa skripti ya maudhui unaweza kutofautiana kidogo. Kwa vivinjari vilivyotegemea Chromium, orodha ya uwezo inapatikana katika nyaraka za Chrome Developers, na kwa Firefox, MDN inatumika kama chanzo kikuu.
Pia ni muhimu kufahamu kwamba skripti za maudhui zina uwezo wa kuzungumza na skripti za mandharinyuma, kuwawezesha kutekeleza hatua na kurudisha majibu.
{% endhint %}
Kwa kutazama na kudebugi skripti za maudhui kwenye Chrome, menyu ya zana za msanidi wa Chrome inaweza kupatikana kutoka kwa Chaguo > Zana zaidi > Zana za msanidi wa wavuti AU kwa kubonyeza Ctrl + Shift + I.
Baada ya zana za msanidi wa wavuti kuonyeshwa, Kichupo cha Chanzo kinapaswa kubonyezwa, ikifuatiwa na kichupo cha Skripti za Maudhui. Hii inaruhusu ufuatiliaji wa skripti za maudhui zinazoendesha kutoka kwa upanuzi mbalimbali na kuweka vituo vya kusitisha ili kufuatilia mwendelezo wa utekelezaji.
Skripti za maudhui zilizowekwa
{% hint style="success" %}
Tambua kwamba Skripti za Maudhui sio lazima kwani pia ni inawezekana kuziweka kwa njia ya kudhibiti na kuziweka kwa njia ya programu kwenye kurasa za wavuti kupitia tabs.executeScript
. Hii kimsingi hutoa udhibiti wa kina zaidi.
{% endhint %}
Kwa kuweka kwa njia ya programu skripti ya maudhui, upanuzi unahitajika kuwa na ruhusa ya mwenyeji kwa ukurasa ambao skripti hizo zitawekwa. Ruhusa hizi zinaweza kulindwa kwa kuziomba ndani ya mizizi ya upanuzi au kwa muda kupitia activeTab.
Mfano wa upanuzi unaotegemea activeTab
{% code title="manifest.json" %}
{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}
{% endcode %}
- Ingiza faili ya JS kwa kubofya:
// content-script.js
document.body.style.backgroundColor = "orange";
//service-worker.js - Inject the JS file
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ["content-script.js"]
});
});
- Ingiza kazi kwa kubonyeza:
//service-worker.js - Inject a function
function injectedFunction() {
document.body.style.backgroundColor = "orange";
}
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target : {tabId : tab.id},
func : injectedFunction,
});
});
Mfano na ruhusa za kutekeleza script
// service-workser.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
excludeMatches : [ "*://*/*business*" ],
js : [ "contentScript.js" ],
}]);
// Another example
chrome.tabs.executeScript(tabId, { file: "content_script.js" });
Kwa ajili ya kujumuisha au kutojumuisha URLs zaidi ni pia inawezekana kutumia include_globs
na exclude_globs
.
Skripti za Yaliyomo run_at
Uga wa run_at
unadhibiti wakati faili za JavaScript zinaingizwa kwenye ukurasa wa wavuti. Thamani inayopendelewa na ya msingi ni "document_idle"
.
Thamani zinazowezekana ni:
document_idle
: Wakati wowote inapowezekanadocument_start
: Baada ya faili yoyote kutokacss
, lakini kabla ya DOM nyingine yoyote kujengwa au skripti nyingine yoyote kutekelezwa.document_end
: Mara moja baada ya DOM kukamilika, lakini kabla ya rasilimali zingine kama picha na fremu kuanza kupakia.
Kupitia manifest.json
{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["https://*.example.com/*"],
"run_at": "document_idle",
"js": ["contentScript.js"]
}
],
...
}
Kupitia service-worker.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
runAt : "document_idle",
js : [ "contentScript.js" ],
}]);
background
Ujumbe zinazotumwa na skripti za maudhui hupokelewa na ukurasa wa nyuma, ambao unacheza jukumu kuu katika kuratibu sehemu za upanuzi. Kwa umuhimu, ukurasa wa nyuma unaendelea kuwepo wakati wote wa upanuzi, ukiendesha kwa siri bila ushirikiano moja kwa moja na mtumiaji. Una uwezo wake wa Modeli ya Vitu vya Nyaraka (DOM), kuruhusu mwingiliano na usimamizi wa hali ya juu.
Muhimu:
- Jukumu la Ukurasa wa Nyuma: Hufanya kama kitovu cha fahamu kwa upanuzi, kuhakikisha mawasiliano na uratibu kati ya sehemu mbalimbali za upanuzi.
- Uthabiti: Ni kiumbe kilichopo daima, kisichoonekana na mtumiaji lakini muhimu kwa utendaji wa upanuzi.
- Uundaji wa Kiotomatiki: Ikiwa haijatangazwa wazi, kivinjari kitaunda ukurasa wa nyuma kiotomatiki. Ukurasa huu uliozalishwa kiotomatiki utajumuisha skripti zote za nyuma zilizotajwa katika maelezo ya upanuzi, kuhakikisha uendeshaji laini wa kazi za nyuma za upanuzi.
{% hint style="success" %} Urahisi uliotolewa na kivinjari katika kuzalisha kiotomatiki ukurasa wa nyuma (ikiwa haijatangazwa wazi) huhakikisha kuwa skripti zote muhimu za nyuma zinajumuishwa na zinafanya kazi, kupunguza mchakato wa usanidi wa upanuzi. {% endhint %}
Mfano wa skripti ya nyuma:
chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})
Inatumia runtime.onMessage API kusikiliza ujumbe. Wakati ujumbe wa "eleza"
unapopokelewa, inatumia tabs API kufungua ukurasa kwenye kichupo kipya.
Kwa kudebug skripti ya nyuma unaweza kwenda kwenye maelezo ya nyongeza na kuchunguza mfanyakazi wa huduma, hii itafungua zana za maendeleo na skripti ya nyuma:
Kurasa za Chaguo na Nyingine
Nyongeza za kivinjari zinaweza kuwa na aina mbalimbali za kurasa:
- Kurasa za Hatua huonyeshwa katika menyu ya kunjua wakati picha ya nyongeza inapobofywa.
- Kurasa ambazo nyongeza ita fungua kwenye kichupo kipya.
- Kurasa za Chaguo: Ukurasa huu huonyeshwa juu ya nyongeza unapobofya. Katika maelezo ya awali Katika kesi yangu niliweza kufikia ukurasa huu kwa
chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
au kwa kubofya:
![](/Mirrors/hacktricks/media/commit/548f9f3924d4fd2933f976d0717fde8b8192b964/.gitbook/assets/image%20%2824%29.png)
Tambua kuwa kurasa hizi si thabiti kama kurasa za nyuma kwani huload maudhui kwa lazima. Hata hivyo, zina uwezo fulani unaofanana na ukurasa wa nyuma:
- Mawasiliano na Skripti za Yaliyomo: Kama ukurasa wa nyuma, kurasa hizi zinaweza kupokea ujumbe kutoka kwa skripti za yaliyomo, kurahisisha mwingiliano ndani ya nyongeza.
- Upatikanaji wa APIs Maalum ya Nyongeza: Kurasa hizi zina upatikanaji kamili wa APIs maalum ya nyongeza, chini ya idhini zilizofafanuliwa kwa nyongeza.
permissions
& host_permissions
permissions
na host_permissions
ni vipengele kutoka kwenye manifest.json
ambavyo vitabainisha idhini zipi nyongeza ya kivinjari ina (uhifadhi, eneo...) na kwenye kurasa gani za wavuti.
Kwa kuwa nyongeza za kivinjari zinaweza kuwa na mamlaka, moja inayoweza kuwa mbaya au kuchukuliwa na mtu mwingine inaweza kuruhusu muhusika njia tofauti za kuiba taarifa nyeti na kumpeleleza mtumiaji.
Angalia jinsi mipangilio hii inavyofanya kazi na jinsi inavyoweza kutumiwa vibaya katika:
{% content-ref url="browext-permissions-and-host_permissions.md" %} browext-permissions-and-host_permissions.md {% endcontent-ref %}
content_security_policy
Sera ya usalama wa maudhui inaweza kutangazwa pia ndani ya manifest.json
. Ikiwa imefafanuliwa, inaweza kuwa dhaifu.
Mipangilio ya msingi kwa kurasa za nyongeza za kivinjari ni ya kizuizi:
script-src 'self'; object-src 'self';
Kwa habari zaidi kuhusu CSP na njia za kuepuka angalia:
{% content-ref url="../content-security-policy-csp-bypass/" %} content-security-policy-csp-bypass {% endcontent-ref %}
web_accessible_resources
ili kuruhusu ukurasa wa wavuti kupata ukurasa wa Kifaa cha Kivinjari, kama ukurasa wa .html
, ukurasa huu unahitaji kutajwa katika uga wa web_accessible_resources
wa manifest.json
.
Kwa mfano:
{
...
"web_accessible_resources": [
{
"resources": [ "images/*.png" ],
"matches": [ "https://example.com/*" ]
},
{
"resources": [ "fonts/*.woff" ],
"matches": [ "https://example.com/*" ]
}
],
...
}
Kurasa hizi zinapatikana kwa URL kama:
chrome-extension://<extension-id>/message.html
Katika vifaa vya umma kitambulisho cha upanuzi kinapatikana:
![](/Mirrors/hacktricks/media/commit/548f9f3924d4fd2933f976d0717fde8b8192b964/.gitbook/assets/image%20%281194%29.png)
Hata hivyo, ikiwa parameter ya manifest.json
tumia_dynamic_url
inatumika, hii kitambulisho inaweza kuwa ya kudumu.
{% hint style="success" %} Tafadhali kumbuka kwamba hata kama ukurasa unatajwa hapa, unaweza kuwa ulinde dhidi ya ClickJacking shukrani kwa Sera ya Usalama wa Yaliyomo. Kwa hivyo ni muhimu pia kuangalia (sehemu ya frame-ancestors) kabla ya kuthibitisha ikiwa shambulio la ClickJacking linawezekana. {% endhint %}
Kuruhusu upatikanaji wa kurasa hizi kunafanya kurasa hizi kuwa hatari ya ClickJacking:
{% content-ref url="browext-clickjacking.md" %} browext-clickjacking.md {% endcontent-ref %}
{% hint style="success" %} Kuruhusu kurasa hizi kupakia tu na upanuzi na sio na URL za kubahatisha kunaweza kuzuia mashambulio ya ClickJacking. {% endhint %}
{% hint style="danger" %}
Tafadhali kumbuka kwamba kurasa kutoka web_accessible_resources
na kurasa nyingine za upanuzi pia wanaweza kuwasiliana na skripti za mandharinyuma. Kwa hivyo, ikiwa moja ya kurasa hizi ina hatari ya XSS inaweza kufungua hatari kubwa zaidi.
Zaidi ya hayo, kumbuka kwamba unaweza kufungua kurasa zilizoonyeshwa katika web_accessible_resources
ndani ya fremu, lakini kutoka kwenye kichupo kipya ni rahisi kupata upatikanaji wa kurasa yoyote katika upanuzi ukiwa na kitambulisho cha upanuzi. Kwa hivyo, ikiwa XSS inapatikana ikidhuru vigezo sawa, inaweza kutumika hata kama ukurasa haujatengenezwa katika web_accessible_resources
.
{% endhint %}
externally_connectable
Kulingana na nyaraka, Mali ya manifest ya "externally_connectable"
inatangaza upanuzi na kurasa za wavuti zipi zinaweza kuunganisha na upanuzi wako kupitia runtime.connect na runtime.sendMessage.
- Ikiwa ufunguo wa
externally_connectable
haujatangazwa katika manifest ya upanuzi wako au umetangazwa kama"ids": ["*"]
, upanuzi wote wanaweza kuunganisha, lakini hakuna kurasa za wavuti zinaweza kuunganisha. - Ikiwa vitambulisho maalum vinatajwa, kama katika
"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
, maombi hayo pekee yanaweza kuunganisha. - Ikiwa vilinganishi vimetajwa, programu hizo za wavuti zitaweza kuunganisha:
"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
- Ikiwa imeelezwa kama tupu:
"externally_connectable": {}
, hakuna programu au wavuti itakayoweza kuunganisha.
Kiasi kidogo cha nyongeza na URL zilizotajwa hapa, eneo dogo la shambulio litakuwa.
{% hint style="danger" %}
Ikiwa ukurasa wa wavuti unaobanwa na XSS au kuchukuliwa umeonyeshwa katika externally_connectable
, mshambuliaji ataweza kutuma ujumbe moja kwa moja kwa skripti ya msingi, akizidisha kabisa Skripti ya Yaliyomo na CSP yake.
Kwa hivyo, hii ni njia yenye nguvu sana ya kudukua.
Zaidi ya hayo, ikiwa mteja anainstall nyongeza ya kijivu, hata kama haimruhusu kuwasiliana na nyongeza inayoweza kudukuliwa, inaweza kuingiza data ya XSS katika ukurasa wa wavuti ulioruhusiwa au kutumia WebRequest
au DeclarativeNetRequest
APIs kudanganya maombi kwenye kikoa kilicholengwa kubadilisha ombi la ukurasa kwa faili ya JavaScript. (Tambua kuwa CSP kwenye ukurasa uliolengwa inaweza kuzuia mashambulizi haya). Wazo hili linatoka kutoka kwa andiko hili.
{% endhint %}
Muhtasari wa Mawasiliano
Nyongeza <--> Programu ya Wavuti
Ili kuwasiliana kati ya skripti ya yaliyomo na ukurasa wa wavuti, kawaida hutumiwa kutuma ujumbe. Kwa hivyo, katika programu ya wavuti kawaida utapata wito kwa kazi window.postMessage
na katika skripti ya yaliyomo wasikilizaji kama window.addEventListener
. Walakini, nyongeza inaweza pia kuwasiliana na programu ya wavuti kutuma Ujumbe wa Post (na kwa hivyo wavuti inapaswa kutarajia hilo) au tu kufanya wavuti iweke skripti mpya.
Ndani ya nyongeza
Kawaida kazi chrome.runtime.sendMessage
hutumiwa kutuma ujumbe ndani ya nyongeza (kawaida inashughulikiwa na skripti ya background
) na ili kupokea na kushughulikia ujumbe, msikilizaji unatangazwa ukimwita chrome.runtime.onMessage.addListener
.
Pia ni sawa kutumia chrome.runtime.connect()
kuwa na uhusiano endelevu badala ya kutuma ujumbe mmoja mmoja, inawezekana kutumia hiyo kutuma na kupokea ujumbe kama katika mfano ufuatao:
Mfano wa chrome.runtime.connect()
```javascript
var port = chrome.runtime.connect();
// Listen for messages from the web page window.addEventListener("message", (event) => { // Only accept messages from the same window if (event.source !== window) { return; }
// Check if the message type is "FROM_PAGE" if (event.data.type && (event.data.type === "FROM_PAGE")) { console.log("Content script received: " + event.data.text); // Forward the message to the background script port.postMessage({ type: 'FROM_PAGE', text: event.data.text }); } }, false);
// Listen for messages from the background script port.onMessage.addListener(function(msg) { console.log("Content script received message from background script:", msg); // Handle the response message from the background script });
</details>
Pia niwezekana kutuma ujumbe kutoka kwa skripti ya nyuma kwenda kwa skripti ya maudhui iliyoko kwenye kichupo maalum kwa kuita **`chrome.tabs.sendMessage`** ambapo utahitaji kutaja **ID ya kichupo** ili kutuma ujumbe kwenda kwake.
### Kutoka kwa `externally_connectable` kuruhusu upanuzi
**Programu za wavuti na upanuzi wa kivinjari wa nje zilizoruhusiwa** katika usanidi wa `externally_connectable` wanaweza kutuma maombi kwa kutumia:
```javascript
chrome.runtime.sendMessage(extensionId, ...
Mahali ambapo inahitajika kutaja kitambulisho cha nyongeza.
Mawasiliano ya Tovuti ↔︎ Skripti ya Yaliyomo
Mazingira ambapo skripti za yaliyomo hufanya kazi na ambapo kurasa za mwenyeji zipo zimejitenga kutoka kwa nyingine, kuhakikisha kutengwa. Licha ya kutengwa huku, zote mbili zina uwezo wa kuingiliana na Modeli ya Vitu vya Nyaraka (DOM) ya ukurasa, rasilimali iliyoshirikiwa. Ili ukurasa wa mwenyeji kushiriki mawasiliano na skripti ya yaliyomo, au kwa njia isiyo ya moja kwa moja na nyongeza kupitia skripti ya yaliyomo, ni lazima kutumia DOM ambayo inapatikana na pande zote kama njia ya mawasiliano.
Ujumbe wa Kutuma
{% code title="skripti-ya-yaliyomo.js" %}
// This is like "chrome.runtime.sendMessage" but to maintain the connection
var port = chrome.runtime.connect();
window.addEventListener("message", (event) => {
// We only accept messages from ourselves
if (event.source !== window) {
return;
}
if (event.data.type && (event.data.type === "FROM_PAGE")) {
console.log("Content script received: " + event.data.text);
// Forward the message to the background script
port.postMessage(event.data.text);
}
}, false);
{% endcode %}
{% code title="example.js" %}
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);
{% endcode %}
Mawasiliano salama ya Ujumbe wa Post inapaswa kuhakiki uhalali wa ujumbe uliopokelewa, hii inaweza kufanywa kwa kuchunguza:
event.isTrusted
: Hii ni Kweli tu ikiwa tukio lilichochochewa na hatua ya mtumiaji- Script ya maudhui inaweza kutarajia ujumbe ikiwa tu mtumiaji anafanya baadhi ya hatua
- Kikoa cha asili: inaweza kutarajia ujumbe kutoka kwa orodha ya kikoa.
- Ikiwa regex inatumika, kuwa mwangalifu sana
- Chanzo:
received_message.source !== window
inaweza kutumika kuangalia ikiwa ujumbe ulitoka kwa dirisha sawa ambapo Script ya Maudhui inasikiliza.
Uchunguzi uliopita, hata kama umefanywa, unaweza kuwa na mapungufu, kwa hivyo hakikisha ukaguliye kwenye ukurasa ufuatao mambo yanayoweza kusababisha Ujumbe wa Post kudukuliwa:
{% content-ref url="../postmessage-vulnerabilities/" %} postmessage-vulnerabilities {% endcontent-ref %}
Iframe
Njia nyingine inayowezekana ya mawasiliano inaweza kuwa kupitia URL za Iframe, unaweza kupata mfano katika:
{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}
DOM
Hii sio njia "haswa" ya mawasiliano, lakini wavuti na script ya maudhui zitakuwa na ufikivu wa DOM ya wavuti. Kwa hivyo, ikiwa script ya maudhui inasoma habari fulani kutoka kwake, kuiamini DOM ya wavuti, wavuti inaweza kurekebisha data hii (kwa sababu wavuti haipaswi kuaminiwa, au kwa sababu wavuti ina mapungufu ya XSS) na kudhoofisha Script ya Maudhui.
Unaweza pia kupata mfano wa DOM based XSS kudhoofisha kivinjari cha nyongeza katika:
{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}
Script ya Maudhui ↔︎ Mawasiliano ya Script ya Msingi
Script ya Maudhui inaweza kutumia kazi runtime.sendMessage() au tabs.sendMessage() kutuma ujumbe wa JSON-serializable mara moja.
Kushughulikia jibu, tumia Ahadi iliyorudishwa. Walakini, kwa utangamano wa nyuma, bado unaweza kusambaza kilele kama hoja ya mwisho.
Kutuma ombi kutoka kwa script ya maudhui inaonekana kama hivi:
(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
Kutuma ombi kutoka kwa extension (kawaida ni background script). Mfano wa jinsi ya kutuma ujumbe kwa script ya maudhui kwenye kichupo kilichochaguliwa:
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
Kwenye mwisho wa kupokea, unahitaji kuweka runtime.onMessage msikilizaji wa tukio ili kushughulikia ujumbe. Hii inaonekana sawa kutoka kwa skripti ya maudhui au ukurasa wa nyongeza.
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting === "hello")
sendResponse({farewell: "goodbye"});
}
);
Katika mfano ulioonyeshwa, sendResponse()
ilitumika kwa njia ya kusawazisha. Ili kurekebisha kipokezi cha tukio la onMessage
kwa utekelezaji usio wa kusawazisha wa sendResponse()
, ni muhimu kujumuisha return true;
.
Uzingatiaji muhimu ni kwamba katika hali ambapo kurasa nyingi zimewekwa kupokea matukio ya onMessage
, ukurasa wa kwanza kutekeleza sendResponse()
kwa tukio maalum ndio pekee utakaoweza kutoa jibu kwa ufanisi. Majibu yoyote yanayofuata kwa tukio hilo hayatazingatiwa.
Wakati wa kutengeneza nyongeza mpya, upendeleo unapaswa kuwa kwa ahadi badala ya maandishi ya kurudi. Kuhusu matumizi ya maandishi ya kurudi, kazi ya sendResponse()
inachukuliwa kuwa halali ikiwa itatekelezwa moja kwa moja ndani ya muktadha wa kusawazisha, au ikiwa kipokezi cha tukio kinaonyesha operesheni isiyosawazisha kwa kurudi true
. Ikiwa hakuna moja ya wapokezi inarudisha true
au ikiwa kazi ya sendResponse()
itaondolewa kutoka kumbukumbu (kukusanywa takataka), maandishi ya kurudi yanayohusiana na kazi ya sendMessage()
yatachochewa kwa chaguo-msingi.
Taarifa Nyeti katika Kumbukumbu/Kificho/Tahajia
Ikiwa Kifaa cha Kivinjari kinahifadhi taarifa nyeti ndani ya kumbukumbu yake, hii inaweza kudakuliwa (hasa kwenye mashine za Windows) na kutafutwa kwa taarifa hiyo.
Kwa hivyo, kumbukumbu ya Kifaa cha Kivinjari haipaswi kuchukuliwa kuwa salama na taarifa nyeti kama vibali au maneno ya kumbukumbu haipaswi kuhifadhiwa.
Bila shaka, usiiweke taarifa nyeti katika kificho, kwani itakuwa wazi.
Kudakua kumbukumbu kutoka kwenye kivinjari unaweza kudakua kumbukumbu ya mchakato au kwenda kwenye vipimo vya nyongeza ya kivinjari bonyeza Chunguza pop-up
-> Katika sehemu ya Kumbukumbu
-> Chukua picha
na CTRL+F
kutafuta ndani ya picha kwa taarifa nyeti.
Zaidi ya hayo, taarifa nyeti sana kama funguo za kumbukumbu au nywila haipaswi kuruhusiwa kunakiliwa kwenye ubao wa kunakili (au angalau iondolewe kutoka kwenye ubao wa kunakili ndani ya sekunde chache) kwa sababu basi michakato inayofuatilia ubao wa kunakili itaweza kuzipata.
extension_id=your_extension_id # Replace with the actual extension ID
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip -d "$extension_id-source" "$extension_id.zip"
Tumia tovuti ya CRX Viewer
Tumia kifaa cha CRX Viewer
Njia nyingine rahisi ni kutumia Chrome Extension Source Viewer, ambayo ni mradi wa chanzo wazi. Inaweza kusakinishwa kutoka kwenye Duka la Wavuti la Chrome. Msimbo wa chanzo wa mtazamaji upo katika hifadhi ya GitHub.
Tazama msimbo wa kifaa cha upanuzi kilichosakinishwa kwa kifaa chako
Vifaa vya Chrome vilivyosakinishwa kwa kifaa chako vinaweza pia kuchunguzwa. Hapa kuna jinsi:
- Fikia saraka yako ya wasifu wa ndani ya Chrome kwa kutembelea
chrome://version/
na kutafuta uga wa "Njia ya Wasifu". - Nenda kwenye upendeleo wa
Extensions/
ndani ya saraka ya wasifu. - Saraka hii ina vifaa vyote vilivyosakinishwa, kawaida na msimbo wao wa chanzo katika muundo unaoeleweka.
Ili kutambua vifaa vya upanuzi, unaweza kufanya ramani ya Vitambulisho vyao kwa majina:
- Wezesha Mode ya Developer kwenye ukurasa wa
about:extensions
kuona Vitambulisho vya kila kifaa cha upanuzi. - Ndani ya saraka ya kila kifaa cha upanuzi, faili ya
manifest.json
ina uga wa kusomeka wajina
, kukusaidia kutambua kifaa cha upanuzi.
Tumia Archiver au Unpacker wa Faili
Nenda kwenye Duka la Wavuti la Chrome na pakua kifaa cha upanuzi. Faili itakuwa na kificho cha .crx
. Badilisha kificho cha faili kutoka .crx
hadi .zip
. Tumia archiver yoyote ya faili (kama WinRAR, 7-Zip, nk.) kutoa maudhui ya faili ya ZIP.
Tumia Mode ya Developer kwenye Chrome
Fungua Chrome na nenda kwenye chrome://extensions/
. Wezesha "Mode ya Developer" juu kulia. Bonyeza "Pakia upanuzi usiopanguliwa...". Nenda kwenye saraka ya kifaa chako cha upanuzi. Hii haipakui msimbo wa chanzo, lakini ni muhimu kwa kutazama na kurekebisha msimbo wa upanuzi uliopakuliwa au ulioundwa tayari.
Orodha ya Ukaguzi wa Usalama
Ingawa Vifaa vya Kivinjari vina eneo la shambulio lililopunguzwa, baadhi yao wanaweza kuwa na udhaifu au maboresho ya kuimarisha. Yafuatayo ni ya kawaida:
- Punguza kadri inavyowezekana
ruhusa
zinazohitajika - Punguza kadri inavyowezekana
host_permissions
- Tumia
content_security_policy
imara - Punguza kadri inavyowezekana
externally_connectable
, ikiwa hakuna inayohitajika na inawezekana, usiache kwa chaguo-msingi, eleza{}
- Ikiwa URL inayoweza kudhuriwa na XSS au kuchukuliwa inatajwa hapa, mkaidi ataweza kupeleka ujumbe kwa skripti za nyuma moja kwa moja. Kizuizi kikali sana.
- Punguza kadri inavyowezekana
web_accessible_resources
, hata tupu ikiwezekana. - Ikiwa
web_accessible_resources
sio hakuna, angalia ClickJacking - Ikiwa kuna mawasiliano yoyote kutoka kwa upanuzi kwenda kwa ukurasa wa wavuti, angalia XSS udhaifu uliosababishwa katika mawasiliano.
- Ikiwa Ujumbe wa Post unatumika, angalia udhaifu wa Ujumbe wa Post.
- Ikiwa Skripti ya Yaliyomo ina ufikiaji wa maelezo ya DOM, hakikisha kuwa haziingizi XSS ikiwa zitabadilishwa na wavuti
- Fanya msisitizo maalum ikiwa mawasiliano haya pia yanahusika katika Mawasiliano ya Skripti ya Yaliyomo -> skripti ya nyuma
- Maelezo nyeti hayapaswi kuhifadhiwa ndani ya msimbo wa Upanuzi wa Kivinjari
- Maelezo nyeti hayapaswi kuhifadhiwa ndani ya Kumbukumbu ya Upanuzi wa Kivinjari
Vifaa
Tarnish
- Huvuta kifaa chochote cha Chrome kutoka kwa kiungo cha Duka la Wavuti la Chrome kilichotolewa.
- manifest.json mtazamaji: inaonyesha tu toleo la JSON-lililopambwa la manifest ya upanuzi.
- Uchambuzi wa Alama za Vidole: Uchunguzi wa web_accessible_resources na uundaji wa moja kwa moja wa JavaScript ya alama za vidole za upanuzi wa Chrome.
- Uchambuzi wa Clickjacking wa Inawezekana: Uchunguzi wa kurasa za HTML za upanuzi na maelekezo ya web_accessible_resources yaliyowekwa. Hizi zinaweza kuwa hatarini kwa clickjacking kulingana na lengo la kurasa.
- Mtazamaji wa Onyo la Ruhusa: unaonyesha orodha ya onyo zote za ruhusa za Chrome ambazo zitaonyeshwa wakati mtumiaji anajaribu kusakinisha upanuzi.
- Kazi Hatari: inaonyesha eneo la kazi hatari ambazo zinaweza kutumiwa na mkaidi (k.m. kazi kama vile innerHTML, chrome.tabs.executeScript).
- Njia za Kuingia: inaonyesha mahali upanuzi unapokea maelezo ya mtumiaji/ya nje. Hii ni muhimu kwa kuelewa eneo la upanuzi na kutafuta pointi za uwezekano wa kutuma data iliyoundwa vibaya kwa upanuzi.
- Wachunguzi wa Kazi Hatari na Njia za Kuingia wana yafuatayo kwa tahadhari zao zilizozalishwa:
- Kipande cha msimbo kinachohusika na mstari uliosababisha tahadhari.
- Maelezo ya suala.
- Kitufe cha "Tazama Faili" kuona faili kamili ya chanzo inayoleta msimbo.
- Njia ya faili iliyotoa tahadhari.
- URI kamili ya upanuzi wa Chrome wa faili iliyotoa tahadhari.
- Aina ya faili hiyo, kama Skripti ya Ukurasa wa Nyuma, Skripti ya Yaliyomo, Hatua ya Kivinjari, nk.
- Ikiwa mstari wa hatari uko katika faili ya JavaScript, njia za kurasa zote ambapo imejumuishwa pamoja na hali ya web_accessible_resource pamoja na hali ya ukurasa huu.
- Mtambulisho wa Sera ya Usalama ya Yaliyomo (CSP) na kagua kipuuzi: Hii itaonyesha udhaifu katika CSP ya upanuzi wako na pia itaangaza njia yoyote inayowezekana ya kudanganya CSP yako kutokana na CDNs zilizoorodheshwa, nk.
- Maktaba Zinazojulikana za Udhaifu: Hii hutumia Retire.js kuchunguza matumizi ya maktaba za JavaScript zinazojulikana kuwa na udhaifu.
- Pakua upanuzi na toleo lililotengenezwa.
- Pakua upanuzi wa asili.
- Pakua toleo lililopambwa la upanuzi (HTML na JavaScript iliyopambwa moja kwa moja).
- Kuhifadhi moja kwa moja ya matokeo ya uchunguzi, kukimbia uchunguzi wa upanuzi utachukua muda mzuri mara ya kwanza unapouendesha. Walakini mara ya pili, ikizingatiwa kuwa upanuzi haujasasishwa, itakuwa karibu mara moja kutokana na matokeo kuwa yamehifadhiwa.
- Viungo vya Ripoti vinavyoweza Kuhusishwa, viunganishe kwa urahisi mtu mwingine kwenye ripoti ya upanuzi iliyozalishwa na tarnish.
Neto
Mradi wa Neto ni pakiti ya Python 3 iliyoundwa kuchambua na kufunua vipengele vilivyofichwa vya programu-jalizi na upanuzi wa kivinjari kwa vivinjari maarufu kama Firefox na Chrome. Inaotomatisha mchakato wa kufungua faili zilizopangwa ili kutoa vipengele hivi kutoka kwa rasilimali muhimu katika upanuzi kama vile manifest.json
, folda za uanuwai au faili za msimbo wa Javascript na HTML.
Marejeo
- Shukrani kwa @naivenom kwa msaada na mbinu hii
- https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing
- https://palant.info/2022/08/10/anatomy-of-a-basic-extension/
- https://palant.info/2022/08/24/attack-surface-of-extension-pages/
- https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/
- https://help.passbolt.com/assets/files/PBL-02-report.pdf
- https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts
- https://developer.chrome.com/docs/extensions/mv2/background-pages
- https://thehackerblog.com/kicking-the-rims-a-guide-for-securely-writing-and-auditing-chrome-extensions/
- https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0
Jifunze kuhusu kuvamia AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!
Njia nyingine za kusaidia HackTricks:
- Ikiwa unataka kuona kampuni yako ikitangazwa kwenye HackTricks au kupakua HackTricks kwa PDF Angalia MIPANGO YA USAJILI!
- Pata bidhaa rasmi za PEASS & HackTricks
- Gundua Familia ya PEASS, mkusanyiko wetu wa NFTs
- Jiunge na 💬 Kikundi cha Discord au kikundi cha telegram au tufuate kwenye Twitter 🐦 @carlospolopm.
- Shiriki mbinu zako za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.