PHP弱类型安全问题总结

近些日子做了瓜亚基尔邮政和邮电通讯大学互联网进攻和防守平台方面包车型客车标题,写了八个writeup之后,还会有须要总结一下。由于做的难题都以web类型的,全数的主题材料都是使用PHP来写的,所以众多标题并不曾观测到理念的如SQL注入,XSS的项指标漏洞,超级多都以PHP本身语法的主题素材。鉴于如今PHP是世界上最棒的语言,PHP本人的难点也足以算作是web安全的二个方面。在PHP中的特性就是弱类型,以至内置函数对于传播参数的麻痹大要管理。本篇文章主要就是记录本身在做进攻和防守平台下边蒙受的PHP的函数中存在的标题,以至PHP的弱类型所推动的标题。

PHP弱类型简要介绍

在PHP中,可以开展一下的操作。

$param = 1;
$param = array();
$param = "stringg";

弱类型的言语对变量的数据类型未有范围,你能够在其他地时候将变量赋值给自由的别的项指标变量,同有的时候间变量也能够转变来自便地其余类别的数量。

类型调换难题

类型调换是回天乏术防止的标题。譬如须要将GET大概是POST的参数转变为int类型,也许是多个变量不合作的时候,PHP会自动地拓宽变量调换。不过PHP是三个弱类型的语言,招致在扩充类型调换的时候会设有超多竟然的标题。

对比操作符

类型调换

在$a==$b的比较中

$a=null;$b=flase ; //true
$a='';$b=null;      //true

与此相类似的例子还会有为数不菲,这种比较都以卓越。

利用比较操作符的时候也存在类型调换的主题材料,如下:

0=='0'        //true
0 == 'abcdefg'  //true
0 === 'abcdefg' //false
1 == '1abcdef'  //true

当不相同门类的变量实行比较的时候就能设有变量转变的标题,在转移之后就有十分大希望会存在难点。

Hash比较

除开上述的这种艺术之外在展开hash相比较的时候也会设至极。如下:

"0e132456789"=="0e7124511451155" //true
"0e123456abc"=="0e1dddada"  //false
"0e1abc"=="0"     //true

在进展比较运算时,如若碰着了0ed+这种字符串,就能够将这种字符串解析为科学计数法。所以地点例子中2个数的值都以0因此就相当了。假若不满足0ed+这种形式就不会等于。那些难点在进攻和防守平新竹的md5
collision
就有考到。

十五进制转变

还设有风流倜傥种十三进制余字符串实行相比较运算时的主题素材。例子如下:

"0x1e240"=="123456"       //true
"0x1e240"==123456       //true
"0x1e240"=="1e240"      //false

当此中的二个字符串是0x伊始的时候,PHP会将此字符串拆解深入分析成为十进制然后再举行相比,0×1240剖判成为十进制就是123456,所以与int类型和string类型的123456比较都以相等。攻防平高雄的起名字真难正是调查的那么些特点。

类型调换

广阔的改变首要即是int转换为string,string调换为int。

int转string:

$var = 5;
方式1:$item = (string)$var;
方式2:$item = strval($var);

string转int:intval()函数。

对此那么些函数,能够先看2个例子。

var_dump(intval('2')) //2
var_dump(intval('3abcd'))   //3
var_dump(intval('abcd'))    //0

表明intval(卡塔尔国调换的时候,会将从字符串的上马开展调换知道碰着贰个非数字的字符。尽管现身不可能转移的字符串,intval()不会报错而是再次来到0。

intval(State of Qatar的这种特征在进攻和防守平新北的MYSQL那道难点中就有考到。

同时,程序员在编制程序的时候也不应当使用如下的这段代码:

if(intval($a)>1000) {
    mysql_query("select * from news where id=".$a)
}

本条时候$a的值有十分的大可能率是1002 union…..

内置函数的参数的松散性

置于函数的松散性说的是,调用函数时给函数字传送递函数不能承担的参数类型。解释起来有个别猛烈,依旧间接通超过实际际的事例来证实难点,上面会重要介绍多少个这种函数。

md5()

$array1[] = array(
    "foo" => "bar",
    "bar" => "foo",
);
$array2 = array("foo", "bar", "hello", "world");
var_dump(md5($array1)==var_dump($array2));  //true

PHP手册中的md5(State of Qatar函数的叙说是string md5 ( string $str [, bool $raw_output = false ] ),md5(卡塔尔国中的需假如贰个string类型的参数。不过当您传递三个array时,md5(卡塔尔国不会报错,知识会不也许准确地求出array的md5值,那样就能够引致自便2个array的md5值都会等于。那个md5(卡塔尔国的表征在进攻和防守平台南的bypass
again
生机勃勃律有考到。

strcmp()

strcmp(卡塔尔函数在PHP官方手册中的描述是int strcmp ( string $str1 , string $str2 ),须求给strcmp(卡塔尔传递2个string类型的参数。借使str1小于str2,再次回到-1,相等重临0,不然重临1。strcmp函数相比字符串的真面目是将多个变量转换为ascii,然后进行减法运算,然后依据运算结果来调节再次回到值。

若是传入给出strcmp(卡塔尔的参数是数字呢?

$array=[1,2,3];
var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。

strcmp这种特性在进攻和防守平新竹的pass check有考到。

switch()

假如switch是数字类型的case的推断时,switch会将内部的参数调换为int类型。如下:

$i ="2abc";
switch ($i) {
case 0:
case 1:
case 2:
    echo "i is less than 3 but not negative";
    break;
case 3:
    echo "i is 3";
}

以那时候候程序输出的是i is less than 3 but not negative,是出于switch(卡塔尔国函数将$i实行了类型调换,调换结果为2。

in_array()

在PHP手册中,in_array(卡塔尔国函数的表明是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ),假诺strict参数未有提供,那么in_array就可以动用松散相比来判别$needle是还是不是在$haystack中。当strince的值为true时,in_array(卡塔尔(قطر‎会比较needls的体系和haystack中的类型是还是不是意气风发律。

$array=[0,1,2,'3'];
var_dump(in_array('abc', $array));  //true
var_dump(in_array('1bc', $array));  //true

能够看来上边的事态再次回到的都以true,因为’abc’会转移为0,’1bc’调换为1。

array_search()与in_array(卡塔尔国也是同等的标题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注