01 背景
?近日奇安信發(fā)布了 Thinkphp 6.0 “任意”文件創(chuàng)建漏洞安全風(fēng)險(xiǎn)通告,對(duì)此,DYSRC第一時(shí)間對(duì)該漏洞進(jìn)行了分析,并成功復(fù)現(xiàn)該漏洞。
漏洞影響范圍:top-think/framework 6.x
02 定位問(wèn)題
根據(jù)任意文件創(chuàng)建以及結(jié)合近期的commit歷史,可以推測(cè)出 1bbe75019 為此次問(wèn)題的補(bǔ)丁。可以看到在補(bǔ)丁中限制了Sessionid只能由字母和數(shù)字組成,由此看來(lái)問(wèn)題更加明顯。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
03 原理分析
先拋開(kāi)上面的問(wèn)題,我們看一下thinkphp是如何存儲(chǔ)session的。
系統(tǒng)定義了接口thinkcontractSessionHandlerInterface
SessionHandlerInterface::write方法在本地化會(huì)話數(shù)據(jù)的時(shí)候執(zhí)行,系統(tǒng)會(huì)在每次請(qǐng)求結(jié)束的時(shí)候自動(dòng)執(zhí)行。
再看看thinksessiondriverFile類是怎么實(shí)現(xiàn)的。
先通過(guò)getFileName根據(jù)$sessID生成文件名,再writeFile寫(xiě)入文件。
跟進(jìn)getFileName,直接將傳入的$sessID拼接后作為文件名。由于$sessID可控,所以文件名可控。
04 演示
分析到這里,整個(gè)漏洞流程基本上已經(jīng)很清晰了。下面給出本地的演示結(jié)果。
php中文網(wǎng),大量的免費(fèi)thinkphp入門(mén)教程,歡迎在線學(xué)習(xí)!