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

67 篇文章 1 订阅
56 篇文章 1 订阅

目录

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}

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Myon⁶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值