目录
1.web89
这段 PHP 代码的主要目的是根据用户输入的特定条件来决定是否输出flag
的值.
首先include("flag.php")包含一个flag.php
文件;
highlight_file(__FILE__)用于对当前PHP文件进行语法高亮显示;
if (isset($_GET['num'])) {... }
通过GET方法传递了名为num的参数;
$num = $_GET['num']表示用GET传参的方法将参数num的值赋值给变量$num;
if (preg_match("/[0 - 9]/", $num)) { die("no no no!"); }通过正则匹配来检查$num中是否包含0-9中任意数字的一个。如果包含数字,则输出no no no!并终止脚本执行;
if (intval($num)) { echo $flag; }intval函数将$num的值转换为整数。
代码会进一步检查是否能够将 $num
转换为整数。如果可以转换(即 $num
是一个整数),则执行 echo $flag
语句,输出 flag
。
所以输入?num[]=4.4
2.web90
这段 PHP 代码主要用于根据用户通过GET
方法传递的num
参数的值来决定输出内容。
include("flag.php");
:将flag.php
文件包含到当前脚本中;
highlight_file(__FILE__);
:对当前 PHP 文件进行语法高亮显示;
if (isset($_GET['num'])) {... }
:检查是否通过GET
方法传递了名为num
的参数。如果有,则执行花括号内的代码;
$num = $_GET['num'];
:将GET
参数num
的值赋给变量$num;
if ($num === "4476") { die("no no no!"); }这里"==="的作用为
不仅要比较左右两个数的值,还要比较数据类型。如果$num
的值是4476
并且数据类型是字符串,就会输出no no no!
并终止脚本;
if (intval($num, 0) === 4476) { echo $flag; }
:这里使用intval
函数将$num
转换为整数。intval
函数的第二个参数0
表示根据默认的基数(十进制)进行转换。如果转换后的整数等于4476
,则输出flag
。这里可以输入4476的八进制010574,十六进制0x117c等;
else { echo intval($num, 0); }
:如果intval($num, 0)
不等于4476
,则输出num
转换后的整数值。
所以输入?num=010574或?num=0x117c
3.web91
show_source(__FILE__);
:这个函数用于显示当前 PHP 文件的源代码;
include('flag.php');
:将flag.php
文件包含到当前脚本中;
if(preg_match('/^php$/im', $a)){... }
:这里使用preg_match
函数和正则表达式/^php$/im
对$a
进行匹配。正则表达式/^php$/im
的含义如下:
^
表示匹配字符串的开头php
是要匹配的内容$
表示匹配字符串的结尾i
修饰符表示不区分大小写匹配m
修饰符表示多行匹配模式,所以需要转行符%0a。
if(preg_match('/^php$/i', $a)){... }
:这里再次使用preg_match
函数,但正则表达式是/^php$/i
(去掉了m
修饰符)对$a
进行匹配。如果$a
匹配这个正则表达式,,则输出hacker
。如果不匹配这个正则表达式,则输出flag;
如果$a
不匹配第一个正则表达式/^php$/im
,则输出nonononono
。
所以输入?cmd=%0aphp
4.web92
这段 PHP 代码主要用于根据用户通过GET
方法传递的num
参数的值来决定输出内容。
include("flag.php");
:将flag.php
文件包含到当前脚本中;
highlight_file(__FILE__);
:对当前 PHP 文件进行语法高亮显示;
if (isset($_GET['num'])) {... }
:检查是否通过GET
方法传递了名为num
的参数。如果有,则执行花括号内的代码;
$num = $_GET['num'];
:将GET
参数num
的值赋给变量$num;
if ($num === "4476") { die("no no no!"); }这里"==="的作用为
不仅要比较左右两个数的值,还要比较数据类型。如果$num
的值是4476
并且数据类型是字符串,就会输出no no no!
并终止脚本;
if (intval($num, 0) === 4476) { echo $flag; }
:这里使用intval
函数将$num
转换为整数。intval
函数的第二个参数0
表示根据默认的基数(十进制)进行转换。如果转换后的整数等于4476
,则输出flag
。这里可以输入4476的八进制010574,十六进制0x117c等;
else { echo intval($num, 0); }
:如果intval($num, 0)
不等于4476
,则输出num
转换后的整数值。
所以输入?num=010574或?num=0x117c
5.web93
因if(preg_match("/[a - z]/i", $num)){ die("no no no!"); }
这个条件判断是检查$num
中是否包含字母(不区分大小写),如果包含,则输出no no no!
并终止脚本。故只能输入4476的八进制?num=010574
6.web94
strpos
是 PHP 中的一个字符串函数,用于查找一个字符串在另一个字符串中首次出现的位置。 (索引从 0 开始)
当strpos($num, "0")
返回false
时(即字符串$num
中没有找到"0"
这个字符)。故可以输入?num= 10574(注意前面有空格)或?num=4476.01
7.web95
|
:这是逻辑或(alternation)操作符。它表示匹配[a - z]
或者后面的表达式。\.
:这里的.
是一个特殊字符,在正则表达式中它通常匹配除了换行符之外的任何单个字符。但是由于前面有反斜杠\
进行转义,在这里它只匹配字符.
本身。故不能输入类似?num=4476.01
故 num中有0但是开头不能为0,可以输入?num= 10574(注意空格)或?num=+10574或?num=%0a10574
8.web96
如果 u 参数存在:
检查 u 参数是否等于 'flag.php'。如果是,则执行 die("no no no");,终止脚本执行并输出 "no no no";
如果 u 参数不是 'flag.php',则执行 highlight_file($_GET['u']);,高亮显示用户指定的文件内容。flag肯定在flag.php文件中,想办法绕过,flag在当前目录中,可以输入?u=./flag.php。
9.web 97
if (isset($_POST['a']) and isset($_POST['b'])) {... }
:这个条件语句检查是否同时接收到了名为a
和b
的POST
参数。只有当两个参数都存在时,才会执行花括号内的代码。
if ($_POST['a']!= $_POST['b'])
:首先检查a
和b
的值是否不相等。这是一个普通的不等比较。
if (md5($_POST['a']) === md5($_POST['b']))
:如果a
和b
的值不相等,接着检查它们的MD5
哈希值是否严格相等。这里使用===
进行严格比较,意味着不仅哈希值要相等,而且哈希值的数据类型也要相同。如果满足这个条件,就会输出flag
。
else print 'Wrong.';
:如果a
和b
的MD5
哈希值不严格相等,就输出Wrong.
。
哈希值(Hash Value)也被称为散列值,它是通过哈希函数(Hash Function)对任意长度的数据计算得出的固定长度的值。
10.web98
$_GET? $_GET = &$_POST : 'flag';表示如果$_GET
存在(即有值且不为false
、null
等),那么$_GET
将成为$_POST
的引用。如果$_GET
不存在,这里返回字符串'flag';
$_GET['flag'] == 'flag'? $_GET = &$_COOKIE : 'flag'; 这里检查$_GET
数组中'flag'
键的值是否等于'flag'
。如果是,$_GET
将成为$_COOKIE
的引用;否则,同样返回字符串'flag'
;
$_GET['flag'] == 'flag'? $_GET = &$_SERVER : 'flag'; 类似地,再次检查$_GET
数组中'flag'
键的值。如果等于'flag'
,$_GET
将成为$_SERVER
的引用;否则,返回'flag';
highlight_file($_GET['HTTP_FLAG'] == 'flag'? $flag : __FILE__); 检查$_GET
数组中'HTTP_FLAG'
键的值是否等于'flag'
。如果是,就调用highlight_file
函数输出$flag
的值)。如果$_GET['HTTP_FLAG']
不等于'flag'
,则输出当前文件(__FILE__
)的源代码。
11.web100
代码从GET
请求中获取v1
、v2
和v3
三个参数,然后使用is_numeric
函数检查这三个参数是否为数字;
接下来检查v2
中是否不包含;
字符,同时v3
中是否包含;
字符。如果满足条件,就会执行eval("$v2('ctfshow')$v3");
输入?v1=1&v2=var_dump($ctfshow)/*&v3=*/; 输出ctfshow里的内容。