CTF SHOW

Web89~150plus

Web89

1
2
3
4
5
6
7
8
9
10
11
12
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;
}
}

要求输入数字,却使用正则表达绕过了数字。

这是preg_match相关绕过,更准确一些这里是数组绕过

与preg_match函数的特性相关,该函数要求第二个参数是字符串形式,如果传入数组时会返回flase。

Web90

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}
}

需要输入的num的十进制值为4476,但是不能直接输入将其字符串赋值为4476

这个实际上是intval相关绕过,采取换进制的做法

Web91

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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';
}

模式部分很容易看懂。 /是分割符,^表示开头,$表示结尾。说明这里需要精确匹配

但这里需要理解修饰符的意思。-i表示不区分大小写,-m表示多行模式(^和$会匹配每行的开始和结束

分析题目,需要cmd多行包含php,但不能精确匹配到php

使用换行符绕过:**%0a**

1
?cmd=php%0ap

Web92

题重复了

不是后面怎么这么多重复的是我的问题吗