最近剛出了新聞,阿裡四名網絡安全部門員工利用網頁漏洞寫js腳本搶月餅,於是興致來了,想了解一下這個js腳本到底怎麼寫,各種刷單各種搶槍搶又是怎麼實現的。
什麼是javascript注入攻擊?
1.每當接受用戶輸入的內容並重新顯示這些內容時,網站就很容易遭受 JavaScript 注入攻擊。讓我們研究一個容易遭受 JavaScript 注入攻擊的具體應用程序。假設已經創建了一個客戶反饋網站。客戶可以訪問網站並輸入對產品的反饋信息。當客戶提交反饋時,反饋信息重新顯示在反饋頁面上。
客戶反饋網站是一個簡單的網站。不幸的是,此網站容易遭受 JavaScript 注入攻擊。
假設正在將以下文本輸入到客戶反饋表單中:
<script>alert(“Attack!”)</script>
此文本表示顯示警告消息框的 JavaScript 腳本。在某人將此腳本提交到客戶反饋表單後,消息Attack! 會在將來任何人訪問客戶反饋網站時顯示。
2.還有一種就是在浏覽器地址欄中輸入一段js代碼,用來改變頁面js變量、頁面標簽的內容。
使用Javascript注入,用戶不需要關閉或保存網頁就可以改變其內容,這是在浏覽器的地址欄上完成的。命令的語法如下:
javascript:alert(#command#)
例如,如果你想在http://www.example.com站點上看到一個alert警告框,那麼首先在地址欄上輸入URL並等待頁面加載完成,然後刪掉URL並輸入:
javascript:alert("Hello World")
作為新的URL。這將彈出一個“Hello World”警告框,使用這一技術幾乎可以改變網頁的任何內容,例如一張圖片。假設有一張網站logo圖片,我們通過查看頁面源文件找到其中一段HTML代碼:
<IMG Name="hi" SRC="hello.gif">
圖片被命名為“hi”,源文件是“hello.gif”,我們想要把它改成存儲在我們站點(http://www.mysite.com)上的 “bye.jpeg”文件,因此圖片完整的URL地址是http://www.mysite.com/bye.jpeg,使用Javascript注入, 我們只需要在地址欄上輸入:
javascript:alert(document.hi.src="http://www.mysite.com/bye.jpeg")
你將會看到彈出“http://www.mysite.com/bye.jpeg”alert警告,然後圖片就被更改了。需要注意的是,這些更改只是暫時的!如果你刷新頁面或者重新進入,你的更改將會消失,因為你只是在你的PC作了這些更改,而不是在網頁服務器上。
使用同樣的方法我們可以查看或更改變量的值,例如我們在網頁上找到一段這樣的代碼:
<SCRIPT LANGUAGE="JavaScript"> var a="test" </SCRIPT>
意思是變量a的值為“test”,現在我們輸入:
javascript:alert(a)
然後我們將其值改為“hello”:
javascript:alert(a="hello")
Javascript注入通常被用來更改表單屬性,假設有一段這樣的代碼:
<form name="format" action="send.php" method="post"> <input type="hidden" name="mail" value="someone@somewhere.com"> <input type="text" name="name"> <input type="submit" value="submit"></form>
我們想讓表單發送到我們的郵箱,而不是someone@somewhere.com。可以使用如下命令:
javascript:alert(document.format.mail.value="me@hacker.com")
•也許你已經注意到了這些命令的層次關系:
•我們按照從左到右的順序依次說明:
•1)最左邊是document
•2)然後是我們想要更改的對象名(比如document.hi.src)或其包含的對象(比如document.format.mail.value)
•3)最後是我們想要更改的屬性(比如源路徑:document.hi.src,或變量值:document.format.mail.value)
•4)使用“.”號分隔
•5)當我們想要更改屬性值的時候,我們使用“=”號和新的屬性值
•*注釋:當新的屬性值為字符串時(比如:document.format.mail.value="me@hacker.com")需要用雙引號把它括起來。
•如果我們想要把它作為一個變量的值,則不需要使用雙引號""。例如我們想要將變量b的值賦予變量a,我們可以輸入javascript:alert(a=b)。
•但是,頁面中的大部分標簽都沒有名字,比如:
<form action="send.php" method="post"> <input type="hidden" name="mail" value="someone@somewhere.com"> <input type="text" name="name"> <input type="submit" value="submit"></form>
在這段代碼中沒有表單名,綜合上面這些信息,可以使用此命令:
javascript:alert(document. .mail.value="me@hacker.com")
在這種情況下我們必須統計並找出表單序號,下面是一個例子:
<form action="send.php" method="post"> <input type="text" name="name"> <input type="submit" value="submit"> </form> <form action="send.php" method="post"> <input type="hidden" name="mail" value="someone@somewhere.com"> <input type="text" name="name"> <input type="submit" value="submit"> </form> <form action="send.php" method="post"> <input type="text" name="name"> <input type="submit" value="submit"> </form>
•在以上代碼中我們看見了3個表單,但我們只對第二個感興趣,因此我們想要的表單序號就是2。不要忘記我們是從1開始計算的,比如1,2,3,4...而javascript卻從0開始計算,比如0,1,2,3...所以真正的表單序號是1,不是2,通常我們要把找到的表單序號減一。我們將用這個序號來補全我們的命令:
javascript:alert(document.forms[1].mail.value="me@hacker.com")
•這樣你就可以更改沒有名字的圖片或鏈接了,你可以把“forms”換成任何你想要的標簽類型。對於圖片就是
javascript:alert(document.images[3].src="#the url of the picture you want#")
對於鏈接就是
javascript:alert(document.links[0].href="#the url you want#")
最後,我們可以用這個技巧來編輯cookies。下面的命令由triviasecurity.net的Dr_aMado編寫,我只修改了一點點,讓它在用戶編輯之前顯示出來。你只要把它們復制到地址欄就可以了:
javascript:alert(window.c=function a(n,v,nv){c=document.cookie;c=c.substring(c.indexOf(n)+n.length,c.length); c=c.substring(1,( (c.indexOf(";")>-1) ? c.indexOf(";") : c.length));nc=unescape(c).replace(v,nv); document.cookie=n+"="+escape(nc);return unescape(document.cookie);}); alert('The cookie is: "'+document.cookie+'"');alert(c(prompt("The name of the cookie:",""), prompt("Change this value:",""),prompt("with this:","")))
//如果你想要手動更改你的cookie,可以使用下面這條命令:
javascript:alert(document.cookie)
這將顯示你的當前cookie,假設是“userid=1”,如果你想把它改成“userid=2”,可以使用下列命令:
javascript:alert(document.cookie="userid=2")
最後我必須強調的是,所有的更改都只是在客戶端!就像是把網頁保存在你的PC上然後修改它。盡管如此,使用這一技巧你仍然可以欺騙頁面(例如cookies)或繞過安全驗證。例如一些網頁會檢測用戶發送數據的位置,如果從http://www.test.com/form.php發送數據到http://www.test.com/check.php,check.php可能會檢測數據是否來自http: //www.test.com/form.php上的表單。除此之外,如果你打算在頁面中輸入你自己的JavaScript代碼,通過使用一些這樣的技巧,你將能夠更改圖片並保持不變!
最後的最後,既然js注入這麼可怕,我們自己寫的網站有什麼解決辦法來防止js注入呢?
方法一:
阻止 JavaScript 注入攻擊的一種簡單方法是重新在視圖中顯示數據時,用 HTML 編碼任何網站用戶輸入的數據
如:<%=Html.Encode(feedback.Message)%>
使用 HTML 編碼一個字符串的含意是什麼呢?使用 HTML 編碼字符串時,危險字符如 < 和 > 被替換為 HTML 實體,如 < 和 >。所以,當使用 HTML 編碼字符串 <script>alert("Boo!")</script> 時,它將轉換為 <script>alert("Attack!")</script>。浏覽器在解析編碼的字符串時不再執行 JavaScript 腳本。而是顯示無害的頁面。
方法二:
除了在視圖中顯示數據時使用 HTML 編碼數據,還可以在將數據提交到數據庫之前使用 HTML 編碼數據。
StringEscapeUtils.escapeHtml("前台提交的數據");
通常,人們喜歡使用本教程中討論的第一種方法,而不喜歡使用第二種方法。第二種方法的問題在於在數據庫中最終會保留 HTML 編碼的數據。換言之,數據庫中的數據會包含奇怪的字符。這有什麼壞處呢?如果需要用除網頁以外的形式顯示數據庫數據,則將遇到問題。例如,不能輕易在 Windows Forms 應用程序中顯示數據。
感謝網友分享:http://zxf-noimp.iteye.com/blog/1130771
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。