這個基於 JavaScript charCodeAt 的登錄腳本的優缺點
我知道他們網站上的一家公司正在使用這個用 JavaScript 編寫的非常基本的密碼登錄頁面。這看起來一點也不安全,因為在 html 原始碼中它顯示了腳本的來源:http ://www.dynamicdrive.com/dynamicindex9/password.htm並且您還可以看到它是如何工作的,因為它是 JavaScript你可以在瀏覽器中查看原始碼。
看起來很簡單,它採用使用者在輸入欄位中輸入的值計算出密碼中每個字元的 char unicode 整數值,然後將該值乘以前一個值並循環直到它為每個字元完成此操作在密碼中。然後,它將它與保存在 JavaScript 中的答案值進行比較,使用者已經使用 http://www.dynamicdrive.com/dynamicindex9/password.htm上的工具以相同的方式從正確答案轉換,然後如果這兩個匹配JavaScript 會將您重定向到秘密頁面,該頁面是一個與明文密碼同名的 html 文件。
我的問題是知道這種方法如何將使用者輸入的內容轉換為 charcode 值,你如何反轉這個過程來找出原始的純文字密碼是什麼?我已將下面的使用者程式碼和密碼值更改為該公司網站上的特色。
我想到了兩種將 16978476480 改回純文字的方法。我猜一種可能性是獲取常用密碼的單詞列表,使用相同的方法將每個密碼轉換為數字值,然後查看是否匹配 16978476480。另一種類似的方法是選擇隨機字元以形成 4 到 8 之間的字元串字元長度,通常的密碼長度,將所有 unicode 值乘以在一起,然後繼續循環,直到我們幸運並匹配到 16978476480。有人能想到更好的更快的方法嗎?
腳本如下:
//加密密碼腳本 - Rob Heslop //動態驅動器上的腳本 //訪問http://www.dynamicdrive.com
function submitentry(){ password = document.password1.password2.value.toLowerCase() username = document.password1.username2.value.toLowerCase() passcode = 1 usercode = 1 for(i = 0; i < password.length; i++) { passcode *= password.charCodeAt(i); } for(x = 0; x < username.length; x++) { usercode *= username.charCodeAt(x); } //CHANGE THE NUMBERS BELOW TO REFLECT YOUR USERNAME/PASSWORD if(usercode==12211815000&&passcode==16978476480) //CHANGE THE NUMBERS ABOVE TO REFLECT YOUR USERNAME/PASSWORD { window.location=password+".html"} else{ alert("password/username combination wrong")} } <form name="password1"> <strong>Enter username:</strong> <input type="text" name="username2" size="15"> <br> <strong>Enter password: </strong> <input type="password" name="password2" size="15"> <input type="button" value="Submit" onClick="submitentry()"> </form>
你不需要蠻力它。由於密碼是其所有字元程式碼的乘積,因此您可以找到密碼的所有主要因素。我使用了一個線上工具,它產生 $ 2^6\cdot 3\cdot 5\cdot 7^2\cdot 61^2\cdot 97 $ . 它看起來像一個長度為 5 的 ASCII 密碼。
這不會帶您到任何地方,因為這只是檢查要打開的網頁。現在你需要“蠻力”所有可能的組合 $ 2^6\cdot 3\cdot 5\cdot 7^2\cdot 61^2 $ ( $ 97 $ 更多或更少固定為
a
),然後為每個組合嘗試所有排列。由於只使用小寫字母,因此您可以進一步過濾。對於每個排列,您都需要下載password+'.html'
文件。當您最終獲得 HTTP 200 程式碼時,您就完成了。當然,如果您假設每個字母都是小寫的,那麼您可以假設 $ 2\cdot 61 $ 是
z
。現在的問題是找到一個包含字母的 5 個字母的單詞zza
……其他主要因素會讓你p
和i
.請注意,您只需要對 執行此操作
passcode
,usercode
不使用。