PHP中的變量覆蓋漏洞深入解析
1.extract()變量覆蓋
1.extract()
extract() 函數(shù)從數(shù)組中將變量導入到當前的符號表。
該函數(shù)使用數(shù)組鍵名作為變量名,使用數(shù)組鍵值作為變量值。針對數(shù)組中的每個元素,將在當前符號表中創(chuàng)建對應的一個變量。
該函數(shù)返回成功設置的變量數(shù)目。
extract(array,extract_rules,prefix)
參考引用:https://www.runoob.com/php/func-array-extract.html
eg:
<?php extract($_GET); echo $name.'<br>'; echo $age.'<br>'; echo $phone.'<br>'; //GET傳參:?name=xiaohua&age=22&phone=112323123 //結(jié)果: // xiaohua // 22 // 112323123 ?>
2.CTF中extract()導致的變量覆蓋
<?php $flag='flag.php'; extract($_GET); if(isset($ceshi)) { $content=trim(file_get_contents($flag)); if($ceshi==$content) { echo'flag{xxxxxxx}'; } else { echo'Oh.no'; } } ?>
我們大致分析是要求我們GET傳參進去值會經(jīng)過extract()函數(shù)下來會有兩個if 第一個if判斷 ceshi這個變量是否存在 存在則繼續(xù)執(zhí)行if里面的
使用file_get_contents()讀取flag變量里面的文件傳遞給content變量 之后再進行判斷傳進來ceshi變量的值等不等于$content如果等于則打印出flag!
這里我們構(gòu)造因為通過extract()函數(shù)我們傳進的值會變成一個變量 例如我們GET傳入 ceshi=1 則會存在$ceshi=1 所以我們構(gòu)造GET傳參pyaload:
GET傳參payload:$ceshi=&$flag=
這樣再程序中會有兩個為空的變量而$flag=空 則覆蓋了上面的$flag中的值 這樣進行判斷 都是空的所以為真則得到flag
3.漏洞修復
不要使用。。。。
參考 官方文檔 修改extract_rules 里面的值為EXTR_SKIP eg:
extract($_GET,EXTR_SKIP);
2.PHP動態(tài)變量覆蓋
1.動態(tài)變量覆蓋
PHP動態(tài)變量是指一個變量名的變量名可以動態(tài)的設置和使用,一個變量獲取另一個變量的值作為這個變量的變量名。
<?php $bar= "a"; $Foo="Bar"; $World="Foo"; $Hello="world"; $a="Hello"; echo $a; //hello echo $$a; //world echo $$$a; //foo echo $$$$$a; //Bar echo $$$$$$a; //a echo $$$$$$$a; //hello echo $$$$$$$$a; //world ?>
CTF中的動態(tài)變量覆蓋
https://www.cnblogs.com/xhds/p/12586928.html CTF中的動態(tài)變量覆蓋
3.漏洞修復
避免使用這個
3.parse_str()變量覆蓋
1.parse_str()
parse_str() 函數(shù)把查詢字符串解析到變量中。
注釋:如果未設置 array 參數(shù),由該函數(shù)設置的變量將覆蓋已存在的同名變量。
注釋:php.ini 文件中的 magic_quotes_gpc 設置影響該函數(shù)的輸出。如果已啟用,那么在 parse_str() 解析之前,變量會被 addslashes() 轉(zhuǎn)換。
parse_str(string,array)
參考引用:https://www.runoob.com/php/func-string-parse-str.html
eg:
<?php parse_str("name=xiaohua&age=22"); echo $name."<br>"; echo $age; ?> //xiaohua //22
2.CTF中parse_str()導致的變量覆蓋
<?php error_reporting(0); $flag="flag{xiaohua-2020}"; if (empty($_GET['id'])) { show_source(__FILE__); die(); } else { $a = "www.xiaohua.com"; $id = $_GET['id']; @parse_str($id); // if ($a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')) { echo $flag; } else { exit("no no"); } } ?>
分析代碼 判斷GET傳入的id值是否為空為空的話輸出源碼終止程序,否則的話則接收id值 經(jīng)過parse_str() 然后呢if判斷 $a[0] 的值要不等于QNKCDZO
但$a[0]的md5值要等于QNKCDZO這里可以采用Hash比較缺陷來解決這一步 下來就是傳入變量覆蓋$a[0]的值 因為有parse_str所以我們可以構(gòu)造payload:
payload:http://127.0.0.1/test.php?id=a[0]=s878926199a
3.漏洞修復
為了防止變量覆蓋,盡量使用指定輸出變量方式
4.import_request_variables()變量覆蓋
1.import_request_variables()
(PHP 4 >= 4.1.0, PHP 5 < 5.4.0)
import_request_variables—將 GET/POST/Cookie 變量導入到全局作用域中
將 GET/POST/Cookie 變量導入到全局作用域中。如果你禁止了register_globals,但又想用到一些全局變量,那么此函數(shù)就很有用。
import_request_variables ( string $types [, string $prefix ] ) : bool
參考引用:https://www.php.net/manual/zh/function.import-request-variables.php
2.CTF中import_request_variables()導致的變量覆蓋
<?php $num=0; //include 'flag.php'; import_request_variables('gp'); //導入get和post中變量 if($num=="xiaohua"){ echo 'flag{ xiaohua-2020-3-28}'; // echo $flag.php; }else{ echo "NO!"; } ?> //payload:http://127.0.0.1/test.php?num=xiaohua //flag{ xiaohua-2020-3-28}
3.漏洞修復
盡量不要使用....
5.PHP全局變量覆蓋
1.register_globals
當register_globals全局變量設置開啟時,傳遞過來的值會被直接注冊為全局變量而使用,這會造成全局變量覆蓋
在PHP5.3之前 默認開啟 PHP5.3默認關(guān)閉 PHP5.6及5.7已經(jīng)被移除
2.CTF中全局變量覆蓋
測試環(huán)境:php5.2.17
<?php if ($num){ echo "flag{xiaohua-2020-3-28}"; } ?> //payload:http://127.0.0.1/test.php?num=1 //flag{xiaohua-2020-3-28}
3.漏洞修復
關(guān)閉register_globals=off 或者使用5.6以上版本。。
到此這篇關(guān)于PHP中的變量覆蓋漏洞深入解析的文章就介紹到這了,更多相關(guān)PHP中的變量覆蓋漏洞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php使用curl發(fā)送json格式數(shù)據(jù)實例
這篇文章主要介紹了php使用curl發(fā)送json格式數(shù)據(jù)的實例,大家參考使用吧2013-12-12使用ob系列函數(shù)實現(xiàn)PHP網(wǎng)站頁面靜態(tài)化
php頁面緩存主要用到的是ob系列函數(shù),如ob_start(),ob_end_flush(),ob_get_contents() ,今天我們來談談使用這些函數(shù)來實現(xiàn)php網(wǎng)站頁面靜態(tài)化2014-08-08laravel-admin 添加、編輯按鈕支持攜帶參數(shù)的解決方法
通過修改源碼實現(xiàn)laravel-admin添加、編輯按鈕支持攜帶參數(shù),解決一些特殊功能需求,并且不影響之前添加和編輯程序運行,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2023-11-11Laravel Validator自定義錯誤返回提示消息并在前端展示
這篇文章主要給大家介紹了關(guān)于Laravel Validator自定義錯誤返回提示消息并在前端展示的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Laravel具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-05-05Laravel5.1 框架關(guān)聯(lián)模型之后操作實例分析
這篇文章主要介紹了Laravel5.1 框架關(guān)聯(lián)模型之后操作,結(jié)合實例形式分析了laravel5.1框架寫入關(guān)聯(lián)模型、更新關(guān)聯(lián)關(guān)系等相關(guān)操作技巧與注意事項,需要的朋友可以參考下2020-01-01laravel使用組件實現(xiàn)微信網(wǎng)頁授權(quán)登入
這篇文章主要介紹了laravel使用組件實現(xiàn)微信網(wǎng)頁授權(quán)登入,使用laravel組件 laravel-wechat調(diào)用,使用起來很方便,有需要的同學可以學習下2021-03-03