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