ctfshow-web入门-php特性(web89-web95)intval 函数绕过

目录

1、web89

2、web90

3、web91

4、web92

5、web93

6、web94

7、web95


1、web89

简单审一下代码:

过滤了数字,intval() 函数用于获取变量的整数值,第三个 if 里面只要不为 0 就会输出 flag。

payload:使用数组绕过

?num[]=1

flag:ctfshow{7c8be7ff-9938-4d76-82a3-421fd6fad411}

intval() 不能用于 object 和 array ,否则会产生 E_NOTICE 错误并返回 1,intval() 传入非空数组就会返回 1,而 preg_math() 只能处理字符串,当传入的是数组时会直接返回 0。

2、web90

代码审计:

如果 num 的值严格等于"4476",则输出"no no no!"并终止执行;

如果 num 转换为整数并以 0 作为基数进行转换后等于 4476,则输出 $flag 的值。

这里的绕过方法很多,对于 intval() 函数,如果 base(转换基数) 是 0,通过检测 var 的格式来决

定使用的进制:

如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);

如果字符串以 "0" 开始,使用 8 进制(octal);

否则,将使用 10 进制 (decimal)。

(1)使用十六进制格式

?num=0x117c

(2)使用八进制

?num=010574

由于:

因此我们还可以使用:

(3)使用小数绕过

?num=4476.1

(4)使用字母绕过

?num=4476a

此外,还可以:

(5)使用科学计数法绕过

?num=4476e0

其中 e0 表示 10 的 0 次方,也就等于 1

(6)使用正负号绕过

?num=+4476

3、web91

代码审计:

使用正则表达式匹配 a 是否等于字符串"php",并且不区分大小写(i标志)和多行模式(m标志),\^ 表示字符串的开头, 表示字符串的结尾。 如果第一次匹配成功,再次使用正则表达式匹配 $a 是否等于字符串"php",但这次只有不区分大小写,是单行模式,不会匹配多行,如果第二次没有匹配成功就会输出 flag。

采用换行符 %0a 绕过,payload:

?cmd=%0aphp

第一次多行匹配会匹配每一行的开头和结尾,就会匹配成功,第二次因为 ^ 和 $ 仅匹配整个字符串的开头和结尾,就不符合正则表达式的以 php 开头以 php 结尾了。

拿到 flag:ctfshow{ae8546f0-fcba-4bb8-8a86-0da480e4bfc8}

4、web92

php 中有两种比较的符号: == 与 ===

=== 是严格相等运算符,在进行比较时,会先判断两种字符串的类型是否相等,再比较;

== 是相等运算符,在进行比较时,会先将字符串类型转化成相同,再比较,比如比较一个数字和字符串或者比较涉及到数字内容的字符串,字符串会被转换成数值并按照数值来进行比较。

对于 intval('4476e1', 0) 指定基数为 0,PHP 将字符串 '4476e1' 视为十进制,在十进制中,'4476e1' 被解析为 4476,而 e1 部分被忽略掉了;

而对于 intval('4476e1') ,未指定基数,php 考虑了科学计数法。

web90 是强比较,这里是弱比较,部分 payload 还是能继续用的:

比如使用十六进制绕过

?num=0x117c

ctfshow{e5494299-4be1-4119-bd16-e6b5be15b567}

还可以使用:

?num=4476e1

5、web93

在上一题的基础上新增过滤字母

使用小数绕过:

?num=4476.1

也可以使用八进制:

?num=010574

拿到 flag:ctfshow{07e550dd-6213-405a-8239-e4e0f582d468}

6、web94

新增 strpos 函数:查找字符串在另一字符串中第一次出现的位置(区分大小写)。

语法:strpos(string,find,start)

参数 描述
string 必需。规定被搜索的字符串。
find 必需。规定要查找的字符。
start 可选。规定开始搜索的位置。

返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。

也就是说,如果 num 中不包含数字 "0" 就会终止程序,但是还有一种情况,如果这个 0 出现在开头,虽然是找到了有 0 这个字符,但是返回位置为 0 ,if (!0),die 函数也会触发。

可以使用小数绕过,payload :

?num=4476.0

拿到 flag:ctfshow{5b94f7ae-6be1-443d-836a-e599f809eb7d}

7、web95

新增过滤了点,因此不能再使用小数绕过了,并且第一次的比较变成了弱比较。

那么这里使用八进制绕过,但是要确保开头不能为 0,可以在开头添加空格或者使用加号绕过:

?num= 010574
?num=+010574

拿到 flag:ctfshow{eedab91e-e2b0-44f6-aab5-1b7bfa6c5ffb}

相关推荐
ekskef_sef23 分钟前
32岁前端干了8年,是继续做前端开发,还是转其它工作
前端
飞飞-躺着更舒服28 分钟前
【QT】实现电子飞行显示器(改进版)
开发语言·qt
群联云防护小杜30 分钟前
如何给负载均衡平台做好安全防御
运维·服务器·网络·网络协议·安全·负载均衡
ihengshuai30 分钟前
HTTP协议及安全防范
网络协议·安全·http
武昌库里写JAVA44 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
sunshine6411 小时前
【CSS】实现tag选中对钩样式
前端·css·css3
蜜獾云1 小时前
linux firewalld 命令详解
linux·运维·服务器·网络·windows·网络安全·firewalld
真滴book理喻1 小时前
Vue(四)
前端·javascript·vue.js
蜜獾云1 小时前
npm淘宝镜像
前端·npm·node.js
dz88i81 小时前
修改npm镜像源
前端·npm·node.js