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

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

相关推荐
miss9 分钟前
JavaScript 异步循环完全指南:从踩坑到最佳实践
前端
家里有蜘蛛9 分钟前
从 Webpack 迁移到 Rspack 后,循环依赖为什么炸了?一个 const vs var 引发的血案
前端
山_雨10 分钟前
前端重连机制
前端
Cache技术分享14 分钟前
355. Java IO API -去除路径中的冗余信息
前端·后端
牛马11125 分钟前
Flutter CustomPaint
开发语言·前端·javascript
炽烈小老头36 分钟前
函数式编程范式(三)
前端·typescript
ruoyusixian1 小时前
chrome二维码识别查插件
前端·chrome
fengfuyao9851 小时前
一个改进的MATLAB CVA(Change Vector Analysis)变化检测程序
前端·算法·matlab
yuhaiqiang2 小时前
为什么这道初中数学题击溃了所有 AI
前端·后端·面试
djk88882 小时前
支持手机屏幕的layui后台html模板
前端·html·layui