题目:web 89
题目: 解题思路:这道题目涉及了两个函数:preg_match()和intval()简要介绍一下两个函数
preg_match()用于对字符串进行正则表达式的匹配,但是在传入字符串的时候确实会抛出一个 Warning 错误,但它不会导致整个 PHP 脚本终止。可以利用这个绕过第一个if语句 intval()用于将字符串转化为整数,特殊情况:传入数组的话会判断里面有没有元素,有则返回1,没有返回0,可以利用这个绕过第二个if语句 于是payload为?num[]=a 知识点:preg_match() intval()传入数组特性 题目:web 90
题目: 解题思路:简要分析代码,get一个num参数,如果这个变量不是‘4476’,并且在经过intval()函数处理之后,结果等于4476就输出flag
这里的intval()函数,在处理字符串时,如果字符串以数字开头,则会先转化为数字,后面如果有其他非数字内容则会忽略,即:将第一个非数字(加减号除外)前的内容转换为数字: 例如:intval(‘dsa1’)=0 intval(‘12dfjkhjkdf111’)=12 因此payload为?num=4476djfj 可以使用不同的数字类型的数据,如浮点数 num=4476.0 另解:由于intval()函数可以有多个参数 intval(
v
a
r
,
var,
v a r , base) 这里的base表示进制,
base可取:0 —八进制 0x —十六进制 0b --二进制 不填默认十进制 因此 num=010574或num=0x117c 也可以得到flag 前面添加+号,intval(‘+4476’) 会转换为4476 知识点:intval() 转换特性 题目:web 91
题目: 解题思路:代码的解释:get一个cmd参数,要通过第一个正则表达式成功,第二个失败,才会输出flag:分析一下两个表达式:
首先看看区别,第二个比第一个少了个m修饰,表示多行模式匹配,第二个单行匹配, 中间//之间的是要匹配的内容, ^表示匹配字符串开始, $表示字符串结尾, i表示不区分大小写,也就是php Php PHP这样的都可以匹配, 由于第一个有m,那就说明是匹配的是每一行的开头和结尾,有一行满足即可而不是字符串的开头和结尾 所以ccc%0aphp也可以得到flag 因此可以让他通过第一个,通过包含换行符,这里首先尝试了 PHP\nphp发现不行 于是再利用换行符的url编码试试: PHP%0aphp:成功 知识点:preg_match()多行匹配 题目:web 92
题目: 解题思路:之前解释过intval(还有第二个参数base表示进制),这里0表示八进制,于是进行转换: num=010574得到flag: 看了别人的解法了解到还可以利用intval()函数对于科学计数法的处理机制题:由于这里$num==4476这里的比较:
这里进行的是字符串与整数的比较:
在PHP中,字符串与整数比较时,字符串会尝试被转换为整数 如果 $num 字符串以数字开头,它会被转换为那个数字;否则,转换为0 因此,如果 $num 是 “4476”(或任何以4476开头的字符串),这个条件为假 但如果 $num 是像 “4476abc” 这样的值,它仍然会被视为不等于4476(因为转换停止在第一个非数字字符) intval(4476e2)的处理,这样会当作科学记数法处理,但是如果后面添加了进制,那么就会出现: 因此可以利用这一点 构造 num=4476e2 也可以得到结果 知识点:intval()函数特性 题目:web 93
题目: 解题思路:寓上一题类似,多加限制,不能输入字母,也就是不能使用二进制0b和十六进制0x但对之前的payload无影响:num=010574 知识点:intval()特性 题目:web 94
题目: 解题思路:分析题目 可以知道:这里判断num是否值和类型和4476相同,然后判断是否含有字母,并且判断0的位置,如果不含0或者0在开头第一个位置,均不可,最后再判断intval处理后是否等于4476,因此构造payload:num中要 有0,但是不能再第一位,于是可以 加个+ :num=+10574: 也可利用浮点数绕过 num=4476.0: 另解:通过空白符(换行符、制表符、空格等)也可以绕过第一个字符不为0,但是又包含0的限制 知识点:strpos()函数
int strpos ( string $haystack , mixed $needle [ , int $offset = 0 ] )
参数说明
$haystack : 要搜索的字符串(母字符串)。
$needle : 需要查找的字符或字符串(子字符串)。
$offset : 可选参数。指定开始搜索的位置。如果为负数,则从字符串末尾开始。
返回值
返回 needle 在 haystack 中首次出现的位置(从 0 开始计数)。
如果未找到 needle,则返回 false 。
题目:web 95
题目: 解题思路:比上一个题目多了一个点号的过滤,就不能使用小数绕过,可以使用空白符或者+号进行绕过:使用空格: 使用+号: 题目:web 96
题目: 解题思路:看起来flag在flag.php 内,现在就是要想办法查看flag.php 的内容,而这里直接是完全过滤了flag.php,由于是当前目录,可以使用./flag.php来代替表达 知识点:linux下当前目录的表示 题目:web 97
题目: 解题思路:分析代码,这里是一个MD5的强类型比较,可以使用fastcoll工具来获得符合要求的字符串: 这里通过抓包上传,hackbar会出现问题: 得到结果 知识点:强类型比较绕过 题目:web 98
题目: 解题思路:看到题目代码,还是有点小懵逼,后来认真看了一会,发现他是这样一个逻辑:包含文件flag.php,后面是一连串的四个三木运算符,XXX?语句1:语句2 意思是XXX条件如果成立,返回语句1的结果,否则返回语句2的结果。那么第一句的意思就是:判断全局变量
G
E
T
对应的数组是否为空,不为空的话,将
_GET 对应的数组是否为空,不为空的话,将
G ET 对应的数组是否为空,不为空的话,将 _POST全局变量对应的数组的地址赋给
G
E
T
,
也就是让两个数组指向同一个地址,如果为空的话,就返回
f
l
a
g
这个字符串,但是不进行赋值操作,后两句同样的道理,只不过是判断有没有
g
e
t
到一个名
f
l
a
g
的变量,并且值为
f
l
a
g
,由于我们最终目标是获取
_GET,也就是让两个数组指向同一个地址,如果为空的话,就返回flag这个字符串,但是不进行赋值操作,后两句同样的道理,只不过是判断有没有get到一个名flag的变量,并且值为flag,由于我们最终目标是获取
G ET , 也就是让两个数组指向同一个地址,如果为空的话,就返回 f l a g 这个字符串,但是不进行赋值操作,后两句同样的道理,只不过是判断有没有 g e t 到一个名 f l a g 的变量,并且值为 f l a g ,由于我们最终目标是获取 flag,于是,我们就得让
G
E
T
的全局数组里面有
H
T
T
P
F
L
A
G
这个参数,并且等于
f
l
a
g
,于是我们
g
e
t
一个
H
T
T
P
F
L
A
G
=
f
l
a
g
,既然
_GET的全局数组里面有HTTP_FLAG这个参数,并且等于flag,于是我们get一个HTTP_FLAG=flag,既然
G ET 的全局数组里面有 H TT P F L A G 这个参数,并且等于 f l a g ,于是我们 g e t 一个 H TT P F L A G = f l a g ,既然 _GET数组不为空,那么就会执行KaTeX parse error: Expected 'EOF', got '&' at position 6: _GET=&̲ _POST这个语句,也就是让两者执行同一块地址,于是我们也要post一个HTTP_FLAG,值为flag,得到结果: 知识点:超级全局数组
1. $_GET
定义: 用于收集通过 URL 查询字符串传递的数据。通常在HTTP GET 请求中使用。
使用场景: 当你在表单中指定了 method= "get" ,或者在 URL 中直接传递查询参数时。
示例:
echo $_GET [ 'name' ] ;
echo $_GET [ 'age' ] ;
2. $_POST
定义: 用于收集通过 HTTP POST 方法发送的数据。一般在表单提交时使用。
使用场景: 当表单的数据通过 method= "post" 发送时。
示例:
echo $_POST [ 'username' ] ;
3. $_REQUEST
定义: 包含 $_GET 、$_POST 和 $_COOKIE 的内容,提供了一种访问不同请求类型数据的简便方法。
使用场景: 当不确定数据来自哪里时,可以使用 $_REQUEST 。
示例:
echo $_REQUEST [ 'name' ] ;
4. $_COOKIE
定义: 用于访问 HTTP cookies 的数据。
使用场景: 当服务器或者客户端设置 cookies 时。
示例:
echo $_COOKIE [ 'user' ] ;
5. $_SESSION
定义: 存储用户会话数据。必须在使用前开启会话(使用 session_start ( ) )。
使用场景: 当用户需要在多个页面之间保持状态时(如登录状态)。
示例:
session_start ( ) ;
$_SESSION [ 'username' ] = 'John' ;
echo $_SESSION [ 'username' ] ;
6. $_SERVER
定义: 包含关于服务器环境的信息和客户端请求的信息。
使用场景: 用于获取服务器信息(如请求头、脚本路径、访问的URL 等)。
示例:
echo $_SERVER [ 'HTTP_USER_AGENT' ] ;
echo $_SERVER [ 'REQUEST_METHOD' ] ;
7. $_FILES
定义: 用于通过 HTTP POST 方法上传的文件信息。
使用场景: 当表单中包含文件上传字段时。
示例:
if ( $_FILES [ 'uploaded_file' ] [ 'error' ] == UPLOAD_ERR_OK ) {
echo $_FILES [ 'uploaded_file' ] [ 'name' ] ;
}
题目:web 99
题目: 解题思路:先分析代码,首先通过allow获取一个空数组,后来将其产生的随机数添加到数组中去,这段代码包含一个 <font style="color:rgb(251, 71, 135);">for</font>
循环,从 <font style="color:rgb(251, 71, 135);">36</font>
开始到 <font style="color:rgb(251, 71, 135);">0x36d</font>
(即 877 的十六进制表示)。在每次循环中,使用 <font style="color:rgb(251, 71, 135);">rand(1, $i)</font>
生成一个在 <font style="color:rgb(251, 71, 135);">1</font>
和 <font style="color:rgb(251, 71, 135);">$i</font>
之间的随机整数,并将其推入 <font style="color:rgb(251, 71, 135);">$allow</font>
数组中。这个过程将填充 <font style="color:rgb(251, 71, 135);">$allow</font>
数组,以包含多个随机数。具体会填充多少个随机数取决于循环的执行次数(即 <font style="color:rgb(251, 71, 135);">0x36d - 36 = 841</font>
次)。 然后,检查 GET 请求中是否存在名为 <font style="color:rgb(251, 71, 135);">n</font>
的参数,并且该参数的值是否在 <font style="color:rgb(251, 71, 135);">$allow</font>
数组中。<font style="color:rgb(251, 71, 135);">isset($_GET['n'])</font>
确定 <font style="color:rgb(251, 71, 135);">'n'</font>
参数是否存在,<font style="color:rgb(251, 71, 135);">in_array($_GET['n'], $allow)</font>
确定这个参数的值是否在之前填充的 <font style="color:rgb(251, 71, 135);">$allow</font>
数组中。如果这两个条件成立:<font style="color:rgb(251, 71, 135);">file_put_contents($_GET['n'], $_POST['content']);</font>
将 <font style="color:rgb(251, 71, 135);">$_POST['content']</font>
的内容写入一个由 <font style="color:rgb(251, 71, 135);">n</font>
参数指定的文件。这里in_array()函数有一个漏洞,如果不设置第三个参数,那么,这里进行的就是弱类型比较,eg:<font style="color:rgba(0, 0, 0, 0.88);">1.php==1</font>
显示为true,那么这里就可以讲一段PHP代码写入文件,文件名选择可以满足条件的1-877均可,这里选择出现频率高的,比如1,2这样的,这里选择2:并且写入php木马,访问让其执行 发现flag的位置 进行访问:得到flag 知识点:in_array()函数特性,不设置第三个参数时进行弱类型比较 题目:web 100 1. 题目: 2. 解题思路:我们知道,flag的信息在类ctfshow里面,于是,就想办法查看这个类的信息,刚好,有一个这个类的对象可以利用。这里主要是考查了_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">v</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">0=</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">isnumeric</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">(</font><font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">v1) and is_numeric(</font><font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">v2)andisnumeric(</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">v</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">2)</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">andisnumeric</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">(</font><font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">v3);</font>
这一句的执行顺序__ 首先先给v0变量赋值,相当于是v0只和v1有关,
在 PHP 中,赋值操作符 = 的优先级低于逻辑操作符 and 。
这意味着在没有括号的情况下,表达式中的逻辑运算会先于赋值运算执行。
例子分析
考虑以下代码:
$v0 = true and false ;
在这种情况下,表达式实际上等同于:
( $v0 = true ) and false ;
这意味着 true 被赋值给 $v0 ,然后执行逻辑运算 and false ,但 $v0 的值已经是 true 了。
因此,最终 $v0 的值为 true 。
1. 于是只需要v1是数字,v2没有分号,v3含有分号,就可以执行eval函数,从而获取到相应信息,eval里面的参数可以通过命令拼接的方法进行执行:因此 v1=1&v2=var_dump($ctfshow)/*&v3=*/;![](https://cdn.nlark.com/yuque/0/2025/png/39210681/1738754522408-b52ff8e3-c653-4718-9aa5-49c727d40944.png)
3. 知识点:var_dump<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(242, 247, 255);">可以得到该对象的详细信息,包括对象的类型、属性、属性的值以及属性的可见性(public、protected、private)。 </font><font style="color:rgba(0, 0, 0, 0.88);"> </font>