您现在的位置是:首页 > 技术教程 正文

php特性靶场

admin 阅读: 2024-03-17
后台-插件-广告管理-内容页头部广告(手机)

php特性靶场

1.web89

首先打开页面查看php源码,分析源码可知:

在这里插入图片描述

  • include(“flag.php”);:意思是该网站包含了名为flag.php的文件
  • highlight_file(FILE);:用于在浏览器中显示当前文件的源代码
  • if (isset($_GET[‘num’])) {…}:这是一个条件语句,检查是否存在名为 “num” 的 GET 参数,如果存在,则继续执行下面的代码
  • $num = $_GET[‘num’];:将 GET 参数num的值赋给变量 $num
  • if (preg_match(“/[0-9]/”, $num)) {…}:这个语句用来检查变量 $num 是否包含0-9中的数字,如果包含数字,则终止程序并输出no no no!
  • if (intval($num)) {…}:如果 $num 能够被转换为整数(通过 intval 函数),则继续执行下面的代码
  • echo $flag;:输出flag

2.web90

首先打开页面查看php源码,分析源码可知:
在这里插入图片描述

  • 前两行与第一题一致便不再赘述
  • if (isset($_GET[‘num’])) {…}:这是一个条件语句,检查是否存在名为 “num” 的 GET 参数,如果存在,则继续执行下面的代码
  • num = $_GET[‘num’];:将 GET 参数num的值赋给变量 $num
  • if ($num === “4476”) {…}:检查变量 $num 是否等于字符串 4476。如果相等则终止程序并输出no no no!
  • if (intval($num, 0) === 4476) {…}:这个条件检查使用 intval 函数将 $num 转换为整数,并与整数值 4476 进行比较。如果相等,则输出flag
  • else {…}:如果上述条件不满足,即用户提供的 num 不等于4476且转换为整数后也不等于 4476,那么程序输出 $num 的整数值

3.web91

首先打开页面查看php源码,分析源码可知:

在这里插入图片描述

  • a = a= a=GET[‘cmd’];:从 $GET 数组中获取名为 “cmd” 的参数,赋值给变量 $a
  • if(preg_match(‘/^php$/im’, $a)){…}:这个条件检查变量 $a 是否匹配以 “php” 开头和结尾的字符串,如果匹配,进入下一级的条件判断
  • if(preg_match(‘/^php$/i’, $a)){…}:在这个条件中,代码检查变量 $a 是否完全匹配字符串 “php”,如果匹配,输出hacker
  • else{…}:如果上述两个条件都不满足,即变量 $a 以 “php” 开头和结尾但不是完全匹配 “php”,则输出 flag
  • else{…}:如果最初的正则表达式匹配失败,即变量 $a 不以 “php” 开头和结尾,则输出 nonononono

4.web92

首先打开页面查看php源码,分析源码可知:
在这里插入图片描述

这道题乍一看与90大差不差,区别主要在于if($num==4476){ … }: 这个条件语句,检查变量 $num 是否等于整数值 4476。如果相等则终止程序并输出 no no no!,所以加字母传入不能使用了,但php有个特殊的字母:e,可以表示科学计数法,但是当intval()读取到e的时候就会停止,所以可以在末尾加e进行传参最终得到flag

5.web93

首先打开页面查看php源码,分析源码可知:
在这里插入图片描述

这道题也与上一题大体上类似,区别在于新加了if(preg_match(“/[a-z]/i”, $num)){
die(“no no no!”);}来检查 $num 是否包含任何字母,如果存在字母则终止程序并输出 no no no!,所以我们使用八进制的方法得到flag

6.web94

首先打开页面查看php源码,分析源码可知:
在这里插入图片描述

这道题比起上一题多了if(!strpos($num, “0”)){ die(“no no no!”); }来检查是否包含数字0,如果存在字母则终止程序并输出 no no no!,所以我们使用小数点在通过intval转换来绕过

7.web95

首先打开页面查看php源码,分析源码可知:
在这里插入图片描述

这道题在if(preg_match(“/[a-z]|./i”, $num)){
die(“no no no!!”);}语句中也禁用了.,但我们只需要让八进制前面没有0即可绕过得到flag

8.web96

首先打开页面查看php源码,分析源码可知:
在这里插入图片描述

  • if(isset($_GET[‘u’])){:检查GET请求中是否存在u参数
  • if($_GET[‘u’]==‘flag.php’){die(“no no no”); }:如果u存在,检查它的值是否为flag.php,如果’u’的值是flag.php,脚本终止并输出消息 no no no
  • else{:如果’u’的值不是flag.php,则继续执行
  • highlight_file($_GET[‘u’]);:输出flag

所以我们使用./修饰得到flag

9.web97

首先打开页面查看php源码,分析源码可知:
在这里插入图片描述

  • if (isset( P O S T [ ′ a ′ ] ) a n d i s s e t ( _POST['a']) and isset( POST[a])andisset(_POST[‘b’])) {:检查是否设置了名为 a 和 b 的POST参数
  • if ($_POST[‘a’] != $_POST[‘b’]) {:如果 a 和 b 的值不相等
  • if (md5( P O S T [ ′ a ′ ] ) = = = m d 5 ( _POST['a']) === md5( POST[a])===md5(_POST[‘b’])) {:如果 a 的MD5哈希值等于 b 的MD5哈希值
  • echo $flag;:如果条件满足,输出flag
  • else { print ‘Wrong.’; }:如果 a 和 b 的值不相等,且它们的MD5哈希值也不相等,输出 Wrong

这是使用了MD5的加密方法,我们可以通过数组绕过

10.web98

首先打开页面查看php源码,分析源码可知:
在这里插入图片描述

  • $GET ? KaTeX parse error: Expected 'EOF', got '&' at position 7: GET = &̲POST : ‘flag’;:这行代码似乎是在检查是否有 GET 请求,并将 $GET 设置为引用 $POST。如果没有 GET 请求,它会将字符串 flag 分配给 $GET
  • $GET[‘flag’] == ‘flag’ ? KaTeX parse error: Expected 'EOF', got '&' at position 7: GET = &̲_COOKIE : ‘flag’;:这行代码尝试检查 $GET 数组中的 flag 是否等于 flag,如果是,则将 $GET 设置为 $COOKIE。否则,它会将字符串 flag 分配给 $GET
  • $GET[‘flag’] == ‘flag’ ? KaTeX parse error: Expected 'EOF', got '&' at position 7: GET = &̲_SERVER : ‘flag’;:与前一行类似,但是这一行尝试将 $GET 设置为引用 $SERVER
  • highlight_file($_GET[‘HTTP_FLAG’] == ‘flag’ ? $flag : FILE);:输出flag

这是三元运算符配合引用传递,get随便传一个然后post一个传的那个参数=alag即可得到flag

11.web99

首先打开页面查看php源码,分析源码可知:
在这里插入图片描述

  • for ($i = 36; $i < 0x36d; KaTeX parse error: Expected '}', got 'EOF' at end of input: …) { array_push(allow, rand(1, $i)); }:在循环中,从 36 开始到 0x36d(十进制为 877),向数组 $allow 中添加了随机数
  • if (isset(KaTeX parse error: Expected 'EOF', got '&' at position 12: _GET['n']) &̲& in_array(_GET[‘n’], $allow)) {:检查是否存在 GET 参数 n,并且该参数的值在 $allow 数组中
  • file_put_contents($_GET[‘n’], $_POST[‘content’]);:如果条件满足,将使用 POST 请求中的 content 数据写入到以 n 命名的文件中

12.web100

首先打开页面查看php源码,分析源码可知:
在这里插入图片描述

  • $ctfshow = new ctfshow();
    $v1 = $GET[‘v1’];
    $v2 = $GET[‘v2’];
    $v3 = $_GET[‘v3’];:创建了一个名为 $ctfshow 的对象,该对象是类 ctfshow 的实例。然后通过 $_GET 获取了三个变量 v 1 、 v1、 v1v2 和 $v3
  • v 0 = i s n u m e r i c ( v0 = is_numeric( v0=isnumeric(v1) and is_numeric( v 2 ) a n d i s n u m e r i c ( v2) and is_numeric( v2)andisnumeric(v3);:这行代码尝试检查 v 1 、 v1、 v1v2 和 $v3 是否都是数字。由于 PHP 中逻辑运算符的优先级,它实际上只检查了 $v1 是否为数字
  • if ($v0) {:如果 $v0 为真,即 $v1 是数字,则继续
  • if (!preg_match(“/;/”, $v2)) {:检查 $v2 是否不包含分号 “;”
  • if (preg_match(“/;/”, $v3)) {:检查 $v3 是否包含分号 “;”
  • 如果 $v2 不包含分号且 v 3 包含分号,就执行 e v a l ( " v3 包含分号,就执行 eval(" v3包含分号,就执行eval("v2(‘ctfshow’)$v3");

“;”

  • if (preg_match(“/;/”, $v3)) {:检查 $v3 是否包含分号 “;”
  • 如果 $v2 不包含分号且 v 3 包含分号,就执行 e v a l ( " v3 包含分号,就执行 eval(" v3包含分号,就执行eval("v2(‘ctfshow’)$v3");

本题对v1v2v3都做了限定,可以使用使用反射类new ReflectionClass(“类名”),获得这个类的信息得到flag

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜