HacKerQWQ的博客空间

弱类型比较小笔记

Word count: 934Reading time: 3 min
2021/04/24 Share

松散比较

当比较类型不同时自动转换类型

1
2
3
4
<?php
var_dump(null ==false); //bool(true)
var_dump('aa'==0); //bool(true)
?>

20210424215555

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等安全漏洞

20210424220204
此处0x31206f7220313d311 or 1=1

in_array()

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

1
2
3
4
5
6
7
8
9
<?php
if (in_array($_GET['id'],array(1,2,3,4)))
{
$sql="select * from admin where id ='".$_GET['id']."'";
}
echo $sql;
?>
//提交:?id=1' union select 1,2,3,4%23
//结果:select * from admin where id ='1' union select 1,2,3,4#'

in_attay()函数做比较之前,自动做类型转换,从而匹配成功,绕过检查。

strcmp()

strcmp() 函数比较两个字符串,如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0

  1. 先将两个参数先转换成string类型
  2. 当比较数组和字符串的时候,返回是0
  3. 如果参数不是string类型,直接return

image-20211122003601693

构造数组绕过

1
?value[]=1

urldecode二次编码绕过

image-20211122003917600

1
2
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
# hackerDJ的二次url编码

inval()

获取变量的整数值.

image-20211122005242389

image-20211122005412272

这个函数涉及到整型溢出的问题

最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上,intval('1000000000000') 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。

  • 字符串有可能返回 0,虽然取决于字符串最左侧的字符。 使用 整型转换 的共同规则。

image-20211122005528763

传入

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

image-20211122011022222

strpos绕过

  • 定义和用法

    函数查找字符串在另一字符串中第一次出现的位置。

  • 语法

    1
    strpos(string, find, start) 

    string:必需,规定要搜索的字符串。

    find: 必需,规定要查找的字符串。

    start: 可选,规定在何处开始搜索。

  • 返回值

    返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。

image-20211122011341664

strpos在处理数组时会返回NULL,而NULL!==FALSE以此绕过

1
?id[]=111

session绕过

如果程序没有在开始就初始化session,存在被绕过的可能

image-20211122011738744

传入password为空即可

1
?password=
CATALOG
  1. 1. 松散比较
  2. 2. Hash函数绕过
  3. 3. 弱类型函数
    1. 3.1. is_numeric()
    2. 3.2. in_array()
    3. 3.3. strcmp()
    4. 3.4. urldecode二次编码绕过
    5. 3.5. inval()
    6. 3.6. 正则截断
      1. 3.6.1. erge()函数
      2. 3.6.2. preg_match()函数
    7. 3.7. 科学计数法
    8. 3.8. sha1&md5强比较绕过
    9. 3.9. strpos绕过
    10. 3.10. session绕过