記錄一下自己對hash擴展攻擊的一些理解,hash擴展攻擊主要應用於身份認證,比如對於成功登錄的用戶可以賦予其一個採用hsah算法加密的cookie值,其中含有未知的密鑰。
此後每次在服務器端驗證此cookie中的憑證是否正確
if ($hsh !== md5($SECRET . $_COOKIE["auth"])) {
die("error");
}
上端代碼中密鑰存儲在服務器端,auth在客戶端存儲,hsh爲登陸成功的用戶所擁有,那麼作爲攻擊者,我們已知hash後的密文,如果直到密鑰長度,就可以再次構造hash值使等式
成立。hash擴展攻擊適用於md5,sha1,其原理http://blog.chinaunix.net/uid-27070210-id-3255947.html,這篇文章可以看看,主要知道以下幾點:
1.對於hash的消息要進行補位到mod 512 餘 448bit,按64字節分組
2.下一組明文的摘要的初始iv需要用到上一組明文的摘要值
所有我們在已知一組hash值的情況下,只需要對原始明文進行擴充就可以了在不知道密鑰的情況下得到另一個合法hash值。
比如原始數據爲
$_COOKIE["auth"]=“wfz”; $secret = "flag" $hsh = md5("flag"."wfz")
此時作爲攻擊者,我們有了hsh值,假設已知密鑰的長度,就可以對原始消息進行填充
$new_msg = "xxxx"."wfz".padding
此時$new_msg已經滿足64字節,然後我們就可以在$new_msg後面填充上想要添加的任何值
比如
$append = "hacker"
然後就得到了payload = “wfz”.padding."hacker"
接着只需要將之前已經得到的$hsh的值作爲新的md5摘要運算的初始iv,並且對新添加的值$append = "hacker"進行加密
就能得到一串hash值
<html> <form> <form> </html> <?php error_reporting(0); $SECRET = "flag"; if (isset($_COOKIE["auth"]) && isset($_COOKIE["hsh"])) { $hsh = $_COOKIE["hsh"]; echo $hsh; echo "\n"; echo md5($SECRET . urldecode($_COOKIE["auth"])); if ($hsh !== md5($SECRET . urldecode($_COOKIE["auth"]))) { echo md5($SECRET . urldecode($_COOKIE["auth"])); echo "</br>"; echo md5($SECRET . $_COOKIE["auth"]); echo "</br>"; die("error"); } else{ echo "success"; } } else { echo "hsh:".md5($SECRET . urldecode($_COOKIE["auth"]))."</br>"; echo "input auth and hsh"; } ?>
本地測試如上,爲了方便,改cookie用get,都是一樣的原理,此時有了hsh:34503d694103892c2f8b709f8440ab5b
然後利用hashpump,構造新的hash值
hsh=e9ce9ebaab0a671ec8edddda705a7dae
payload=wfz\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x00hacker
因爲源碼是經過urldecode,所以這裏將payload經過urlencode函數編碼一次,這裏要用php的urlencode函數編碼,不要用在線的url編碼或burp中的url編碼,編碼出來會不一樣
所以最終的payload爲auth=wfz%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%008%00%00%00%00%00%00%00hacker;hsh=e9ce9ebaab0a671ec8edddda705a7dae
放在cookie中就可以了