- web89
- web90
- web91
- web92
- web93
- web94
- web95
- web96
- web97
- web98
解答: 1)绕过preg_match()。
可以利用数组绕过,因为preg_match只能处理字符串,所以当传入的subject是数组时会返回false。
2)intval()用于获取变量的整数值。 intval()不能用于object和array,否则会产生E_NOTICE错误并返回1。
所以数组可以满足所有限制条件。payload:?num[]=
解答: 1)intval()
输入的值,如果是字符串,它返回的内容取决于字符串最左侧的字符。如intval(‘11a0’)=11。
2)我们提交的参数值默认就是字符串类型,所有输入的内容加上一个字母,就可以绕过和满足上述的两个条件限制。
payload:?num=4476a
解答:^
和$
这种的正则匹配,只匹配一行。但是正则匹配/m
可以执行多行匹配。 所以第一层条件是多行匹配php
,第二层条件是单行匹配,这样就可以用换行符%0a绕过。
payload:?num=%0aphp
解答:弱比较不能等于4476,intval()结果是4476。
可以在数字后加字母,使它变成字符串,满足intval的要求。同时,弱匹配比较时会识别e。 payload:?num=4476e123
(intval也是可以识别e的,但是是在非字符串的形式下。)
解答:过滤了字母,所以二进制(0b??
)和十六进制(0x??
)不能用,但还有八进制。
==
在进行比较的时候,会先将字符串类型转化成相同,再比较。 当数字位于整个字符串的开头时,会转换为前面的数字,其他都会转换为0。 除了e科学计数,其他字母不会被识别,所以不能识别进制转换。
payload : ?num=010574
解答:限制了字符,不能用e绕过了。不能用0开头,对进制做了限制。(但是八进制的限制可以用payload2绕过)
绕过强等于字符串“4476”,可以加小数点绕过。intval是取整并不会影响。 payload1:?num=4476.0
也可以用加号或者空格绕过。加号+
的话,url解码会认为是空格,或者输入%2b,解码为+
,intval会认为是正数,依旧可以满足条件。空格%20,或者(space)也可以绕过。 payload2:?num=+4476
解答:本题过滤了小数点,所以web94的payload1不能用了。但是payload2可以用。 第二个条件是字符限制,不能十六进制和e;第一个条件是弱等于限制,可以用8进制绕过;第三个条件不能0开头,所以可以用通过加号和空格绕过。 ?num=+010574
或者?num=%2b010574
或者?num= 010574
或者?num=%20010574
解答:字符串匹配,所以可以加上当前目录是./
绕过,所以我们的payload: u=./flag.php
解答:a和b要传值,不能相等,但是md5要强等于。 md5函数传入数组的返回值都是NULL,所以可以用数组绕过。 payload: a[]=1&b[]=2
解答:这个题目我们解析一下。 1)$_GET?$_GET=&$_POST:'flag';
三元运算符:条件表达式?表达式1:表达式2=>条件为真,结果是表达式1;条件为假,结果是表达式2。
$_GET
变量是一个数组,内容是由 HTTP的GET 方法发送的变量名称和值,类似于字典。 如果$_GET
变量不为空,则$_GET
变量和$_POST
变量指向同一个地址,即$_POST
变量内容改变,会影响$_GET
变量的内容。如果为空,整个三元表达式的结果为’flag’。就是如果echo这段代码的话,返回结果是flag。
听视频wp,原题是不是打算让$_GET
=‘flag’,但是这段代码不对呀,应该把第二个表达式写为$_GET
='flag’才行。
2)$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
如果flag变量值为’flag’,则$_GET
变量和$_COOKIE
变量指向同一个地址;否则返回flag。
3)$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
如果flag变量值为’flag’,则$_GET
变量和$_SERVER
变量指向同一个地址;否则返回flag。
4)highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
高亮输出结果。如果HTTP_FLAG变量值为’flag’,输出$flag,否则输出当前文件。
所以目标就是get传参让HTTP_FLAG=flag。 get传参了,势必要执行第一个三元运算的$_GET=&$_POST:
,所以 POST也需要传递一个同样的HTTP_FLAG=flag。 因为没有get传参flag,所以中间两个条件都会false,返回结果’flag’,不影响结果。