關於METINFO5.3漏洞引發的變量覆蓋漏洞
一.$$引起的變量覆蓋漏洞,
1、Include 調用了flag.php文件(調用文件還可以有require_once()或者require());
2、$_200,$_403 定義兩個參數,以及參數值。
3、判斷訪問頁面的方法是否為post方法和有沒有參數flag。
4、再接著兩個foreach函數遍歷數組函數,然後再將獲取到的數組鍵名作為變量,數組中的鍵值作為變量的值。
5、還有一個if判斷語句,判斷用post方法傳輸的數據是不是和$flag的值相同,如果相同,輸出flag。
6、最後輸出$_200的內容。
我們可以看到第一個foreach遍歷中,
foreach ($_GET as $key => $value) $$key = $$value
這裏出現了$$key = $$value,傳入的鍵值$會當做變量,例如,我們傳入_200=flag,經過處理後變成$_200=$flag,則$_200的值被覆蓋為$flag的值。
第二個foreach遍歷,
foreach ($_POST as $key => $value) $$key = $value;
出現了$$key = $value;如post方法傳入flag=abc,則處理後變成$flag=abc。這樣就造成將我們需要獲取的flag的值給覆蓋掉了。
所以如果在CTF中獲得flag,我們需要先將$flag的值覆蓋$_200或$_403的值,然後輸出$_200或$_403。
二,Extract()函數引起的變量覆蓋漏洞
該函數使用鍵名當做變量名,鍵值當做變量值,如果有相同的變量名,則默認覆蓋原有的變量值。
1、文件將get方法傳輸進來的值通過extrace()函數處理。
2、通過兩個if語句分別判斷是否存在gift變量,和變量gift的值和變量content的值是否相等。變量content的值是通過讀取變量test的值獲取到的。如果兩個變量相等輸出flag。如果不相等,輸出錯誤。
$GET[‘test’]=’a’,處理後$test=a,覆蓋了原來的空,即$test="",此時只需$gift=a,可以實現$gift=$content;成功拿到flag。
三,Parse_str()函數引起的變量覆蓋漏洞
parse_str() 函數用於把查詢字符串解析到變量中,如果沒有array 參數,則由該函數設置的變量將覆蓋已存在的同名變量。 極度不建議 在沒有 array參數的情況下使用此函數,並且在 PHP 7.2 中將廢棄不設置參數的行為。此函數沒有返回值
<?php error_reporting(0); if (empty($_GET[‘id‘])) { show_source(__FILE__); die(); } else { include (‘flag.php’); $a = “www.OPENCTF.com $id = $_GET[‘id‘]; @parse_str($id); if ($a[0] != ‘QNKCDZO’ && md5($a[0]) == md5(‘QNKCDZO’)) { echo $flag; } else { exit(‘其實很簡單其實並不難!’); } } ?>
[email protected]_str($id)把查詢字符串解析到變量中,沒有使用array選項,若有同名變量,將原來的覆蓋。我們可以用?id=a[0]將原來的$a的值給覆蓋掉。
2.$a[0] != ‘QNKCDZO‘ && md5($a[0]) == md5(‘QNKCDZO‘)判斷$a[0]的值不是QNKCDZO並且$a[0]的MD5值要和QNKCDZO的MD5值相同。
因為主要介紹變量覆蓋,所以接下來的解題方法就不說了。核心思路就是用?id=a[0]=********覆蓋$a的值滿足後續要求。
學習自:https://www.cnblogs.com/bmjoker/p/9025351.html
關於METINFO5.3漏洞引發的變量覆蓋漏洞