第一天CTF学习

文章讨论了PHP中的弱类型比较特性,指出在比较字符串和数字时可能存在的安全问题,例如可能导致意外的类型转换。同时提到了MD5绕过策略,如科学计数法和数组利用。此外,还介绍了变量覆盖的概念,特别是由于函数如`extract()`使用不当而引发的安全隐患。
摘要由CSDN通过智能技术生成

弱类型问题

=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再做比较
== 在进行比较的时候,会先将字符串类型转换为相同,再进行比较(存在安全问题)
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值且比较按照数值的比较规则进行
字符串转换为数字规则:
从第一位不是数字的位开始,后边的位全部舍弃
例:
123admin => 123
123a32321312=>123
admin => 0

<?php
var_dump("admin"==0);//true
var_dump("1admin"==1);//true
var_dump("admin1"==1);//false
?>

当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含’.‘,’e‘,’E‘且其数值在整型范围之内,该字符串被当作int来取值,其他所有情况都被视作float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0

<?php
$test = 1 + "10.5" //$test = 11.5(float)
$test = 1+ "-1.3e3" //$test = -1299(float)
$test = 1 + "bob-1.3e3"//$test = 1(int)
$test = 1 +"2admin"//$test = 3(int)

MD5绕过

1.科学计数法绕过
可以传入两个md5加密后是0e开头的字符串,这个以0e开头的字符串只能是纯数字,这样php在进行科学计数法时才会将它转化为0,可以查找0e开头md5加密相等的字符串,也可自己编写代码,提供以下脚本:

<?php
for($a=1;$a<=100000000;$a++){
     &md5=md5($a);
     if(preg_match('/0e\d+$/',$md5)){
     echo &a;
     echo "\n";
     echo $md5;
     echo "\n";
```}
}

2.数组绕过
由于md5不能加密数组,在加密数组的时候会返回NULL,故可以传入两个数组
数组绕过适用于源码中没有判断变量类型或内容,若加上了规律函数就不能使用
常见过滤函数:
ctype_alnum(string $text);
//如果text中所有字符全都是字母或数字,返回true,否则返回false
is_numeric(mixed $var);
//如果var是数字和数字字符串则返回true,否则返回false

变量覆盖

变量覆盖指可以用我们的传参值替换程序原有的变量值
经常导致变量覆盖漏洞的场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册
extract():将数组中的变量导入到当前符号表

<?php
$a="1";
$my_array=array("a" => "cat","b" =>"dog","c" =>"horse");
extract($my_array);
echo "\$a = $a;\$b = $b; \$c = $c";
?>
//$a = cat, $b=dog $c=horse

斜杠的意思是,让后面的变量失去意义。那么写的是什么就是什么
extract()函数就是把数组中的变量,覆盖掉原来的变量

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值