php特性靶场
后台-插件-广告管理-内容页头部广告(手机) |
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、 v1、v2 和 $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、 v1、v2 和 $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
后台-插件-广告管理-内容页尾部广告(手机) |