网络安全自学篇-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函数

扫描二维码关注公众号,回复: 11348774 查看本文章
 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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44047795/article/details/106650174