CTFshow web(php特性89-92)

web89

<?php

/*

-*- coding: utf-8 -*-

@Author: h1xa

@Date: 2020-09-16 11:25:09

@Last Modified by: h1xa

@Last Modified time: 2020-09-18 15:38:51

@email: h1xa@ctfer.com

@link: https://ctfer.com

*/

include("flag.php");

highlight_file(FILE);

if(isset($_GET['num'])){

num = _GET['num'];

if(preg_match("/[0-9]/", $num)){

die("no no no!");

}

if(intval($num)){

echo $flag;

}

}

知识点:

intval ( mixed var \[, int base = 10 ] ) : int

有一点很重要,intval()用于获取变量的整数值。
intval()不能用于object和array,否则会产生E_NOTICE错误并返回1。

其中 var 表示需要被转换的变量,base 表示需要转换的进制数,缺省为10进制,即默认情况下,$base 的值为10。

下面我们来看一下 intval() 函数的用法和一些注意事项:

转换规则
如果 var 是一个浮点数,intval() 函数会将其舍弃小数部分并返回整数部分。 如果 var 是一个字符串,intval() 函数会尝试将其转换为整数。如果字符串以数字开头,则转换为对应的整数;否则返回0。
如果 var 是一个布尔值,intval() 函数会将其转换为整数。true 转换为1,false 转换为0。 如果 var 是一个数组或对象,intval() 函数会返回0。

详情请看:

一篇文章带你搞定php里面intval函数的应用-CSDN博客

payload:?num[]=;

web90

<?php

/*

-*- coding: utf-8 -*-

@Author: h1xa

@Date: 2020-09-16 11:25:09

@Last Modified by: h1xa

@Last Modified time: 2020-09-18 16:06:11

@email: h1xa@ctfer.com

@link: https://ctfer.com

*/

include("flag.php");

highlight_file(FILE);

if(isset($_GET['num'])){

num = _GET['num'];

if($num==="4476"){

die("no no no!");

}

if(intval($num,0)===4476){

echo $flag;

}else{

echo intval($num,0);

}

}

知识点:

弱等于主流大致有以下的几种:

1.小数点:

1==1.0000

2.正号:

2==+2

3.单双引号:

3=="3"

4.科学计数法:

3aaa==3

5.MD5;比如:

由于 MD5 可以将数据映射到一个唯一的散列值,因此可以使用强类型比较符 === 来进行强相等的判断。

6. 布尔值true和任意字符串都弱相等

7.进制转化法弱相等(很鸡肋,实战之中建议拿来绕过弱相等)

<?php

a = "4476"; b = 010574;

if (a == b) {
echo "相等";
} else {
echo "不相等";
}

上述代码是相等的,因为0开头就是八进制的典型特征,所以经过转化后两者数值相等,没有问题。但是在网页上提交的数据是以字符串的形式传递给服务器的,包括数字。所以哪怕当你以 "?num=134233" 这样的形式提交数据时,在服务器端接收到的数据类型仍然是字符串。所以上面的代码就变成了"010574"=="4476"(现在这个是错误的),因为"010574"是个字符串,所以直接变成010576!=4476

详细文章知识点:

PHP强相等&弱相等(附带科学计数法)_php 科学计数法-CSDN博客

这里只要是强相等就不行,那就弱相等呗,直接照搬:

payload:?num=+4476或者?num=4476lskjasdljkadj

web91

<?php

/*

-*- coding: utf-8 -*-

@Author: Firebasky

@Date: 2020-09-16 11:25:09

@Last Modified by: h1xa

@Last Modified time: 2020-09-18 16:16:09

@link: https://ctfer.com

*/

show_source(FILE);

include('flag.php');

a=_GET['cmd'];

if(preg_match('/^php/im', a)){

if(preg_match('/^php/i', a)){

echo 'hacker';

}

else{

echo $flag;

}

}

else{

echo 'nonononono';

}

if(preg_match('/^php/im', a)){这里的意思就是只要识别到php无论大小写都可以,而m的意思是可以多行识别, if(preg_match('/^php/i', a)){这里没有m,不能多行识别,所以给前面加个%0a(换行符)就拿到flag

payload:?cmd=%0aphp

web92

<?php

/*

-*- coding: utf-8 -*-

@Author: Firebasky

@Date: 2020-09-16 11:25:09

@Last Modified by: h1xa

@Last Modified time: 2020-09-18 16:29:30

@link: https://ctfer.com

*/

include("flag.php");

highlight_file(FILE);

if(isset($_GET['num'])){

num = _GET['num'];

if($num==4476){

die("no no no!");

}

if(intval($num,0)==4476){

echo $flag;

}else{

echo intval($num,0);

}

}

知识点:

进制转换
除了将十进制数转化为整数之外,intval() 函数还可以实现不同进制之间的转换(2进制、8进制、16进制)。在这种情况下,需要显式指定 $base 参数的值。例如:

echo intval('1100', 2); // 12(二进制)

echo intval('14', 8); // 12(八进制)

echo intval('C', 16); // 12(十六进制)

还有一个比较特殊,

如果intval第二个参数是0,,那么你就可以自由根据你的需求去谢你需要的进制

比如

?c=0x117c(十六进制)

?c=010574(八进制)

内容来自:一篇文章带你搞定php里面intval函数的应用-CSDN博客

这里要绕过弱等于直接拿出进制转化就好

payload:

?num=010574

希望我的文章对大家有所帮助,谢谢!

相关推荐
WEIII2 分钟前
不是?全网都找不到案例?小程序集成 gifsicle wasm
前端·微信小程序·webassembly
张开心_kx4 分钟前
面试官又问我JS是如何进行内存管理的?
前端·javascript
前端卧龙人5 分钟前
用Node.js轻松获取电脑配置信息
前端
最新资讯动态7 分钟前
用DevEco Studio增量补丁修复功能,让鸿蒙应用的调试效率大增
前端
程序员Feri9 分钟前
一文彻底搞明白HarmonyOS基础TypeScript中的泛型函数
前端·javascript
叶小秋11 分钟前
React 进阶:一个优雅的弹窗管理 Hook 实现
前端·react.js
华洛12 分钟前
聊一下MCP,希望能让各位清醒一点吧🧐
前端·javascript·vue.js
凯哥197012 分钟前
Sciter.js 的前世今生
前端
北京_宏哥12 分钟前
🔥PC端自动化测试实战教程-6-pywinauto 打印和保存控件菜单树结构之ElementNotFoundError(详细教程)
前端·windows·python
江城开朗的豌豆14 分钟前
CSS篇:前端开发者必须掌握的CSS核心知识:选择器与优先级详解
前端·css·面试