PHP代码审计中常见漏洞函数有哪些

  

PHP代码审计中常见漏洞函数有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

前言

PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,免费并且使用非常广泛。PHP环境目前的搭建也相当简单,可使用PhpStudy等工具一步到位。

除了除理论上去解释PHP常见函数的漏洞利用,更结合周大福题目,实战解释。

众所周知,PHP一门弱类型的脚本语言,这里介绍的漏洞,均是是从<强>类型转换缺陷,类型转换不严强入手。

1. is_numeric类型缺陷转换

PHP提供了is_numeric函数,用来判断变量是否为数字。PHP弱类型语言的一个特性,当一个整型和一个其他类型行比较的时候,会先把其他类型intval中数字化再比。

intval中(),函数用于获取变量的整数值。

 & lt; PHP ?
  ,,,error_reporting (0),,,
  ,,,//,关闭错误报告
  ,,,flag 美元;=,& # 39;旗帜{is_numeric_pass} & # 39;;
  ,,,//,新建一个变量,值为:国旗{is_numeric_pass}
  ,,,a 美元;=,$ _GET[& # 39;一个# 39;];
  ,,,//,新建一个变量,以得到的形式赋值
  ,,,is_numeric(美元)?死亡(“对不起....“):空;
  ,,,//通过,is_numeric函数,判断id是否为数字,如果为数字,则结束,输出sorry ,,,
  ,,,如果(a> 2019美元){
  ,,,//,若一个大于2019输出国旗
  ,,,,,,,echo  $国旗;
  ,,,},
  比;//解题思路,要求输入一个大于2019的数字才能获取国旗,但是如果变量为数字就结束程序,陷入矛盾,//利用PHP弱类型比较的特点,一个其他类型与整型比较时,会将其他类型自动取整型再比较,利用此特性绕过,即赋值为10000 abc,绕过

构造载荷:http://192.168.200.148/php_lab/lab1.php?一个=10000

 PHP代码审计中常见漏洞函数有哪些“> </p> <h4> 2.哈希比较缺陷</h4> <pre> & lt; PHP ?
  ,,,md51 美元;=,md5 (& # 39; 240610708 & # 39;);
  ,,,a 美元;=,@ $ _GET[& # 39;一个# 39;];
  ,,,md52 美元;=,@md5(美元);
  ,,,如果(收取(美元)){
  ,,,,,,,if  (a 美元;!=,& # 39;240610708 & # 39;,,,,md51 美元;==,md52美元),{
  ,,,,,,,,,,,echo “国旗{md5_pass}“;
  ,,,,,,,},{else 
  ,,,,,,,,,,,echo “false

该函数要求我们输入一个,这一个不能是240610708,但是要求其MD5值是一致,同样陷入矛盾困局。

此时还是利用PHP弱类型缺陷

首先240610708的MD5值为:0 e462097431906509019562988736854

这里是0 e开头的,在进行等于比较的时候,PHP把它当作科学计数法,0的无论多少次方都是零,所以这里利用弱类型的比较的缺陷来进行解题:如果MD5的值是0 e以开头的,那么就与其他的0 e开头的MD5值是相等的。我们找到:s1885207154a,其MD5为:0 e509367213418206700842008763514

构造载荷:http://192.168.200.148/php_lab/lab2.php?一个=s1885207154a

 PHP代码审计中常见漏洞函数有哪些

3.开关判断绕过

本章节会涉及一点正则相关的知识,如果零基础的同学,可以通过下方链接学习。

https://www.runoob.com/regexp/regexp-syntax.html正则表达式学习

 & lt; PHP ?
  如果收取($ _GET[& # 39;一个# 39;])){
  ,,,pattern 美元;=,& # 39;/^ (?=* [0 - 9]。*)(?=? [a-zA-Z]。*)。{4} $/& # 39;;
  ,,,//^为开的头,。*为匹配,要求字符串开头有数字,有字母,匹配不少于4次
  ,,,a 美元;=,$ _GET[& # 39;一个# 39;];
  ,,,//给一个赋值
  ,,,如果(preg_match(模式,一个美元)===0){
  ,,,,,,,//如果不匹配正则表达式、输出格式错误
  ,,,,,,,echo “format  error";
  还有,,,}{
  ,,,,,,,开关(美元){
  ,,,,,,,,,,,//当一个值等于4的时候,可以得到国旗
  ,,,,,,,,,,,//解决思路,还是弱类型转换绕过,?=4 abc
  ,,,,,,,,,,,case  1:
  ,,,,,,,,,,,,,,,echo “错误…“;;
  ,,,,,,,,,,,,,,,休息;
  ,,,,,,,,,,,case  2:
  ,,,,,,,,,,,,,,,echo “错误…“;;
  ,,,,,,,,,,,,,,,休息;
  ,,,,,,,,,,,case  3:
  ,,,,,,,,,,,,,,,echo “错误…“;;
  ,,,,,,,,,,,,,,,休息;
  ,,,,,,,,,,,case  4:
  ,,,,,,,,,,,,,,,echo “国旗{switch_pass}“;
  ,,,,,,,,,,,,,,,休息;
  ,,,,,,,}
  ,,,}
  }
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

PHP代码审计中常见漏洞函数有哪些