題目地址:http://www.shiyanbar.com/ctf/54php
題目:web
<?php if(eregi("hackerDJ",$_GET[id])) { echo("<p>not allowed!</p>"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "hackerDJ") { echo "<p>Access granted!</p>"; echo "<p>flag: *****************} </p>"; } ?> <br><br> Can you authenticate to this website?
PHP 函數 eregi() 語法 int eregi(string pattern, string string, [array regs]); 定義和用法 eregi()函數在一個字符串搜索指定的模式的字符串。搜索不區分大小寫。Eregi()能夠特別有用的檢查有效性字符串,如密碼。 可選的輸入參數規則包含一個數組的全部匹配表達式,他們被正則表達式的括號分組。 返回值 若是匹配成功返回true,不然,則返回false Example 下面是一段代碼,這段代碼複製並粘貼到一個文件中並驗證結果。 <?php $password = "abc"; if (! eregi ("[[:alnum:]]{8,10}", $password)) { print "Invalid password! Passwords must be from 8 - 10 chars"; } else { print "Valid password"; } ?> 這將會產生如下結果: Invalid password! Passwords must be from 8 - 10 chars
解題思路:正則表達式
id變量是一個url解碼函數前不包含hackerDJ,url解碼函數後爲hackerDJ的變量,即id在進入url解碼函數前必須是hackerDJ的url編碼形式數組
注意:瀏覽器
id經過url形式傳遞,瀏覽器會自動url解碼一次,直接函數
?id=%68%61%63%6B%65%72%44%4A
是不行的this
這樣瀏覽器自動解碼後即爲hackerDJ,被eregi()攔住編碼
因此要進行二次編碼,即對%68%61%63%6B%65%72%44%4A進行url編碼url