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

一個網絡安全小白在學習過程中記錄下的筆記,希望在CSDN能和大家一起成長,學習,分享,進步,下面分享的是代碼審計中反序列化以及弱類型的案例,希望對入門網安的朋友們有所幫助,大神有興趣看看即可,勿噴感謝,同時也歡迎各位師傅私聊交流學習。文章有所參考,也感謝教授我網安知識的師父們,感謝出生在這個互聯網時代,知識觸手可及。
PHP代碼審計目錄
網絡安全自學篇-PHP代碼審計(一)
網絡安全自學篇-PHP代碼審計(二)
網絡安全自學篇-PHP代碼審計(三)
網絡安全自學篇-PHP代碼審計(四)
網絡安全自學篇-PHP代碼審計(五)
網絡安全自學篇-PHP代碼審計(六)
網絡安全自學篇-PHP代碼審計(七)
網絡安全自學篇-PHP代碼審計(八)

反序列化

原理:攻擊者通過控制類中魔術方法來進行各種攻擊,例如代碼注入、SQL注入、目錄遍歷等等。
挖掘思路:
反序列化函數的變量可控
存在可利用的類,類中有魔術方法
魔術方法:
__contruct()、__destruct()、__call()、__callstatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、__toString()、__invoke()、__set_state()、__clone()、__debugInfo()
案例:

$str = "2020";
$arr = array("2019","2020");
echo serialize($str)."\n";
echo serialize($arr)."\n";
class test {
    private $test1 = "private";
    protected  $test2 = "protected";
    public $test3 = "public";
}
echo serialize(new test());

輸出結果:
在這裏插入圖片描述

class A{
    var $a = 'test';
    function __destruct()
    {
        $fp = fopen("OK.php","w");
        fputs($fp,$this->a);
        fclose($fp);
    }
}
$obj = unserialize($_GET['s']);
require "D:\phpStudy\PHPTutorial\WWW\ok.php";

構造Payload:O:1:“A”:1:{s:1:“a”;s:18:“phpinfo();”;}
在這裏插入圖片描述訪問ok.php即可將<?php phpinfo();?>寫入ok.php

弱類型

字符串和數字之間的比較

var_dump(0 == "admin");
var_dump(0 == "0admin");
var_dump(1 == "admin1");
var_dump(0 == "admin1");

在這裏插入圖片描述
整數和數組、字符串和數組之間的比較

var_dump(0 == $arr);
$arr = array();
var_dump('0' == $arr);
var_dump("0e123" == "0e456");

在這裏插入圖片描述
empty和isset

$a = null;
$b = 0;
$c = '';
$d = false;
$e = array();
var_dump(empty($a));
var_dump(empty($b));
var_dump(empty($c));
var_dump(empty($d));
var_dump(empty($e));
var_dump(isset($a));
var_dump(isset($b));
var_dump(isset($c));
var_dump(isset($d));
var_dump(isset($e));

除了isset變量爲null時爲false其餘都爲true
在這裏插入圖片描述
md5函數

 md5 ( string $str [, bool $raw_output = FALSE ] ) : string
 //str原始字符串。raw_output如果可選的 raw_output 被設置爲 TRUE,那麼 MD5 報文摘要將以16字節長度的原始二進制格式返回。

$arr1 = array('1','2','3');
$arr2 = array('4','5','6');
var_dump(md5($arr1) == md5($arr2));

在這裏插入圖片描述
strcmp函數

 strcmp ( string $str1 , string $str2 ) : int
 //參數需都爲字符串

當參數使用數組時可相等

$key = "123456";
if(isset($_GET['key'])){
    if(strcmp($_GET['key'],$key) == 0){
        echo "same";
    }else{
        echo "no same";
    }
}

在這裏插入圖片描述
海底撈針in_array函數和array_search函數

 in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : bool
 //needle待搜索的值。Note:如果 needle 是字符串,則比較是區分大小寫的。haystack待搜索的數組。strict如果第三個參數 strict 的值爲 TRUE 則 in_array() 函數還會檢查 needle 的類型是否和 haystack 中的相同。
 array_search ( mixed $needle , array $haystack [, bool $strict = false ] ) : mixed
 //needle搜索的值。Note:如果 needle 是字符串,則比較以區分大小寫的方式進行。haystack這個數組。strict 如果可選的第三個參數 strict 爲 TRUE,則 array_search() 將在 haystack 中檢查完全相同的元素。 這意味着同樣嚴格比較 haystack 裏 needle 的 類型,並且對象需是同一個實例。

switch函數
switch函數只接受整型

$key = "1app";
switch ($key){
    case 1:echo "right";break;
    case 2:echo "error";break;
}

在這裏插入圖片描述

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