web3

WEB 攻防-PHP 特性&缺陷对比函数&CTF 考点&CMS 审计实例

#知识点:

1、过滤函数缺陷绕过

2、CTF 考点与代码审计

详细点:

=

==:弱对比,不对比类型

===:强对比,会对比类型

md5 :

md5() 用来计算 MD5 哈稀。语法为:md5($str, $raw_output = false)

参数

  • $str:要计算 MD5 散列值的字符串。
  • $raw_output:可选参数,用于指定返回值是否为原始二进制格式。如果设置为 true,则返回 16 个字节的二进制字符串;如果设置为 false,则返回 32 位十六进制字符串。默认值为 false

md5 0e绕过:弱等于

0e开头的字符串在参与比较时,会被当做科学计数法,结果转换为0

常用的MD5加密后以0E开头的有

QNKCDZO
240610708
byGcY
sonZ7y
aabg7XSs
aabC9RqS
s878926199a
s155964671a
s214587387a
s1091221200a

md5数组绕过

在php中,md5函数不能处理数组,如果放入数组进行md5转换会返回NULL

比如将两个数组的md5值进行比较

md5(a[]=1) === md5(b[]=1)

由于md5函数无法处理数组,会返回null,所以md5加密后的结果是下面这样

null === null

可用于绕过===

MD5碰撞

MD5碰撞也叫哈希碰撞,是指两个不同内容的输入,经过散列算法后,得到相同的输出,也就是两个不同的值的散列值相同

MD5-SQL注入

ffifdyop 的MD5加密结果是 276f722736c95d99e921722cf9ed621c

经过MySQL编码后会变成'or'6xxx,使SQL恒成立,相当于万能密码,可以绕过md5()函数的加密

intval :获取整数,进制转换函数

语法:

intval($var, $base = 10)

参数说明:

  • $var:要转换成 integer 的数量值。
  • $base:转化所使用的进制。

如果 base 是 0,通过检测 var 的格式来决定使用的进制:

  • 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
  • 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
  • 将使用 10 进制 (decimal)。

strpos :

strpos(string,find,start) //查找 "php" 在字符串中第一次出现的位置
string 必需。规定要搜索的字符串。
find 必需。规定要查找的字符串。
start 可选。规定在何处开始搜索。

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

返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注释:字符串位置从 0 开始,不是从 1 开始。

in_array :

in_array() 函数搜索数组中是否存在指定的值。

in_array(search,array,type)
search 必需。规定要在数组搜索的值。
array 必需。规定要搜索的数组。
type 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。

如果给定的值 search 存在于数组 array 中则返回 true。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true。

如果没有在数组中找到参数,函数返回 false。

注释:如果 search 参数是字符串,且 type 参数设置为 true,则搜索区分大小写。

第三参数安全:

preg_match :

preg_match 函数用于执行一个正则表达式匹配。

preg_match($pattern, $subject, $matches, $flags = 0, $offset = 0)

参数

  • $pattern:要匹配的正则表达式模式。
  • $subject:要进行匹配的字符串。
  • $matches:用于存储匹配结果的数组。如果提供了该参数,匹配的结果将被存储在这个数组中。
  • $flags:可选参数,用于指定匹配模式的标志。常用的标志有 PREG_OFFSET_CAPTURE(返回匹配的偏移位置)和 PREG_PATTERN_ORDER(按照模式的顺序返回捕获组)等。
  • $offset:可选参数,用于指定从字符串的哪个位置开始进行匹配。

返回值

  • 如果匹配成功,返回 1。
  • 如果匹配失败,返回 0。
  • 如果发生错误,返回 false

此函数与md5一样不能处理数组的数据,可以用于正则绕过

str_replace:典型的过滤函数,无法迭代循环

str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。

str_replace(find,replace,string,count)
find 必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string 必需。规定被搜索的字符串。
count 可选。对替换数进行计数的变量。

缺陷是无法迭代循环,只能执行一次过滤

例如:

$sql=$_GET['s'];
$sql=str_replace('select','',$sql);
echo $sql;

此时如果?s=sselect,过滤之后的结果为select




##  原理-缺陷函数-使用讲解-本地



##  实践-CTFShow-PHP 特性-89 关卡

89:数组绕过正则匹配

90:inval转换进制绕过

91:%0a绕过不换行的正则匹配

92: 十进制转换4476.1==4476绕过$num==4476

93:与92一样:lock:

94:换行或者4476.0

95:换行

96:./flag.php

97:md5绕过

##  实践-代码审计-过滤缺陷-文件读取

使用str_replace作为过滤可以构造路径任意读取文件

使用in_array进行匹配指定值,如果没有设置第三个参数为true,可能可以在接收的参数构造sql注入语句,造成恶意sql注入//红日安全,

对于参数的构造:可以使用单引号,双引号,普通计算,位运算,inval进制转换,弱等于,强等于判断
posted @ 2023-11-18 22:08  小鱼QAQ  阅读(42)  评论(0)    收藏  举报