草庐IT

2021 虎符杯hate num 注入题

前言今天遇到个有意思的SQL盲注,花了不少功夫,也学到了新姿势,遂记录下来以备后续碰到相同场景使用。题目这是2021虎符杯的一道web题,有一个目标站点且附带了源码。源码内容包括:主要逻辑在login.php与config.php,删去多余代码,主要功能在登陆上。前端登录表单会发送给login.php处理:然后所有的post参数会交给config.php中的array_waf去做处理.array_waf是一个递归检测的waf,检测是否包含sql_waf和num_waf在内的规则,符合规则直接退出。经过检测后会进入config.php中的login函数进行数据库查询。可以看到login函数直接将

2021 虎符杯hate num 注入题

前言今天遇到个有意思的SQL盲注,花了不少功夫,也学到了新姿势,遂记录下来以备后续碰到相同场景使用。题目这是2021虎符杯的一道web题,有一个目标站点且附带了源码。源码内容包括:主要逻辑在login.php与config.php,删去多余代码,主要功能在登陆上。前端登录表单会发送给login.php处理:然后所有的post参数会交给config.php中的array_waf去做处理.array_waf是一个递归检测的waf,检测是否包含sql_waf和num_waf在内的规则,符合规则直接退出。经过检测后会进入config.php中的login函数进行数据库查询。可以看到login函数直接将

LeetCode-45. 跳跃游戏II - 题解分析

题目来源45.跳跃游戏II题目详情给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums[i+j]处:0i+j返回到达 nums[n-1]的最小跳跃次数。生成的测试用例可以到达nums[n-1]。示例1:输入:nums=[2,3,1,1,4]输出:2解释:跳到最后一个位置的最小跳跃数是2。 从下标为0跳到下标为1的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。示例2:输入:nums=[2,3,0,1,4]输出:2提示:10题目保证可以到达 nums[n-1]

LeetCode-45. 跳跃游戏II - 题解分析

题目来源45.跳跃游戏II题目详情给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums[i+j]处:0i+j返回到达 nums[n-1]的最小跳跃次数。生成的测试用例可以到达nums[n-1]。示例1:输入:nums=[2,3,1,1,4]输出:2解释:跳到最后一个位置的最小跳跃数是2。 从下标为0跳到下标为1的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。示例2:输入:nums=[2,3,0,1,4]输出:2提示:10题目保证可以到达 nums[n-1]

力扣55. 跳跃游戏

55.跳跃游戏55.跳跃游戏难度:中等给定一个非负整数数组 nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。** **示例 1:输入:nums=[2,3,1,1,4]输出:true解释:可以先跳1步,从下标0到达下标1,然后再从下标1跳3步到达最后一个下标。示例 2:输入:nums=[3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为3的位置。但该下标的最大跳跃长度是0,所以永远不可能到达最后一个下标。分析:用贪心法,遍历数组每个元素,记录从当前下标和对应的元素,确定能够到达的最大距离,若大于当前最大距离则

力扣55. 跳跃游戏

55.跳跃游戏55.跳跃游戏难度:中等给定一个非负整数数组 nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。** **示例 1:输入:nums=[2,3,1,1,4]输出:true解释:可以先跳1步,从下标0到达下标1,然后再从下标1跳3步到达最后一个下标。示例 2:输入:nums=[3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为3的位置。但该下标的最大跳跃长度是0,所以永远不可能到达最后一个下标。分析:用贪心法,遍历数组每个元素,记录从当前下标和对应的元素,确定能够到达的最大距离,若大于当前最大距离则

[牛客BM49&LeetCode227]基本计算器-双栈递归方法-最易理解

双栈+递归方法比目前官网题解更容易理解且简单的方法。双栈:一个栈用于存放数字,一个用于存放符号。递归:括号内表达式求值作为返回值,减少处理括号时边界条件的难度。基本思想:参考人计算的思维,如果[后入栈的运算符优先级]大于[先入栈的运算符优先级],那么进行计算。奇怪的细节:1.考虑字符串开始就有可能出现负号和正号,因此在两个栈的开头分别插入'0'、'-'或'0'、'+'。2.int相加时中间结果可能溢出,使用longlong保存结果。另外:这里使用递归和传统递归模板不同,传统模板如下:=1=if(终止条件)return;=2=[向下传递时]逻辑处理(可能有,也可能没有,具体问题具体分析)=3=递

[牛客BM49&LeetCode227]基本计算器-双栈递归方法-最易理解

双栈+递归方法比目前官网题解更容易理解且简单的方法。双栈:一个栈用于存放数字,一个用于存放符号。递归:括号内表达式求值作为返回值,减少处理括号时边界条件的难度。基本思想:参考人计算的思维,如果[后入栈的运算符优先级]大于[先入栈的运算符优先级],那么进行计算。奇怪的细节:1.考虑字符串开始就有可能出现负号和正号,因此在两个栈的开头分别插入'0'、'-'或'0'、'+'。2.int相加时中间结果可能溢出,使用longlong保存结果。另外:这里使用递归和传统递归模板不同,传统模板如下:=1=if(终止条件)return;=2=[向下传递时]逻辑处理(可能有,也可能没有,具体问题具体分析)=3=递

LeetCode - 数组的改变和移动

1.数组的改变和移动总结1.1数组的改变数组在内存中是一块连续的内存空间,我们可以直接通过下标进行访问,并进行修改。在Java中,对于List类型来说,我们可以通过set(idx,element)方法将idx位置的元素进行修改。1.2数组的移动数组的移动不能通过一条语句来实现,通常来说需要通过:插入、删除或者多次交换来实现。1.3数组的插入数组的插入比较麻烦,我们想要在下标为k的位置插入一个元素时,首先需要将k及以后的元素往后移动一个位置,然后再将元素插入到k的位置处。在Java中,对于List类型来说,我们可以通过add(idx,element)方法将元素添加到idx下标处。1.4数组的删除

LeetCode - 统计数组中的元素

1.统计数组中元素总结1.1统计元素出现的次数为了统计元素出现的次数,我们肯定需要一个map来记录每个数组以及对应数字出现的频次。这里map的选择比较有讲究:如果数据的范围有限制,如:只有小写字母、1000以内的正数等,这时我们可以通过一个数组来充当map;如果数据的范围没有限制,或者数据范围很大:如:int的数据范围,这时我们可以通过HashMap存储对应的key和value;可参考代码:for(inti=0;i1.2⭐统计元素在数组中出现的最左和最右位置首先想清楚一个问题:从左到右遍历,最后遍历到的就是最右元素;从右到左遍历,最后遍历到的就是最左元素;我们就可以依据此,创建left和rig