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

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

相关推荐
Light607 分钟前
性能提升 60%:前端性能优化终极指南
前端·性能优化·图片压缩·渲染优化·按需拆包·边缘缓存·ai 自动化
Jimmy11 分钟前
年终总结 - 2025 故事集
前端·后端·程序员
烛阴12 分钟前
C# 正则表达式(2):Regex 基础语法与常用 API 全解析
前端·正则表达式·c#
roman_日积跬步-终至千里19 分钟前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
GIS之路35 分钟前
GIS 数据转换:使用 GDAL 将 TXT 转换为 Shp 数据
前端
多看书少吃饭42 分钟前
从Vue到Nuxt.js
前端·javascript·vue.js
前端一小卒1 小时前
从 v5 到 v6:这次 Ant Design 升级真的香
前端·javascript
前端不太难2 小时前
《Vue 项目路由 + Layout 的最佳实践》
前端·javascript·vue.js
LYFlied2 小时前
【每日算法】 LeetCode 56. 合并区间
前端·算法·leetcode·面试·职场和发展
想学后端的前端工程师2 小时前
【Vue3组合式API实战指南:告别Options API的烦恼】
前端·javascript·vue.js