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进制转换,弱等于,强等于判断

浙公网安备 33010602011771号