網絡安全自學篇-PHP代碼審計(八)

一個網絡安全小白在學習過程中記錄下的筆記,希望在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、使用原始變量數組,入POST_POST、_GET等
3、不使用foreach變量$_GET變量
4、判斷變量是否註冊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章