攻防世界-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 ...
随机推荐
- 三天吃透Java并发八股文!
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- C#神器"BlockingCollection"类实现C#神仙操作
前言 如果你想玩转C# 里面多线程,工厂模式,生产者/消费者,队列等高级操作,就可以和我一起探索这个强大的线程安全提供阻塞和限制功能的C#神器类 BlockingCollection简单介绍 微软介绍 ...
- LeetCode-398 随机数索引
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/random-pick-index 题目描述 给定一个可能含有重复元素的整数数组,要求随机输出给定 ...
- Jmeter 常用命令 之 CLI模式
一.Jmeter的非GUI模式命令(即CLI模式command line) 命令: 命令参数 命令释义 -n 设置命令行模式 -t 指定JMX脚本路径参数为:JMX脚本路径,若非当前目录需用全路径或相 ...
- Vue 超长列表渲染性能优化
参考:https://juejin.cn/post/6979865534166728711#heading-3 组件懒加载参考:https://github.com/xunleif2e/vue-laz ...
- vue子传父 .indexOf('1')!=-1
子传父 1.先在父级页面的子组件上加上自定义事件 <SearchSelector @attrinfo="propsinfo" /> 2.在子组件里面写方法传 //点击 ...
- MyCat2 分表分库
1.添加数据库.存储数据源 我们在读写分离那边已经生成过,不需要在执行,如果没有执行过,执行下面注解,我们这边重新创建一个数据库db1 /*+ mycat:createDatasource{ &quo ...
- JAVA操作Mongo 数组模糊查询
引入mongo-java-driver-3.0.4 jar 工具类 //mongodb 连接数据库工具类public class MongoDBUtil { //不通过认证获取连接数据库对象 publ ...
- 新的学习历程-python5 输入输出基础
1 uname=input("please input username:") 2 print("welcome",uname) #print各项间默认以空格作 ...
- java报错 SLF4J:Failed to load class "org.slf4j.impl.StaticLoggerBinder"
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artif ...