刷题学习记录(封神台)

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值