关于php弱类型的研究,若遇到新的会加上
比较时的类型转换
当一个字符串被当作数值,没有’.’,‘e’,‘E’,且数值在整型范围,则被当作整型,否则为float,由字符串开头决定,有数字则为那个数字,没有则为0
0e这类字符串解析为科学计数法
利用:哈希函数弱比较https://blog.csdn.net/nzjdsds/article/details/90085112
0x的数字开头会被认为16进制
switch()
case是数字判断时会转换为int类型,与第一种相似
strcmp()
比较两个字符串但是用一个数组和字符串比较时返回NULL,也就是0
sha1()
if (isset($_GET['a']) and isset($_GET['b']))
{
if ($_GET['a'] == $_GET['b'])
echo 'sb';
else if (sha1($_GET['a']) === sha1($_GET['b']))
echo '666';
else
echo 'sb';
}
else
echo 'sb'; //传入数组
md5
第一种:数组绕过
if ($_GET['a']!==$_GET['b'] && md5($_GET['a'])===md5($_GET['b']))
echo "666";//传入数组
第二种:0e绕过
if ($_GET['a']!==$_GET['b'] && md5($_GET['a'])==md5($_GET['b']))
echo "666";//等号数量和上一个不相同,注意看,,,
哈希函数弱比较https://blog.csdn.net/nzjdsds/article/details/90085112
第三种:强碰撞(无数组)
if ((string)$_GET['a']!==(string)$_GET['b'] && md5($_GET['a'])===md5($_GET['b']))
echo "666";//传入数组会被转换为'Array',传入a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
这是安洵杯的一个题 [安洵杯 2019]easy_web
in_array()
与==类似
array_search()
对类型强制转换
if(!is_array($_GET['a']))
{
echo 'sb';
exit();
}//必须是数组
$a=$_GET['a'];
for($i=0;$i<count($a);$i++){
if($a[$i]==="admin"){
echo "sb";
exit();
}//数组内不能有admin
$a[$i]=intval($a[$i]);
}
if(array_search("admin",$a)===0){
echo "666";
} //判断
else{
echo "sb";
}//传入a[]=0,结果转换相当于"admin"==0
数组特性
数组和任意数比较的时候会大于那个数,但是转化为整型为1