前端JS加密那些事


前端JS加密那些事

0x01前端基本編碼/加密方式

前端信息枚舉時,當通過Burp抓包發現參數經過類似Base64、MD5等方式處理過的,可以直接通過Burp->Intruder->Payloads->PayloadProcessing的設置來進行枚舉。這里還有一些其他的功能可以自行拓展(如:增加payload前綴)

0x02自定義加密

如果遇到自定義加密的情況,就需要通過閱讀js文件,找到加密函數。根據加密函數對參數值進行運算后再提交數據包。

尋找Encrypt()

尋找加密函數的方法有很多種,接下來我通過實例來講講我的方法,希望有人能看明白吧。
就在剛剛遇到的一個登錄頁面,登錄的數據包是這樣的(如下圖)。password參數是經過處理后的數據,咋一看通過URL解碼后拿去按base64解是亂碼,這時就需要看js做了什么操作了。

我們F12打開開發者工具,通過開發者工具左上角的元素選擇工具,定位到登錄按鈕元素。然后在右側的選項卡中選擇EventListeners,查看綁定了登錄按鈕Click(點擊)事件的js。

一眼應該很明顯能看到最后一個customerLogin.js,我們要的東西應該在這里面,點擊它跟進進去。
跟進后我們簡單閱讀js,大概就了解了Burp抓的那一串數據是怎么來的了。通過UED.aes.getKey(16)獲得Key后,使用UED.aes.encrypt(key,password)加密。我們可以繼續跟進,搜索一下UED是個什么東西以及UED.aes.getKey()和UED.aes.encrypt()的定義。

這里我們通過search in all files來找UED的定義。

跟進這個文件,我們就可以清晰的看到加解密的過程和getKey的作用了~

var UED = window.UED || {};
(function ($, window) {

	
	var App = {
		init: function() {
			this.cacheElements();
			this.bindEvents();
		},
		cacheElements: function() {

		},
		bindEvents: function() {

		},

		/**
		* aes加密
		* @param theKey 密鑰
		* @param pass 密碼(原文)
		*/
		encrypt: function(theKey,pass){
			 var key = CryptoJS.enc.Utf8.parse(theKey);	

			 var srcs = CryptoJS.enc.Utf8.parse(pass);
			 var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
			 return encrypted.toString();
		},

		/**
		* aes解密
		* @param theKey 密鑰
		* @param pass 密碼(密文)
		*/
		decrypt: function(theKey,pass){
			 var key = CryptoJS.enc.Utf8.parse(theKey);	

			 var decrypt = CryptoJS.AES.decrypt(pass, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
			 return CryptoJS.enc.Utf8.stringify(decrypt).toString();
		},
		/**
		* 生成密鑰
		* @param n 生成多少位的密鑰(默認8位)
		*/
		getKey: function(n) {
			var chars = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
		
			 if(n==null){
				n = 8;
			 }
			 var res = "";
			 for(var i = 0; i < n ; i ++) {
				 var id = Math.ceil(Math.random()*35);
				 res += chars[id];
			 }
			 return res;
		}
	}
	App.init();
	UED.aes = App;
  
})(jQuery,window);

這樣下來我們就了解了整個過程:

  1. getKey(16) //獲取隨機16位key
  2. encrypt(key, password) //加密password
  3. 將key和password都發送給服務端

0x03 繞過前端加密

這里總結了幾種繞過的方式:

  1. 如果加密算法比較簡單的話,可以通過編程語言重寫一下加密,再構造發送數據包。這樣的弊端是,當加密算法較復雜,或時間較緊急時無法快速完成測試。

  2. 第二種與1有些類似,通過Python的PyExecJs模塊加載JS加密函數。通過調用此函數獲得加密后數據,再構造發送數據包。下圖是針對上面講的案例寫的腳本。

  3. 第三種方法相對於前面的更加簡單粗暴而且快捷。通過使用c0ny1師傅寫的Burp插件jsEncrypter來完成此需求。
    項目鏈接:jsEncrypter,使用的方法作者已經寫的很清楚了,網上也有很多文章,這里就不贅述了。我們直接來看下效果吧~下圖是針對上面講的案例做的操作,可以看到生成的密文服務器端成功解析了。

可以看到使用正確的密碼進行登錄,已經成功登錄

0x04 結尾

滲透測試中,有時枚舉可能帶你進入新世界,讓你尋找到木桶上的最短板。本文主要講一下遇到前端js加密,需要枚舉的情況下的一些解決方法。肯定會有更好的辦法,也希望各位師傅能分享分享~
文章可能有寫的不太清晰或不正確的地方,希望各位師傅斧正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM