目录
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}