攻防世界-easyphp(前导数字字符串、数字字符串、数字弱类型比较)
一道php代码审计题,利用了字符与数字弱类型比较的漏洞。

一、基础知识
- 数字字符串
形如数字形式的字符串叫做数字字符串,例如:'123456','1e56112'(科学计数法),'123.4'(单纯的数字,没有其他字符,只是数据类型为字符串);数字字符串在与数字或者数字字符串进行比较时会转化为数字来进行比较。
- 前导数字字符串
前导数字字符串就是,前缀部分为数字字符,后接其他字符的字符串,例如:'123456abcde','1e456789abcde','123.4aaa'(注意必须是前缀部分为数字字符,例如:'aa123456bcd'就不是前导数字字符串)。前导数字字符串在进行弱类型比较时,只有在与数字进行比较时,才会转化为数字,即使是两个前导数字字符串进行弱类型比较也不会转化为数字。
- 其余字符串
对于既不是数字字符串也不是前导数字字符串的字符串,只会在与数字进行弱类型比较时转化为数字,且只能转化为0。
- is_numberic()函数
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。
- 字符串与数字弱类型比较测试结果


总结下来就是,数字与字符串进行弱类型比较时,会将字符串转化为数字。当字符串为数字字符串或者前导数字字符串时,会转化为相应数值的数字,当为普通字符串时会转化为0(数字0);字符串与字符串的比较规则为从左往右将字符进行比较,若要相等则所有字符得相等,若要比较大小,以第一个不相等的字符比较结果作为字符串大小结果。另外true和任何比较都能满足。

但特殊的是需要注意数字字符串与数字字符串之间的比较是转化为数字进行比较!
- 弱类型比较的函数与比较符
=,==,<,>,array_search,in_array, 后续遇到会添加上来,或是有知道的小伙伴,欢迎在评论区分享
二、分析代码
从下往上分析,易知当$key1和$key2的值都为真时会输出flag。
先看$key1,在第一个if里面,通过GET上传a和b的值来使$key1=1,要求的条件为:a是长度为3的整数,且a要大于6000000以及b的MD5加密值的后六位为8b184b。
对于a的构造,我们可以用科学计数表示法来令a=6e9使其满足条件
对于b的构造,我们可以使用脚本,爆破得出b的值b=53724


所以可以先构造payload为 ?a=1e9&b=53724
接着是$key2,$key2是通过上传json形式的c来实现控制。
c要满足的条件为:为json数据格式,是数组,至少含有键名为m,n的两个键值对
键m对应的值要满足:is_numeric()函数判定为假,且与2022进行>比较时要为真。
由于is_numberic会将数字和数字字符串判定为真,但前导数字字符串不会以及>是弱类型比较,且是将c['m']的值与数字进行比较,所以,我们可以直接用前导字符串来作为比较数字与2022进行比较。所以令c['m']='2023a'
键n对应的值要满足:有且仅有两个元素的数组,第一个值为数组,此处易于实现;第二个值要满足array_search("DGGJ", $c["n"])返回为真,同时c["n"]中又不能出现"DGGJ"。此处利用array_search函数在比较两者是否相等时是使用的弱类型比较。又由于"DGGJ"是既非数字字符串又非先导数字字符串的字符串,其在与数字进行比较时会转化为数字0。从而令c['n']的第二个值为0。(一点思考:此处若不是'DGGJ'而是其他字符串时,我们应该视情况而定,选择合适的数字)所以令c['n']=(array(1,2),0)
综上可以令c=array('m'=>'2023a','n'=>array(array(1,2),0)),然后再json_encode一下


构造payload为c={"m":"2023a","n":[[1,2],0]}
最后构造payload为?a=1e9&b=53724&c={"m":"2023a","n":[[1,2],0]}
返回结果为

flag为You're right cyberpeace{70fd15cef40f0516bc2fe7cef5484ff0}
趁热打铁,可以试试这道题


攻防世界-easyphp(前导数字字符串、数字字符串、数字弱类型比较)的更多相关文章
- 攻防世界(XCTF)WEB(进阶区)write up(一)
cat ics-05 ics-06 lottery Cat XCTF 4th-WHCTF-2017 输入域名 输入普通域名无果 输入127.0.0.1返回了ping码的结果 有可能是命令执行 ...
- js 字符串转换成数字的三种方法
在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形 ...
- js 字符串转换成数字(转)
转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行:对其他类型返回的 ...
- js字符串转成数字的三种方法
js读取的html代码中获得的值 ,统统是以字符串的形式呈现的,为了方便我们后面对数据的操作,有时候我们有必要进行转换一下. 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转 ...
- js 字符串转化成数字
方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有 ...
- js 字符串转化成数字:(实例:用正则检测大于0的正数,最多保留4位小数)
来源:http://www.cnblogs.com/hwx0807/archive/2011/06/28/2092021.html 实例: function BindSubmitEvent() { / ...
- JavaScript字符串转换成数字的三种方法
在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形 ...
- JavaScript进阶(四)js字符串转换成数字的三种方法
js字符串转换成数字的三种方法 在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b. ...
- js字符串转换成数字与数字转换成字符串的实现方法
转载:点击查看地址 js字符串转换成数字 将字符串转换成数字,得用到parseInt函数.parseInt(string) : 函数从string的开始解析,返回一个整数. 举例:parseInt(' ...
- js字符串转换成数字,数字转换成字符串
转自网络,忘记出处了. js字符串转换成数字 将字符串转换成数字,得用到parseInt函数. parseInt(string) : 函数从string的开始解析,返回一个整数. 举例:parseIn ...
随机推荐
- .net webapi+jwt demo
一.新建.net webapi程序 二.nuget包搜索jwt,点击安装 三.在model文件夹下建立三个主要类: public class AuthInfo { /// &l ...
- CKeditor页面公式不显示
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax. ...
- SSM框架学习-AOP学习笔记
一.AOP入门简介 AOP(Aspect Oriented Programming)面向切面编程,是一种编程范式,可以知道开发者如何组织程序结构 作用:在不惊动原始设计的基础上为其进行功能增强.(无侵 ...
- 四川九联代工M301H hi3798 mv300 mt7668魔百和 强刷和TTL线刷(救砖)经验分享
以下都是本次自己操作后的一些经验,不是技术分享,也是看来很多水教程后总结的精华. 四川九联代工M301H hi3798 mv300 mt7668魔百和 一.强刷 1.强刷的教程网上有很多,自己百度. ...
- 极速编程体验:VsCode和webstorm插上ChatGPT
ChatGPT走入了千家万户,而她最适合的用法之一就是进行编程辅助,特别是对一些常规开发,有比较好的引导作用. 很多主流编辑器都有相关的插件支持接入ChatGPT,而VsCode和webstorm是我 ...
- K8S 1.20 弃用 Docker 评估之 Docker 和 OCI 镜像格式的差别
背景 2020 年 12 月初,Kubernetes 在其最新的 Changelog 中宣布,自 Kubernetes 1.20 之后将弃用 Docker 作为容器运行时. 弃用 Docker 带来的 ...
- 测开-面试题-MySQL
1 增删改查的关键字分别是什么? 答: insert into \ replace into.delete.update.select 2 内连接和外连接的区别? 答: (1)内连接,只会展示与两表关 ...
- TypeError: unsupported operand type(s) for |=: 'dict' and 'dict'
原因:python3.9 支持对 dict 类型使用 |, 而较老的版本不支持 解决方案 :1. 用更新的 python 2. 把 | 操作替换成 {**d1, **d2} 来源:https://st ...
- springmvc关于通过使用路径占位符出现中文乱码解决办法
springmvc接受json数据使用@GetMapping通过名称.通过对象,也可以通过路径.当使用路径占位符时,会出现中文乱码.此时,需要转换.即 @GetMapping("/girl5 ...
- sqlite 数据更新
1.整个库迁移(命令) https://blog.csdn.net/kevin_weijc/article/details/78920593 2.单个表数据导入(attach,在数据库中添加附加数据库 ...