三.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.密码碰撞攻击
-
//echo MD5(‘QNKCDZO’);//echo MD5(‘240610708’);该二者的md5值均0e开头
-
if($_GET['name'] != $_GET['password']){ if(MD5($_GET['name']) == MD5($_GET['password'])){ echo $flag; } echo '?'; }
采用如下输入依然会输出触发flag:
二.函数缺陷绕过
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 '骚年,继续努力吧啊~';
}
?>
$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
?>