你知道嗎?圖形驗證碼可能導致服務器崩潰
前言
圖片驗證碼是為了防止惡意破解密碼、刷票、論壇灌水等才出現(xiàn)的,但是你有沒有想過,你的圖形驗證碼竟然可能導致服務器的崩潰?
那他是如何導致的呢?請聽我婉婉道來。
先看看各大平臺對待此漏洞的態(tài)度:




利用過程
這里以phpcms為例, 首先需要找一個圖形驗證碼。

將圖片拖動到瀏覽器中將得到該圖形驗證碼的鏈接:

將鏈接拖出來咱們分析一下:
- http://127.0.0.1/phpcms/api.php?op=checkcode&code_len=4&font_size=20&width=130&height=50&font_color=&background=
- code_len=4是驗證碼的字符的個數(shù)
- font_size=20是驗證碼的大小
- width=130是驗證碼的寬
- height=50是驗證碼的高
如果將參數(shù) font_size、 width、 height均設置為1000將會出現(xiàn)什么情況呢?

可以發(fā)現(xiàn)驗證碼的形狀已經(jīng)改變,證明這個參數(shù)是會隨著我們的更改而更改的,而且在改成1000時,整個頁面的加載速度明顯變慢,大家請想,如果都改為10000甚至更高會發(fā)生什么事情? 服務器會不會一直在處理我們所請求的圖片?
此時我們上神器burp來檢驗一下
當設置為1000時:

當設置為10000時:

處理所用的時間明顯增長,我們再看看在發(fā)起這個請求時CPU有什么反應:

CPU有一個明顯的峰值,那當我們使用python去不斷進行請求的時候又會發(fā)生什么?這個是正常情況下的CPU占用率:

當我們啟動python程序的時候CPU的占用率:

可見,我們請求的驗證碼對服務器產(chǎn)生了重大的影響。
代碼分析
根據(jù)請求包我們跟進到 \api\checkcode.php:

在第12行和第17行可以看到,僅僅將驗證碼的長寬通過get方式接受,沒有任何其他的過濾,在第13行和第18行也僅僅只對最小值進行了限制,并沒有對***值進行限制,所以就造成了這個驗證碼的漏洞。
總結(jié)一下這個漏洞的利用點:
- 圖片長寬等可控
- 后端沒有對圖片的***大小進行限制
解決方案
- 對接受的參數(shù)進行***值的控制,或者固定值處理
- 使用固定大小的驗證碼