Insecure CAPTCHA(不安全的驗證碼)

Insecure CAPTCHA

前言

這裏我覺得主要是要理解谷歌驗證碼這個流程,因爲這是一個邏輯漏洞,要是換成別的驗證方式,這次的漏洞也就不一定有效了,主要還是理解這個驗證碼的一個流程吧
1
我在別人的博客看到了這張圖,我也是通過這張圖來理解這個驗證流程的。下面簡單說下我的理解

首先用戶訪問網頁,觸發頁面的驗證碼的js模塊,向谷歌服務器發起請求,谷歌服務器將驗證碼發給用戶。用戶輸入驗證碼發送數據回去,這裏發給的是訪問網站的服務器,網站的服務器拿到驗證碼後,再去訪問谷歌的服務器,谷歌的服務器會判斷驗證碼是否正確,再將結果返回給網站服務器。

這裏服務器會用到recaptcha_check_answer函數

參數privkeyprivatekeyprivkey是服務器申請的private key ,remoteip是用戶的ip,challengerecaptchachallengefieldchallenge 是recaptcha_challenge_field 字段的值,來自前端頁面 ,response是 recaptcha_response_field 字段的值。函數返回ReCaptchaResponse class的實例,ReCaptchaResponse 類有2個屬性 :

$is_valid是布爾型的,表示校驗是否有效,

$error是返回的錯誤代碼。

然後這裏再說下dvwa這裏的配置,點進dvwa的靶場,可以看到需要配置
2
就像我們上面說到的recaptcha_check_answer函數需要我們提供privkey

點擊下面的鏈接,就會跳轉到谷歌的登錄頁面,這裏我就不去登錄申請key了,我自己用docker搭的靶場設的是個內網環境,不想再去配了,最主要我看別人的博客說申請好像也存在問題,最最主要它不影響我們的去實驗,但不能體驗到它正常操作的一個流程,我感覺對挖掘它的漏洞是增加了難度的
3
這裏我們登錄dvwa的後臺,按照它提示找到相應的路徑下的文件,然後找到如下圖所示的兩個key,隨意的輸入些值保存
4
這時候我們再去訪問網頁,可以看到驗證碼雖然沒法顯示(畢竟我們是瞎填的而且也訪問不了外網…),但是能正常使用了
5

練習

Low

這裏我們還是直接來看代碼
6
7
我也不怎麼會php,但它主要有兩個if函數,將整體分成了兩部分,大概就是第一部分檢查驗證碼返回表單,第二部分接受用戶的表單再來進行修改

這裏很明顯我們直接跳過一個if判斷就能繞過驗證碼了
8
可以抓包看到提交的數據裏面有一個step數據,這裏我們直接將其改爲2,就能繞過驗證階段了
9
可以看到密碼被成功修改了
10
當我不改數據直接訪問的時候就會如上圖所示,因爲這裏訪問不了谷歌的服務器所以會報上面的錯誤。

這裏沒有一個完整體驗還是感覺欠缺了點什麼,不能抓包分析一下正常的一個流程

這裏在實際應用中還可以集合CSRF來進行,特別是這種修改密碼的不說要輸入以前的密碼,至少得要cookie吧,所以可以結合CSRF來進行攻擊。我看了下別人的博客,這裏用csrf進行攻擊時會有重定向,返回密碼修改成功的頁面…這個讓被攻擊者會意識到遭到了攻擊

下面是別人做的簡單的csrf攻擊頁面,詳見參考1

<input type=“hidden” name=“step” value=“2”

Medium

這裏midium級別還是進行了分步的判斷了,但可以看到下圖,它多了一個判斷
11
這其實就沒什麼意思了,和Low級別大同小異了,只是多改一個值
12
可以看到上圖我將step改成了2,並在末尾加上了它需要的檢查的值且賦值爲true

然後我們就成功的修改了密碼,繞過了驗證碼

CSRF和Low級別的利用沒什麼差別

High

High級別還是做了些改動,首先已經不是兩個if的判斷了,可以看下圖
13
這裏的resp就是谷歌服務器返回的數據,沒有課操作空間,但是它判斷驗證是否失敗是用的

if ( $resp || ( $_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3' && $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA' ) )

這樣一句話要判斷爲true纔會說驗證失敗,前面!resp爲true,但它用的&&來連接…所以我們只要保證後面爲false就能繞過了…搞不懂用&&是什麼鬼邏輯…

這就很好搞了啊,

屬性g-recaptcha-response 的值不能是hidd3n_valu3 並且請求頭部的 HTTP_USER_AGENT 不能是 reCAPTCHA就會判斷爲false…
14
如上圖把USER_AGENT 改爲reCAPTCHA,然後在post裏添加&g-recaptcha-response=hidd3n_valu3

ok,這樣就能發現成功的修改了密碼

Impossible

這裏沒有分成兩部分了,然後對谷歌服務器的返回值進行單獨的校驗,這樣就修補了邏輯漏洞,而且還要求輸入以前的密碼(csrf基本over)
15
當然這裏還加入了Anti-CSRF token 機制防禦CSRF攻擊,和PDO技術防護sql注入

總結

這裏的不安全驗證碼,我認爲在現實中應該很難碰到?但是我覺得這裏主要是想讓我們體驗什麼是邏輯漏洞吧,特別是high級別中&&這些符號可能搞混而且還不會影響程序的運行,這樣的邏輯漏洞可能存在的機率就會比較高。

這裏把dvwa以前的十個模塊的內容就搞定了,還剩3個新出的模塊了,提前撒花✿✿ヽ(°▽°)ノ✿

參考

  1. 新手指南:DVWA-1.9全級別教程之Insecure CAPTCHA
  2. DVWA 黑客攻防演練(六)不安全的驗證碼 Insecure CAPTCHA
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章