Bootstrap

PHP特性靶场

Web89

首先查看源码,GET传参,满足if 语句的条件即可打印flag

那我们分析一下满足if语句的条件是为什么?

preg_match 函数用于执行一个正则表达式匹配。接收字符串的,根据本题语义,传入的num的值(字符串)要是有数字0~9,则匹配成功,满足if条件打印no no no!

很显然我们需要打印的是flag,所以我们就得绕过preg_match 函数,满足下面intval函数的条件,即可打印flag

intval()函数是获取变量的整数值

这就奇怪了,不让输入数字,还得使intval($num)为真,才可以获取flag,我们就会想到intval函数可以转换数组

intval() 转换数组类型时,不关心数组中的内容,只判断数组中有没有元素。

若数组为空,返回0

若数组不为空,则返回1!

所以我们让    num[1]=1

Web90

首先分析源代码,GET传参,获取变量num的值

第一个if语句 num=4476 则打印 no no no!

第二条语句依旧是intval函数

语法: int intval (  $num  ,$base = 10 )

①num为传入的值

②如果 base 是 0,通过检测 var 的格式来决定使用的进制:

  • 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
  • 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
  • 将使用 10 进制 (decimal)。

intval函数获取变量的整数值,要想使 intval($num, 0) === 4476 为真

则我们需要使num取整数部分为4476即可

我们输入   ?num=4476.6

Web91

首先分析源码,发现flag在第一个if语句的嵌套if语句中,则满足第一个if语句条件,即可进入到嵌套if语句中。

preg_match函数正则匹配,题中匹配的是php,要是有php就可以返回值为真

我们会发现php周围有这几个符号,他们是什么意思呢?
^表示表达式开头

$表示表达式结尾

i表示不区分大小写

m表示多行模式                   //多行就是匹配多行内容

 再看嵌套if语句,很明显发现没有字符m ,就意味着他只能匹配第一行数据,但是在嵌套if语句的else语句才有flag,所以我们输入的cmd的值就是第一行没有php,第二行才有php,那么如何区分是第一行还是第二行呢,这里我们用到URL语言中的换行符: %0A

则输入   ?cmd=1%0Aphp

Web92

首先分析源码,我们会发现第一个if语句中的条件与90关有区别

90:$num===4476

92:$num==4476

相等(==):先强制转换变量类型,再比较

全等(===):不转换类型,一旦类型不同,就是不全等。

 所以本关num=4476.0是行不通的!

其余和90关的步骤一样,intval函数获取变量整数值,则num的整数部分是4476即可(注意不能是4476.0

则输入   ?num=4476.2

Web93

首先分析代码,绕过前两个if语句,满足第三个if语句,即可得到flag

①num==4476,还是不能用4476.0绕过

②正则匹配,字符串中不能有a~z这几个字符,i表示不区分大小写

③intval函数获取变量整数值,则num的整数部分是4476即可(注意不能是4476.0)

则输入    ?num=4476.8

Web94

 

首先分析源代码,绕过前三个,满足最后一个if语句条件,即可得到flag

①num===4476,不会转换类型,只要有不同即可绕过

②正则匹配,字符串中不能有a~z这几个字符,i表示不区分大小写

③strpos函数,查找指定字符在字符串中第一次出现的位置。意思就是这个字符串中必须包含指定字符,题中意思就是,如果此字符串没有0,则满足if语句条件,打印no!那我们就得字符串中有0,即可绕过!

④intval函数获取变量整数值,则num的整数部分是4476即可

结论:有0,且整数部分为4476的字符串

则输入     ?num=4476.0

Web95

首先分析源代码,绕过前三个,满足最后一个if语句即可获取flag

①num==4476,还是不能用4476.0绕过

②正则匹配,字符串中不能有a~z这几个字符或小数点,i表示不区分大小写

③如果此字符串没有0,则满足if语句条件,打印no!那我们就得字符串中有0,即可绕过!

④intval函数获取变量整数值,则num的整数部分是4476即可

结论:不能有小数点,字符串包含0,但首位不能是0,整数部分为4476

之前的方式都不能使用,但是intval函数可以有多种进制,十六进制有字母不可以,那么可以尝试一下八进制数,但是以八进制数时,必须是0开头,根据分析0元素不能时首位,这时候我们想到了换行符  %0A,4476转换为八进制数为  010574

则输入   ?num=%0A010574

Web96

highlight_file()函数用于对指定的文件进行PHP语法高亮显示

首先分析源代码,传入的参数u不能是flag.php文件,则可以获取flag,但是我们得想办法把flag.php文件传入,这里我们利用路径问题来读,所以我们可以在flag.php之前加上当前目录./

则输入      ?u=./flag.php

Web97

首先分析源代码,POST传参,必须满足a和b的值不相同,但是经过md5加密后全等,即可得到flag

md5绕过思路有两种,①md5(a)==md5(b)时,用科学计数法绕过。②md5(a)===md5(b)可以用数组绕过

①科学计数法绕过:md5() 遇到[公式],会先[运算],再对运算结果[计算]MD5。

由于0和任何数相乘都等于0,所以0e开头的任何数,其MD5都是相同的。

一些常见的为0e开头的字符串:

QNKCDZO   => 0e830400451993494058024219903391
240610708 => 0e462097431906509019562988736854
s878926199a => 0e545993274517709034328855841020
s155964671a => 0e342768416822451524974117254469
s214587387a => 0e848240448830537924465865611904
s214587387a => 0e848240448830537924465865611904

②数组绕过md5不能处理数组,传两个数组,数组都返回null,即null===null

则输入      a[]=1&b[]=2

 

Web98

分析源代码,发现使用三目操作符

 ① $_GET ? $_GET = &$_POST : 'flag'; 传入的GET会变成POST

$_GET['flag'] == 'flag' ? $_GET = &$_COOKIE : 'flag'; 如果get的参数等于字符串"flag",那么get的参数变成cookie的参数。

$_GET['flag'] == 'flag' ? $_GET = &$_SERVER : 'flag';如果get的参数等于字符串"flag",那么get的参数变成server的参数。

highlight_file($_GET['HTTP_FLAG'] == 'flag' ? $flag : __FILE__); 如果get传入HTTP_FLAG参数的值是字符串"flag",那么高亮显示$flag变量对应的文件,否则就是当前文件。

经过分析,需要get传参传的是flag,即可得到flag,但是get又会变成post,所以我们这样传:get和post都传flag即可

则输入  ?HTTP_FLAG=flag(get)  HTTP_FLAG=flag(post)

web100 

首先分析源代码,以上代码表示只有$v0=1且v2中不能含有分号v3要有分号。

$v0 = is_numeric($v1) and is_numeric($v2) and is_numeric($v3);在这段代码中只需要v1有数字即可,因为赋值操作的优先级大于and,所以v0只跟v1有关系,v2和v3是干扰。

接下来我们构造一个输出flag的函数,利用eval("$v2('ctfshow')$v3");

由题目中的注释可知flag在ctfshow中因此我们只需要输出ctfshow即可,我们不能直接输出字符串,应该输出$ctfshow的值

所以用到var_dump, 是 PHP 中用于输出变量的相关信息的函数

v3值直接注释掉即可

则输入         ?v1=1&v2=var_dump($ctfshow)/*&v3=*/;

 

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;