PHP代码安全4-- ==逻辑与函数缺陷

三.PHP代码特性漏洞

主要集中于两点:

1.过滤函数缺陷绕过

2.CTF与代码审计

0.知识架构

请添加图片描述

php中出问题大多在于代码自身而言,而 JAVA则是由于框架问题居多。本文主要针对网络安全中出现的php过滤的绕过方法记录

一.PHP代码逻辑运算符问题

重点: == 与 ===

==:弱类型比较,只会比较式子两端的最终值。

===:强类型比较,不仅会比较值还会比较函数类型

1.1 弱类型与=
<?php
header("Content-Type:text/html;charset=utf-8");
$flag='xiaodi ai chi xigua!';

//1、== ===缺陷绕过 == 弱类型对比 ===还会比较类型
$a=1;
if($a==$_GET['x']){
    echo $flag;
}
//强类型时只能为数字1
$a='1';
if($a===$_GET['y']){
    echo $flag;
}

此时对于x传参为1.0 或者+1或1a均可实现绕过处理(弱类型),强类型只能为数字1。

1.2 MD5加密可能出现问题

1.md5,sha1()加密解析问题 ,对于某些特殊的字符串加密后得到的密文以0e开头,PHP会当作科学计数法来处理,也就是0的n次方,得到的值比较的时候都相同

2.md5是一种散列函数,对数组加密后密文为null

3.密码碰撞攻击

  1. //echo MD5(‘QNKCDZO’);//echo MD5(‘240610708’);该二者的md5值均0e开头

  2. if($_GET['name'] != $_GET['password']){
        if(MD5($_GET['name']) == MD5($_GET['password'])){
            echo $flag;
        }
        echo '?';
    }
    

采用如下输入依然会输出触发flag:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHXUmPHE-1678454758729)(3.PHP代码特性漏洞.assets/image-20230309193041518.png)]


二.函数缺陷绕过
2.1intval缺陷

函数功能:进行进制转换为10进制,且只保留整数部分

绕过思路:可采取其他进制的数值来进行相应的绕过处理,且在转换数组时转换为1,intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1,关于转换数组的事情,intval会将数组转换为1

$ii=$_GET['n'];

if(intval($ii==$i)){
  echo $flag;
}// 666.0 +666

2.2strpos函数缺陷

strpos(“源字符串”,"目标字符串“) 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)

通常在判断中会进行出现。

strpos(string,find,start)有三个参数,string是被检查的字符串,find是要被搜索的字符串,start是开始检索的位置,从0开始。若未找到匹配则返回null(故可采取数组进行绕过。)

<?php
$flag = "flag";
if (isset ($_GET['ctf'])) {
if (@ereg ("^[1-9]+$", $_GET['ctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['ctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
?>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VHCzMNeE-1678454758730)(3.PHP代码特性漏洞.assets/image-20230309231558787.png)]

$i='666';

$ii=$_GET['h'];

if(strpos($ii==$i,"0")){

 echo $flag;

}/4、对于strpos()函数,我们可以利用换行进行绕过(%0a,换行后找到的位置就不是0

2.3 in_array函数问题

功能:在数组中进行检索,返回true或false

in_array("Mark", 被测字符串,第三个参数)

若第三个参数未设置true,则有

#以下,'7eee'被强制转换成整型 7,即只保留首位
var_dump(in_array('7eee', [1, 2, 7, 9]));//true
 
#如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true。
var_dump(in_array('7eee', [1, 2, 7, 9], true));//false

2.4 preg_mach函数问题

php代码中的老熟人了,经常混迹于各大检测与ctf代码审计中,preg_match限制处理字符串(正则表达式),如果不按规定传一个字符串,通常是传一个数组进去,这样就会报错。

if(isset($_GET['num'])){
    $num = $_GET['num'];
    if(preg_match("/[0-9]/", $num)){
        die("no no no!"); //打印输出
    }
    if(intval($num)){
        echo $flag ,'<br>';
        echo intval($num);
    }
}  //采用数组进行绕过 //?num[]=1  

2.5 str_replace函数问题

功能:该函数的功能是php中将指定的一些字符串替换为其他自定义的字符串,且区分大小写

该函数通常应用于sql语句规范化的操作上。

str_replace(被替换字符,替换后字符,原串,替换次数[可选])

PHP str_replace() 函数 (w3school.com.cn)

问题:str_replace替换次数不写时默认替换一次,则无法进行迭代替换

//7、str_replace无法迭代过滤
$sql=$_GET['s'];
$sql=str_replace('select','',$sql);
echo $sql;
//?s=sselectelect
?>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值