Web89
正则匹配,类型转换
源码
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}
intval() 函数用于获取变量的整数值
这里主要是这个函数
if(preg_match("/[0-9]/", num)) 用正则表达式匹配输入值 num,如果存在数字,则返回错误信息 "no no no!" 并终止程序。
Intval() //这个函数是类型转换,也就是转为整形
类型转换点击前往
因此num满足以上即可输出 flag.php
/?num[]=1
web90
进制转换绕过
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}else{
echo intval($num,0);
intval() 函数是 PHP 中的一个内置函数,用于将给定的变量转换为整数。它的语法如下:
intval ( mixed $var , int $base = 10 ) : int
其中,第一个参数 $var 是要转换为整数的变量,可以是字符串、浮点数、布尔值等,第二个参数 $base 是可选的,表示要转换的进制数,默认为十进制。
例如:
$num1 = 123.45;
$num2 = "678.90";
$num3 = true;
$num4 = "0x1a";
$num5 = "010";
echo intval($num1); // 输出 123
echo intval($num2); // 输出 678
echo intval($num3); // 输出 1
echo intval($num4, 16); // 输出 26(将 0x1a 转换为十进制)
echo intval($num5, 8); // 输出 8(将 010 转换为八进制)
主要还是数据类型转换第一个参数 $num 是需要转换的变量,第二个参数 0 是 转换成十进制,又要包含十进制为4476,那就是绕过这个准换之后的十进制呗
if(intval($num,0)===4476){
将变量num转为整形
最后,如果变量num既不是字符串"4476",也不能被解析为整数4476,则输出变量num既不是字符串"4476",也不能被解析为整数4476,则输出变量num的整数值。
那就是在上面基础之上payload如下:
/?num=0x117c ;同理也可以是十进制的4476//后面任意字母都可以,就是满足不等于 4476; 那八进制的4476是。10574这里前面要加一个0也就是010574
在计算机中,通常采用0x前缀来表示一个数值是十六进制数。加0是八进制,这个前缀可以帮助区分不同进制的数值,特别是在像C、C++、Java等编程语言中,可以避免误解成其他进制。
Web91
正则匹配多行绕过%0a
show_source(__FILE__)
include('flag.php')
$a =$_GET['cmd']
if (preg_match('/^php$/im', $a)){
if (preg_match('/^php$/i', $a)){
echo 'hacker'
}
else {
echo $flag
}
}
else {
echo 'nonononono'
}
主要是以 php 作为开头结尾且不区分大小写、多行匹配,还要不能以 php 作为开头结尾(不区分大小写)
^ 表示匹配字符串的开始位置;php 表示要匹配的字符串是 "php";$ 表示匹配字符串的结束位置;/m 是一个模式修饰符,表示多行匹配;/i 是另一个模式修饰符,表示忽略大小写
也就是每行都进行匹配;URL的换行符是%0a,\n不起换行作用,因为URL编码中斜杠并不是转义字符,\n只是普通的字符串而已。
所以payload : /?cmd=%0aphp
利用多行匹配 :%0a
详细介绍该漏洞可前往: Apache HTTPD 换行解析漏洞(CVE-2017-15715)与拓展_Firebasky的博客-CSDN博客
web92
弱类型比较==
include("flag.php")
highlight_file(__FILE__)
if (isset($_GET['num'])){$num = $_GET['num']
if ($num == 4476){
die("no no no!")
}
if (intval($num, 0) == 4476){
echo $flag
}else {
echo intval($num, 0)
和90差不多,使num=4476 数据类型转换为整型且是十进制的,不难发现与90少了一个等号,php是弱类型的语言;
===表示全等运算符,要求值相等且类型相等。==表示等于运算符,要求值相等(会临时的类型转化,进行若比较,所以===执行起来会比==快。
可以参照上面web90 /?num=0x117c ;’/?num=010574
web93
字母过滤,八进制绕过
和上面类似,不过是过滤了字母,那么数字可以,既是可以用八进制的010574;这里小数也可以用 /?num=4476.666
if ($num == 4476){
die("no no no!"); }
if (preg_match("/[a-z]/i", $num)){
die("no no no!");
web94
!strpos
if (isset($_GET['num'])){$num = $_GET['num'];
if ($num == ="4476"){
die("no no no!");}
if (preg_match("/[a-z]/i", $num)){
die("no no no!"); }
if (!strpos($num, "0")){
die("no no no!"); }
if (intval($num, 0) ===4476){
echo $flag;
这次是===全等运算符,那么必须是4476喽,字符是行不通了,那就试试小数,但是这句 if(!strpos($num, "0")){ ;意思是该函数用于查找字符串中是否包含某个字符串,也就是$num变量是否包含数字0,满足0不能出现在第一位,如果找不到,返回false,“!“感叹号的意思是取反逻辑,也就是true,变量中不包含0了
/?num= 空格010574 (加上空格) ;/?num=4476.0 (小数)
web95
小数点过滤 ,%09
if (preg_match("/[a-z]|\./i", $num)){
这里多了一个小数点
那可以用 /?num= 010574 等号后面第一个是空格 另外用%09和空格是一样的
还有一种是把空格换成+好也可以。
Web96
伪协议
经典的伪协议,得到的base解码就行
php://filter
/?u=./flag.php
/?u=/var/www/html/flag.php 二者都可以
web97
Md5绕过
include("flag.php")
highlight_file(__FILE__)
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag
else
print 'Wrong.'
}
?>
意思是a和B的不等,但是他的md5值相等
payload : a[]=i&b[]=kun
因为数组经过md5函数返回null,两个null强类型相等
php中的md5()
函数无法处理数组类型数据,对于数组类型数据返回NULL,当我们传入两个数组时,就会变成两个NULL,也就是NULL==NULL,成功绕过
更多md5比较 点击可前往