打開題目
題目源碼:
<?php$function = @$_GET['f'];function filter($img){$filter_arr = array('php','flag','php5','php4','fl1g');$filter = '/'.implode('|',$filter_arr).'/i';return preg_replace($filter,'',$img);
}if($_SESSION){unset($_SESSION);
}$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;extract($_POST);if(!$function){echo '<a href="index.php?f=highlight_file">source_code</a>';
}if(!$_GET['img_path']){$_SESSION['img'] = base64_encode('guest_img.png');
}else{$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}$serialize_info = filter(serialize($_SESSION));if($function == 'highlight_file'){highlight_file('index.php');
}else if($function == 'phpinfo'){eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){$userinfo = unserialize($serialize_info);echo file_get_contents(base64_decode($userinfo['img']));
}
我們簡單代碼審計一下
$function = @$_GET['f'];? //從 GET 請求中獲取名為 'f' 的參數,并賦值給
$function
變量。使用@
符號來抑制可能的未定義變量警告,function filter($img){?? //定義了一個名為
filter
的函數,接受一個參數$img
。
??? $filter_arr = array('php','flag','php5','php4','fl1g');? //$filter_arr
數組包含了需要過濾掉的關鍵詞列表,如 'php', 'flag', 'php5', 'php4', 'fl1g'。
??? $filter = '/'.implode('|',$filter_arr).'/i';
??? return preg_replace($filter,'',$img);
知識點:
implode函數
implode() 函數,把數組元素組合為字符串。
語法
implode(separator,array)
參數 | 描述 |
---|---|
separator | 可選。規定數組元素之間放置的內容。默認是 ""(空字符串)。 |
array | 必需。要組合為字符串的數組。 |
例子:
<?php
$arr = array('Hello','World!','I','love','Shanghai!');
echo implode(" ",$arr);
?>
運行結果為:
Hello World! I love Shanghai!
extract函數
定義和用法
extract() 函數從數組中將變量導入到當前的符號表。
該函數使用數組鍵名作為變量名,使用數組鍵值作為變量值。針對數組中的每個元素,將在當前符號表中創建對應的一個變量。
第二個參數 type 用于指定當某個變量已經存在,而數組中又有同名元素時,extract() 函數如何對待這樣的沖突。
該函數返回成功導入到符號表中的變量數目。
語法
extract(array,extract_rules,prefix)
參數 | 描述 |
---|---|
array | 必需。規定要使用的數組。 |
extract_rules | 可選。extract() 函數將檢查每個鍵名是否為合法的變量名,同時也檢查和符號表中已存在的變量名是否沖突。對不合法和沖突的鍵名的處理將根據此參數決定。 可能的值:
|
prefix | 可選。請注意 prefix 僅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 時需要。如果附加了前綴后的結果不是合法的變量名,將不會導入到符號表中。 前綴和數組鍵名之間會自動加上一個下劃線 |
參考下面這個實例就能很清楚看明白如果變量有沖突,該怎么設置
實例
<?php
$a = "Original";
$my_array = array("a" => "Cat", "b" => "Dog", "c" => "Horse");extract($my_array, EXTR_PREFIX_SAME, "dup");echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a";
?>
運行結果為:$a = Original; $b = Dog; $c = Horse; $dup_a = Cat
知識點的參考文章:
PHP extract() 函數
PHP implode() 函數