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




利用過程
這里以phpcms為例, 首先需要找一個(gè)圖形驗(yàn)證碼。

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

將鏈接拖出來咱們分析一下:
- 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是驗(yàn)證碼的字符的個(gè)數(shù)
- font_size=20是驗(yàn)證碼的大小
- width=130是驗(yàn)證碼的寬
- height=50是驗(yàn)證碼的高
如果將參數(shù) font_size、 width、 height均設(shè)置為1000將會出現(xiàn)什么情況呢?

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

當(dāng)設(shè)置為10000時(shí):

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

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

當(dāng)我們啟動python程序的時(shí)候CPU的占用率:

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

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