1、打開靶機鏈接http://61.147.171.105:49513/,沒有發現任何線索
2、嘗試訪問http://61.147.171.105:49513/index.php,頁面沒有發生跳轉
3、嘗試將訪問?嘗試訪問http://61.147.171.105:49513/index.phps
index.php
和index.phps
文件之間的主要區別在于它們的文件擴展名。
index.php: 這是一個標準的 PHP 文件,通常用于編寫 PHP 代碼。當用戶訪問
index.php
文件時,Web 服務器會解釋其中的 PHP 代碼,并將結果發送給用戶的瀏覽器。PHP 文件可以包含 HTML、CSS、JavaScript 以及服務器端的 PHP 代碼。index.phps: 這個文件名可能是由開發人員自定義的,它的擴展名
.phps
是一種特殊的命名約定,通常用于顯示 PHP 源代碼而不是執行它。如果用戶訪問index.phps
文件,Web 服務器通常會直接將文件內容發送給瀏覽器,而不會解釋其中的 PHP 代碼。這對于演示和學習目的可能會有用,但不建議在生產環境中使用這種方式,因為它會暴露服務器端的代碼。總之,
index.php
是一個標準的 PHP 文件,用于執行 PHP 代碼,而index.phps
可能用于顯示 PHP 源代碼。
<?php
if("admin"===$_GET[id]) {echo("<p>not allowed!</p>");exit();
}$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{echo "<p>Access granted!</p>";echo "<p>Key: xxxxxxx </p>";
}
?>
補充知識:
1、urldecode為解碼和urlencode為編碼
2、$_GET本身自帶一次urldecode解碼,即瀏覽器對url本身有一個檢測,對于輸入的中文、日文、俄文、和一些特殊字符進行解碼,對于字母、數字等合法字符不會進行解碼。?
3、urldecode()函數為php解碼? ? ? ? ? ??
4、所以我們如給直接給參數傳參admin會杯第一個if過濾掉。又考慮由于瀏覽器會對GET參數進行一次
URL解碼,加上PHP源碼中的urldecode($_GET[id])有對可變參數進行一次解碼,總共會給參數進行2次解碼。考慮先將參數admin先進行編碼兩次
對于字母a進行urldecode編碼之后為%61,在對%進行urldecode編碼之后為%2561
所以參數輸入id=%2561dmin,這樣的話瀏覽器先對參數編碼一次為%61dmin,然后參數傳入PHP服務器后為%61dmin,所以代碼中的第一個if判斷結果為false如下:
"admin"===$_GET[%2561dmin]===(全等運算符):=== 運算符執行嚴格比較,它不會進行類型轉換。
只有在兩個操作數的值相等且類型也相同時,=== 運算符才返回 true,否則返回 false。
在嚴格比較中,值和類型都必須相同才會被視為相等。例如:var_dump(1 === "1"); // 輸出 bool(false)
然后$_GET[id] = urldecode($_GET[id])中urldecode再一次編碼為了admin,跳到第二個if函數執行判斷為true,獲取flag
$_GET[%61dmin] == "admin"==(相等運算符):== 運算符執行松散比較,它會在比較之前嘗試將操作數轉換為相同的類型。
如果兩個操作數的值相等,那么 == 運算符返回 true,否則返回 false。
在松散比較中,類型不同的值可能會被視為相等。
例如,字符串 "1" 和整數 1 在使用 == 運算符比較時會被視為相等。var_dump(1 == "1"); // 輸出 bool(true)
總結:
1、嘗試在url后面+inedx.php或index.phps,看頁面變化
2、瀏覽器會對用戶傳入的參數進行urldecode解碼,只會進行一次,并且直接將解碼后的參數傳給服務器php源碼中
3、”==“ 是相等運算符,比較值相等,不比較類型;"===" 是全等運算符,值與類型都比較
4、urldecode為解碼,urlencode為編碼
5、參考:URL特殊字符編碼對照表_bce6b8a5e6598e8-CSDN博客