松散比较
当比较类型不同时自动转换类型
1 |
|
Hash函数绕过
https://hackerqwq.github.io/2020/06/10/MD5-collision/
弱类型函数
is_numeric()
is_numeric() 检测变量是否为数字或数字字符串。如果 是数字和数字字符串则返回 TRUE,否则返回 FALSE。
它的弱类型问题是他支持十六进制0x格式,攻击者把payload改成十六进制0x,is_numeric会先对十六进制做类
型判断,十六进制被判断为数字型,为真,就进入了条件语句,如果再把这个代入进入sql语句进入mysql数据库,
mysql数据库会对hex进行解析成字符串存入到数据库中,如果这个字段再被取出来二次利用,就可能导致二次注
入、XSS等安全漏洞。
此处0x31206f7220313d31为1 or 1=1
in_array()
in_array() 函数搜索数组中是否存在指定的值。
1 |
|
in_attay()函数做比较之前,自动做类型转换,从而匹配成功,绕过检查。
strcmp()
strcmp() 函数比较两个字符串,如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
- 先将两个参数先转换成string类型
- 当比较数组和字符串的时候,返回是0
- 如果参数不是string类型,直接return
构造数组绕过
1 | ?value[]=1 |
urldecode二次编码绕过
1 | id=%25%36%38%25%36%31%25%36%33%25%36%62%25%36%35%25%37%32%25%34%34%25%34%61 |
inval()
获取变量的整数值.
这个函数涉及到整型溢出的问题
最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上,intval('1000000000000')
会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。
- 字符串有可能返回 0,虽然取决于字符串最左侧的字符。 使用 整型转换 的共同规则。
传入
1 | key=0.99999999999999999 |
就会被intval转换为最左侧的字符0,就会通过intval($key)<1
正则截断
erge()函数
1 | int ereg(string pattern, string originalstring, [array regs]) |
如果有找到模式匹配,则返回true,否则返回false
php版本< 5.3
当遇见%00字符时,默认字符串已结束
preg_match()函数
1 | int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) |
返回 0或1,即不匹配或 1 次匹配
php版本>=5.3
php版本>=5.3
当遇见%00字符时,默认字符串已结束
科学计数法
1 | 9e9 |
sha1&md5强比较绕过
一般要求两个变量值不同,但是sha1后相同,这种情况用数组绕过就好了
1 | ?name[]=1&password[]=2 |
strpos绕过
定义和用法
函数查找字符串在另一字符串中第一次出现的位置。
语法
1
strpos(string, find, start)
string:必需,规定要搜索的字符串。
find: 必需,规定要查找的字符串。
start: 可选,规定在何处开始搜索。
返回值
返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
strpos
在处理数组时会返回NULL,而NULL!==FALSE以此绕过
1 | ?id[]=111 |
session绕过
如果程序没有在开始就初始化session,存在被绕过的可能
传入password为空即可
1 | ?password= |