一個網絡安全小白在學習過程中記錄下的筆記,希望在CSDN能和大家一起成長,學習,分享,進步,下面分享的是代碼審計中變量覆蓋的案例,希望對入門網安的朋友們有所幫助,大神有興趣看看即可,勿噴感謝,同時也歡迎各位師傅私聊交流學習。文章有所參考,也感謝教授我網安知識的師父們,感謝出生在這個互聯網時代,知識觸手可及。
變量覆蓋
原理:攻擊者使用自定義的參數去替換應用程序未經過初始化的變量值。
挖掘思路:
文件上傳頁面覆蓋白名單列表
用戶註冊頁面覆蓋未初始化的變量導致SQL注入
相關函數:
extract、import_request_variables、parse_str、$$
案例:
1、extract函數
extract ( array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL ]] ) : int
// array一個關聯數組。此函數會將鍵名當作變量名,值作爲變量的值。 對每個鍵/值對都會在當前的符號表中建立變量,並受到 flags 和 prefix 參數的影響。 EXTR_OVERWRITE,如果有衝突,覆蓋已有的變量。 prefix附加前綴。第二個參數有三種情況會產生變量覆蓋:
//1、 EXTR_OVERWRITE 如果有衝突,覆蓋已有的變量。
//2、 EXTR_PREFIX_SAME 如果有衝突,在變量名前加上前綴 prefix。
//3、 EXTR_IF_EXISTS 僅在當前符號表中已有同名變量時,覆蓋它們的值。
EXTR_OVERWRITE:
<?php
//EXTR_OVERWRITE
//EXTR_PREFIX_SAME
//EXTR_IF_EXISTS
$uid = 'ae';
$arr = array(
'username' => 'admin',
'password' => '123456',
'uid' => 'pr'
);
extract($arr,EXTR_OVERWRITE);
echo "EXTR_OVERWRITE:";
echo "$username,$password,$uid";
EXTR_PREFIX_SAME:
$uid = 'ae';
$arr = array(
'username' => 'admin',
'password' => '123456',
'uid' => 'pr'
);
extract($arr,EXTR_PREFIX_SAME,"ae");
echo "EXTR_PREFIX_SAME:";
echo "$username,$password,$uid";
echo ",".$ae_uid;
EXTR_IF_EXISTS:
$uid = 'ae';
$arr = array(
'username' => 'admin',
'password' => '123456',
'uid' => 'pr'
);
extract($arr,EXTR_OVERWRITE);
echo "EXTR_IF_EXISTS:";
echo "$username,$password,$uid";
2、import_request_variables函數(PHP<5.4)
import_request_variables ( string $types [, string $prefix ] ) : bool
//types 參數指定需要導入的變量。可以用字母‘G’、‘P’和‘C’分別表示 GET、POST 和 Cookie。這些字母不區分大小寫,所以你可以使用‘g’、‘p’和‘c’的任何組合。POST 包含了通過 POST 方法上傳的文件信息。注意這些字母的順序,當使用“gp”時,POST 變量將使用相同的名字覆蓋 GET 變量。任何 GPC 以外的字母都將被忽略。 prefix 參數作爲變量名的前綴,置於所有被導入到全局作用域的變量之前。所以如果你有個名爲“userid”的 GET 變量,同時提供了“pref_”作爲前綴,那麼你將獲得一個名爲 $pref_userid 的全局變量。
$uid = 'ae';
import_request_variables('G');
if($uid == 'ae') {
echo "OK";
}else{
echo "NO";
}
3、parse_str函數
parse_str ( string $encoded_string [, array &$result ] ) : void
// encoded_string輸入的字符串。result如果設置了第二個變量 result, 變量將會以數組元素的形式存入到這個數組,作爲替代。
$uid = 'ae';
parse_str($uid = 'pr');
echo $uid;
4、$$
$a = 1;
foreach(array('_COOKIE','_POST','_GET') as $_request) {
foreach ($$_request as $key=>$value){
$$key = addslashes($value);
}
}
echo $a;
變量a可被傳入的參數覆蓋
漏洞防範:
1、php.ini中register_globals = OFF
2、使用原始變量數組,入_GET等
3、不使用foreach變量$_GET變量
4、判斷變量是否註冊