前言
感觉了解php特性是基础,所以决定先做这部分。
Web89(pg_match和intval)
两步,绕过正则,intval不为0。采取传入数组的方式绕过:
pg_match()只能处理字符串,如果处理数组会返回false;intval如果传入数组,会返回。payload:
?num[]=
Web90(intval)
intval处理开头是数字的字符串时,返回值为开头的数,这个大家都比较熟悉了。payload:
?num=a
Web9(正则匹配多行模式)
本题中的正则:^表示表达式开头,$表示表达式结尾,i表示不区分大小写,m表示多行模式,这个多行模式具体是什么意思呢,看一下下面的结果:
上面两幅图中,左边的输出结果是no,右边的输出结果是success。所以多行模式的意思是每一行都进行正则匹配。右侧图中,第一行末尾为php,所以返回了true;左侧没开启多行,虽然有\n但也只有一行。所以本题的第一个正则是要求分行后至少有一行是字符串"php",第二个正则只能匹配字符串"php",所以传一个:
?cmd=php%0aphp//或aaa%0aphp,php%0abbb都可
这里还要说一下,URL的换行符是%0a,\n不起换行作用,因为URL编码中斜杠并不是转义字符,\n只是普通的字符串而已。
Web9(intval)
第一个判断变成弱类型比较,所以不能用a绕过。重点是intval的第二个参数base,base=0时,intval会自动探测num的进制:
如果num以0x开头,那么按6进制转换;如果num以0开头,默认按8进制转换;否则使用0进制。
所以这个题用6进制绕过即可,payload:
?num=0x7c
第一个弱类型会把0x7c转成0,绕过比较,第二个会进行进制转换,判断通过。
Web93(intval)
和上一题相比,这道题加了个正则匹配,不能出现字母,使用8进制绕过即可。在进行弱类型比较的时候,==。
Web94(intval)
时刻要注意num是个字符串,只要在后面用字符截断,即可绕过弱类型比较。关键是多了个strpos,这个函数的位置很巧妙,它要求num中必须有0,但还不能在开头,所以传入一个浮点数:
?num=.0
强类型比较通过,正则通过,含0且不在头部,intval转换后是,拿到flag。
Web95(intval)
多过滤了一个点,可以用8进制前面加个+绕过。在反序列化绕过正则时也有相似应用。intval接收+还是会转为。
关于intval的常见输出
Web96(按路径读取文件)
想办法读取flag.php,但还不能直接传flag.php,这里我们利用路径问题来读,传入payload:
?u=./flag.php
利用路径绕过比较。
Web97(md5函数漏洞)
md5函数是不能处理数组的,处理数组会返回null,所以传两个数组进去,null===null,成功绕过。
Web98(审计,传参,取址运算符)
什么卵代码,搜一下。
php中取值运算符""表示引用,比如$b=$a表示变量b是变量a的一个引用,相当于同一个变量两个名字,一个变化另一个也跟着变化。通常的赋值语句$b=$a相当于copy了一个a的副本给b,b变化a不变化。取址就相当于把根刨了。
第一句:如果传入get参数,则get参数变成post的参数。
第二句:如果get的flag参数等于字符串"flag",那么get的参数变成cookie的参数。
第三句:如果get的flag参数等于字符串"flag",那么get的参数变成server的参数。
第四句:如果get传入HTTP_FLAG参数的值是字符串"flag",那么高亮显示$flag变量对应的文件,否则就是当前文件。
分析完之后发现很简单,只要get一个HTTP_FLAG变量就好了,但是get会变成post啊,所以保证post一个HTTP_FLAG=flag。至于get就随便get一个,不能不get,不get不能触发第一条语句的。
Web99(审计,in_array)
先了解一下这些个函数:
array():创建一个数组
array_push():将一个或多个元素插入数组末尾(入栈)
in_array():检查数组中是否存在指定元素,第三个参数strict不指定默认为宽松比较
file_put_contents():将数据写入文件中,相当于fopen()+fwrite()+fclose()
这里就要用到in_array的漏洞了,如果我们传递n=.php,那么根据宽松比较.php==,是可以绕过的。get一个n=.php,向其中写入一句话木马?php
eval($_POST[]);?,蚁剑连接即可。php中关于array的函数可以参考: