web89
我们看到题目中包含了一个flag文件,并且用get传参传入一个零到九的数字并赋值给num,preg_math是php中一个函数,用于执行正则表达式的匹配,原型为:
int preg_match ( string $pattern , string $subject [, array &$matches = NULL ] ),
函数返回一个整数值,具体含义如下:
0
:如果模式与字符串不匹配。1
:如果模式与字符串完全匹配。>1
:如果模式与字符串部分匹配。
之后用intval()函数进行判断,intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于数组,否则会产生 E_NOTICE 错误并返回 1 。 故此传入?num[]=1,产生错误返回1。
当我们直接输入一个数字时,程序会无法通过检验而终止,所以,当num通过正则表达式后,我们就可以继续进入到下一步,所以我们向其传入一个数组,即可通过一二步检查而获得flag,向其传入?num[]=1;
web90
这段代码会检查变量num是否等于4476,如果等于4476,程序会直接输出no no no !,否则的话程序会使用intval()函数进行转换,将num转化为一个整数,后边的0则代表其将num转化为十进制,如果转化后的数字等于4476的话,程序将会输出flag的信息,不等于则直接输出数字。
所以我们输入小数形式的4476,即4476.0,它不等于4476的同时,转化为整数是4476,所以我们传入?num=4476.0,即可获得flag。
web91
这段代码用GET获得了cmd的值,并将其复制给a,再通过preg_match()函数来对a进行判断,首先检查a是否以php开头,^表示以什么开头,im其中的i表示ignore不区分大小写,m表示more多行匹配。然后其再次使用了一个相似的代码来再次检验,但是这行代码缺少了多行检验,所以我们可以向其传入多行的表达式,使第一行不满足条件,而第二行满足,则可绕过第二层检验
?cmd=x%0aphp
web92
这道题与之前的题目类似,我们可以换一种其他做法,其将我们输入的值转化为十进制数,我们可以向其传入4476的其他进制形式,如16进制数0x117c,0x为十六进制数的标志,所以我们传入
?num=0x117c
即可获得flag
web93
这道题目再次使用了preg_match来判断num,这段代码主要检查num中是否含有小写字母,如果含有的话其将直接中止运行,所以我们将不能使用十六进制数,我们向其输入4476.1,在强制转化是系统会将我们的小数部分抹去,所以我们输入
?num=4476.1
就能绕过检查得到flag
web94
这道题目中含有一个判断$num==="4476",严格比较了num的值与4476是否相等,strpos是一个PHP函数,用于查找一个字符串在另一个字符串中第一次出现的位置。如果找到子串,则返回它在父串中的位置(从0开始计数),如果没有找到,则返回false
。这个函数是大小写敏感的,并且是二进制安全的。
函数的基本语法如下:strpos(string $haystack, mixed $needle, int $offset = 0): int|false
这段代码中的strpos前有取反!符号,所以说我们传入的式子中必须含有0
所以我们继续传入4476.0来通过严格等于,所以我们传入?num=4476.0即可获得flag。
web95
此题与上题类似,,但是num不能等于4476,这次系我们使用八进制数,并在前面加空格来绕过判断,传入
?num= 010574,即可获得flag。
web96
isset是一个用来检测变量是否已设置并且非NULL的关键字或函数。它通常用于判断变量是否存在,并可以避免在使用变量之前出现错误。
如果变量存在且其值不为NULL,isset()
函数返回真,否则返回假。这道题我们在需要向u传入flag文件,并且u不能等于flag.php,所以我们加入当前文件目录./来绕过。
web97
此题是post传参并且需要a与b的值不同,但是通过md5加密后的结果要相同,所以我们使用传入数组的方式来使加密同时返回NULL,使其相同,所以向post传入
a[]=1&b[]=2,即可获得flag
web98
这道题使用了运算符? :来对get与post惊醒判断,如果存在get传参,则会被post所覆盖,所以我们只需要保证存在get,并且使post传入的参数满足最后的判断条件即可绕过,所以随意传入一个get值,再向post传入HTTP_FLAG=flag,获得flag
web100
这段代码创建了一个名为 $ctfshow 的对象,从 GET 请求参数中获取数据,并将其存储在变量 $v1, $v2, $v3 中,然后使用 is_numeric() 函数检查 $v1, $v2, $v3 是否都为数字。然后将结果赋值给变量 $v0,由于=的优先级高于and,因此只需要v1等于数字就可以绕过上述检查。eval()函数的作用是将传入的字符串作为 PHP 代码进行解析和执行。简单来说,eval() 函数可以在运行时动态执行一段 PHP 代码。所以我们传入/?v1=2&v2=&v3=?><?=`tac ctfshow.php`;