JSPrime:基于JavaScript DOM XSS檢測的輕量級代碼審計工具
如今,隨著前端技術(shù)人才需求的不斷增加,越來越多的開發(fā)者逐漸將JavaScript作為其開發(fā)語言的第一選擇。
目前無論是在傳統(tǒng)PC Web平臺還是移動終端平臺上,在客戶端側(cè)或者服務(wù)端側(cè),JavaScript均有不俗的性能體現(xiàn)及豐富的框架支持,所以其作為一個主流開發(fā)語言也逐漸被廣泛認(rèn)可接受。同時,JavaScript 也因其解釋器性能上的優(yōu)勢,可為企業(yè)解決可擴(kuò)展性和吞吐量等瓶頸問題。所以JavaScript當(dāng)前來說是一種重要的、強(qiáng)大的開發(fā)語言,它的使用者也是日益增多。
但目前的問題是,隨著越來越多的JS庫的出現(xiàn)及許多開發(fā)者在以功能實現(xiàn)為導(dǎo)向時,有時候會出現(xiàn)不安全編碼,而這也導(dǎo)致了許多客戶端側(cè)攻擊事件出現(xiàn),其中特別是DOM XSS最為普遍。在開發(fā)這個工具之前,我們試圖分析代碼中引起DOM XSS攻擊的觸發(fā)點,但苦于沒有足夠有效的工具來分析解決問題。因此我們開始嘗試開發(fā)工具來分析解決代碼層面中的問題,到這里我們將這款基于DOM XSS攻擊的代碼審計工具JSPrime定義為:一款JavaScript靜態(tài)分析工具,可進(jìn)行代碼審計,且其是一款輕量級且極易上手的點擊式工具!其中,靜態(tài)分析功能模塊是基于當(dāng)前非常流行的Esprima ECMAScript語法進(jìn)行解析的。
下載地址
JSPrime GitHub下載地址:jsprime
JSPrime主要功能點
1、支持定位分析JS框架或庫的Source以及Sinks;
2、許多動態(tài)或者靜態(tài)分析工具的開發(fā)往往只支持純JavaScript語法及功能,可這對于大部分開發(fā)者來說這是個問題,因為開發(fā)過程中,通常會使用一些JavaScript框架或者庫,像jQuery, YUI等等。因為這些掃描器被設(shè)計用以支持純JavaScript語法檢測,其在理解開發(fā)代碼內(nèi)容方面較為不成熟,容易產(chǎn)生誤報。所以為解決這個問題,JSPrime是基于jQuery和YUI等框架,對用戶的存在危險性質(zhì)的輸入來源source及代碼執(zhí)行sink輸入函數(shù)進(jìn)行檢測分析。以下為部分Source以及Sinks的具體信息,詳細(xì)可查看:Source&Sinks
3、變量及函數(shù)追蹤定位;
4、變量及函數(shù)范圍界限分析;
5、識別已知過濾函數(shù);
6、面向?qū)ο?OOP)分析及原形代碼設(shè)計合規(guī);
7、最小誤報率告警;
8、支持Minified.js庫(該庫目前功能包括DOM操作,事件,動畫,cookies和HTTP請求);
9、快速分析檢索能力;
10、點擊式操作(工具無需各種復(fù)雜操作,容易上手)。
安裝操作步驟
1、Web端操作
在瀏覽器中打開“index.html”。
2、服務(wù)端操作
(1)若無安裝Node.js,請先前往:node.js中文網(wǎng)官網(wǎng)下載;
(2)完成第一步后,于終端中打開此前從GitHub下載的文件中的server.js ,具體命令如下,
node server.js
(3)在服務(wù)端開啟之后,于瀏覽器上輸入:127.0.0.1:8888。
DOM XSS分析測試用例
關(guān)于DOM XSS漏洞測試用例如下(這里只存放前五個測試用例),詳細(xì)測試用例(共61個)請參考:百度網(wǎng)盤,提取碼為6qfd。
- ---------------TEST CASE 01-------------
- var param = location.hash.split("#")[1];
- document.write("Hello " + param + "!");
- ---------------TEST CASE 02-------------
- function timedMsg(callback){
- if(callback){
- var t=setTimeout(eval('callback'),3000);
- return 0;
- }}
- function fire(){
- var call = location.hash.split("#")[1];
- timedMsg(call);
- }
- ---------------TEST CASE 03------------
- function timedMsg(callback){
- if(callback){
- var t=setTimeout(eval('callback'),3000);
- return 0;
- }}
- function fire(){
- var call = location.hash.split("#")[1];
- var check=timedMsg;
- check(call);
- }
- ---------------TEST CASE 04------------
- function timedMsg(abc,callback){
- if(callback){
- var t=setTimeout(eval('callback'),3000);
- return 0;
- }}
- function fire(){
- var call = location.hash.split("#")[1];
- timedMsg(12,"call");
- }
- ---------------TEST CASE 05------------
- function timedMsg(abc,callback){
- if(callback){
- var t=setTimeout(eval('callback'),3000);
- return 0;
- }}
- function fire(){
- var call = location.hash.split("#")[1];
- var check=timedMsg;
- check("123",call);
- }
相關(guān)功能測試截圖
前端界面如下,
分析結(jié)果如下,
服務(wù)器側(cè)界面及分析如下,
【編輯推薦】