WEB-Filter(过滤绕过)
解析:首先调用了filter函数,str_replace()函数将出现的0x,0,.,e,+分别都替换为1,函数处理后将num的值返回,is_numeric($num)检查给定的变量是否为数字或数字字符串,$num!=='36'判断变量 $num
的值是否不等于字符串 ‘36’,trim($num)!=='36'判断通过 trim()
函数处理后的变量 $num
的值是否不等于字符串 ‘36’,filter($num)=='36'进行过滤检查给定的变量是否为36。综上所述,给定的变量num经过函数的处理要等于36才可以输出flag,但是直接赋值36却会报错
payload:/?num=%0c36
%0c解码后是\n(换行符)
PHP Filter 简介
PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤
WEB-简单的正则(考点:正则)
<?php
error_reporting(0); // 设置错误报告级别为0,即禁用错误报告
highlight_file(__FILE__); // 在浏览器中突出显示当前文件的源代码
include("flag.php"); // 导入 flag.php 文件的内容
if(isset($_GET['f'])){ // 检查是否存在名为 'f' 的 GET 请求参数
$f = $_GET['f']; // 将 GET 请求参数 'f' 的值赋给变量 $f
if(preg_match('/.+?zkaqzkaq/is', $f)){ // 使用正则表达式匹配字符串 'zkaqzkaq'
die('bye!'); // 如果匹配成功,终止脚本并显示 'bye!'
}
if(stripos($f, 'zkaqzkaq') === FALSE){ // 检查字符串 'zkaqzkaq' 是否存在于 $f 中
die('bye!!'); // 如果不包含,终止脚本并显示 'bye!!'
}
echo $flag; // 如果前面两个条件均不成立,则将变量 $flag 的值输出
}
按照题目提示及题目函数提示该题有两种解法
php特性:
preg_match不识别数组,否则返回false,匹配一次返回1,没有返回0
if(0===flase)返回值为false,0不是强等于false的
stripos函数对数组不识别,遇到数组会返回false
方法一
payload:?f=zkaqzkaq[]
方法二:
采用数组绕过的方法,stripos函数会返回null,null!=false,所以可以绕过stripos函数
payload:?f[]=666
但是该题构造:/?f=zkaqzkaq就可以得到flag
错误
这道题的正则表示式是错误的
/.+?zkaqzkaq/is
/
:表示正则表达式的开始。
.+?
:使用非贪婪模式匹配任意数量的字符,包括空格、制表符和换行符。
zkaqzkaq
:精确匹配一个字符串"zkaqzkaq"。
/
:分隔符,表示正则表达式的结束。
i
:模式修饰符,表示忽略大小写。
s
:模式修饰符,表示"."可以匹配包括换行符在内的所有字符
既然后面让匹配包括换行符在内的所有字符,但是前面又给出了一个字符串来匹配,所以这道题在逻辑上存在问题,即解题时本来要用数组绕过才有flag,但现在直接传给定的字符串就可以得到flag(不知道这样理解对不对)
preg_match()函数
preg_match()
函数用于检测一个字符串是否与正则表达式模式匹配。它会从字符串的起始位置开始搜索,并返回第一个匹配结果。匹配到符合的元素返回1,没有匹配到符合的元素返回0,发生错误返回false。该函数不识别数组,识别字符串。
stripos()函数
stripos()函数是PHP中的一个字符串函数,用于在字符串中查找子字符串(不区分大小写)。它的作用是返回第一次出现子字符串的位置,或者在未找到子字符串时返回false。
WEB-PHP弱类型1(考点:PHP弱类型)
一眼看去就是传参num,但是传参的字符串经过intval()函数处理的,处理后的字符串是整数类型,正好符合num=123,所以构造的payload只要处理后的数值为123就可以得到flag
payload:/?num=123.123445
/?num=123a
intval()
函数
intval()
函数用于将变量的值转换为整数类型。它的作用是将变量转换为整数,并返回结果。
WEB-PHP弱类型2(考点:PHP弱类型)
is_numeric()要求传入的字符串不能是纯数字,而且传入的字符串数值要大于1024,两个条件同时满足才会得到flag,这道题和上面的差不多
payload:/?num=12345a(数字部分要大于1024,后面随便加一个字母)
is_numeric()函数
is_numeric()
是一个 PHP 函数,用于检查变量是否为数字或数字字符串。
WEB-PHP弱类型3(考点:PHP弱类型)
这道题最主要的就是后面的两个条件语句,先限制传入的参数number的字符串个数要小于3,其次,传入的参数number与参数b比较数值大小,相等或者大于就可以得到flag,按照逻辑表述传入的字符串个数小于3,并且数值大小要和100相等,就可以得到flag,但是并不存在这样的字符串,所以就选择绕过函数,strcmp函数不识别数组,识别后会报错,所以就选择数组绕过
payload:/?number[]=666
strcmp()函数
strcmp()
是一个 PHP 函数,用于比较两个字符串是否相同。该函数比较两个字符串的字典序,即按照从左到右的顺序比较两个字符串中对应位置的字符大小。
strlen()函数
strlen()
是一个 PHP 函数,用于获取一个字符串的长度(字符个数)。
WEB-strlen+intval绕过
传入的参数字符串的字符个数小于4,参数数值转化为整数时再加1要大于500000,才可以得到flag,这道试过用数组来绕过,但是没用,那就想什么数的字符串个数小于4,并且加上1还大于500000,这是就应该想起科学计数法,科学计数法中,5e5 表示的是 5 × 10^5,也就是 500000,
payload:/?num=5e5(e后面的数值=>5均可)
WEB-简单反序列化(考点:反序列化)
这是一道简单的反序列化,直接到php在线网址上运行
WEB-登录(考点:sha1函数绕过)
发现使用sha1函数处理以后的用户名和密码只要相等,就会得到flag,但我们又不能让用户名和密码相同。所以就要想到绕过,
sha1函数不能处理数组的,当我们传入的是一个数组,那么就会返回FALSE,所以这里我们可以用户名和密码都传数组,这样就是FALSE===FALSE,自然就是TRUE了
payload:/?username[]=a&password[]=b
WEB-谁的平方等于零?(考点:PHP中的科学计数法)
传入的参数a字符串长度小于7,并且a不等于0,但a的平方要等于0
此题可以用到科学计数法
php特性
php有一个特性是,小数点后超过161位做平方运算时会被截断,我们可以用科学计数法来代替,即1e-162
payload: /?a=1e-162