PHP中get_headers函數
在PHP開發中,我們經常需要獲取HTTP請求中發送的服務器信息,本文通過一個簡單的PHP示例介紹了通過get_headers函數獲取服務器的相關信息。
get_headers() 是PHP系統級函數,他返回一個包含有服務器響應一個 HTTP 請求所發送的標頭的數組。 如果失敗則返回 FALSE 併發出一條 E_WARNING 級別的錯誤信息(可用來判斷遠程文件是否存在)。
array get_headers ( string $url [, int $format = 0 ] )
url 目標 URL
示例
<?php
$url='http://www.phpernote.com';
print_r(get_headers($url));
print_r(get_headers($url,1));
?>
以上例程的輸出類似於:
Array(
[0] => HTTP/1.1 200 OK
[1] => Date: Sat, 29 May 2004 12:28:13 GMT
[2] => Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
[3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
[4] => ETag: "3f80f-1b6-3e1cb03b"
[5] => Accept-Ranges: bytes
[6] => Content-Length: 438
[7] => Connection: close
[8] => Content-Type: text/html
)Array(
[0] => HTTP/1.1 200 OK
[Date] => Sat, 29 May 2004 12:28:14 GMT
[Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux)
[Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
[ETag] => "3f80f-1b6-3e1cb03b"
[Accept-Ranges] => bytes
[Content-Length] => 438
[Connection] => close
[Content-Type] => text/html
)
CVE-2020-7066
PHP 7.2.29之前的7.2.x版本、7.3.16之前的7.3.x版本和7.4.4之前的7.4.x版本中的‘get_headers()
’函數存在安全漏洞。攻擊者可利用該漏洞造成信息泄露。
描述
在低於7.2.29的PHP版本7.2.x,低於7.3.16的7.3.x和低於7.4.4的7.4.x中,將get_headers()與用戶提供的URL一起使用時,如果URL包含零(\ 0)字符,則URL將被靜默地截斷。這可能會導致某些軟件對get_headers()的目標做出錯誤的假設,並可能將某些信息發送到錯誤的服務器。
測試腳本:
<?php
//⽤戶輸⼊
$_GET['url'] =" http:// localhost \ 0.example.com ";
$host = parse_url($_GET['url'], PHP_URL_HOST); // 解析URL並返回其組成部分
if(substr($host, -12) !=='.example.com'){
die();
}
$headers = get_headers($_GET['url']);
var_dump($headers); 預期結果:
?>
[GKCTF2020]cve版簽到
給出提示說是CVE-2020-7066
打開題目:
這裏F12可以再network裏面看到提示
點擊View CTFHub之後發現多了URL多了個url?=
注意到了url,這不就是ssrf的標誌嗎???!!!
這裏是一個ssrf,思路應該是構造ssrf讓服務器去請求自己獲得flag。但是這裏利用正則表達式讓我們請求的url只能以.ctfhub.com結尾。
這裏就運用到的我們的CVE了,其實就是get_header()的CVE。這個函數特點就是會去請求url並返回header頭部。但是CVE告訴我們,如果是用%00截斷,就可能讓命令去請求用戶的可控網址。
構造payload:/?url=http://127.0.0.1%00.ctfhub.com
又說host必須以123結尾,構造:/?url=http://127.0.0.123%00.ctfhub.com
得到flag。