PHP弱类型安全问题笔记

如今做了大阪邮政和邮电通讯大学网络进攻和防守平台上边的标题,写了贰个writeup之后,还会有供给总括一下。由于做的主题材料都以web类型的,全体的主题素材都以使用PHP来写的,所以众多难题并从未观测到守旧的如SQL注入,XSS的品种的漏洞,非常多都以PHP自身语法的标题。鉴于如今PHP是社会风气上最佳的语言,PHP自身的难题也能够算作是web安全的二个方面。在PHP中的性格就是弱类型,甚至内置函数对于传播参数的麻痹大要管理。本篇小说主要正是记录自己在做进攻和防守平台方面遇到的PHP的函数中留存的题目,以致PHP的弱类型所拉动的难点。

字符串与数字比较

原理:

$a = '1DullCat';$b = 'DullCat1';var_dump; //truevar_dump; //falseintval; //1intval; //0

php的对待运算时,是会将七个变量都转移为同一档案的次序,分裂变量的江淹梦笔相比较当字符串和int类型比较时,将会把字符串转变为int类型,相当于字符串在底层执行了一次intval(卡塔尔国函数.至于为啥数字放后面就会intval,放前面就可怜,是因为:该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。怪不得有个别网站注册时非要名字以字符串开始….

瞩目:假设字符串在比较时带有’e’,’E’时,会被深入分析为不易计数法,如var_dump('1e123' == '1');为false

案例1:

$type = $_POST['type'] if($type == 1){ $sql = "select * from test where type = $type";}mysql_query;

案例2:

$type = $_POST['type'] switch{ case 1: $sql = "select * from test where type = $type"; break; default: die();}mysql_query;

拉开:如若字符串和数字比较会油但是生类型转变的主题材料,那么有个别php自带函数会不会现身同等的难点?

in_array()

$haystack = array;$needle= '1DullCat';var_dump(in_array($needle,$haystack)); //truevar_dump(in_array($needle,$haystack,true)); //false

纵然如此也会产出难题,可是向来都有肃清的方案,in_array(State of Qatar存在第多少个参数,决定是不是严厉检查,默认为false
, 特别与 “==” , 传入true
,约等于”===”还会有为数不少如此的函数,如array_search(),这里不一一介绍了

一、类型调换难点

PHP弱类型简介

在PHP中,能够展开一下的操作。

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

弱类型的言语对变量的数据类型未有范围,你能够在别的地时候将变量赋值给自由的别的品种的变量,同一时间变量也足以调换到嚣张地别的类别的数目。

函数再次来到值与数字相比

strcmp()用来比较字符串和字符串,若是相等则再次回到0日常常有人会这样写

$a = $_POST['str'];if(strcmp($a,'DullCat') == 0){ //执行}

这段代码便得以接受传入数组来绕过因为用strcmp(State of Qatar相比数组和字符串时重返值为null,
但是 null == 0为true ,所以继续实施

md5()函数字传送入数组会重返null;然而本猫看了下英特网的例证,
真的感觉完全不合逻辑,就暂时一笔带过

小结一定要做好参数的过滤,在使用她早前应当常用 “===”
来判别,并非”==”应该掌握每一个常用函数的参数和重返值,尽量选拔严峻格局

只要笔者跑步的进度够快,就不在乎失去

图片 1pay.png

     intval();

类型转换难点

类型转变是回天乏术幸免的主题材料。比方须求将GET可能是POST的参数转变为int类型,可能是八个变量不宽容的时候,PHP会自动地进行变量转变。不过PHP是一个弱类型的言语,招致在展开类型转变的时候会设有许多意外的难点。

 

正如操作符

    var_dump(intval(‘1asdfasd’));  //1

类型调换

在$a==$b的相比较中

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

像这种类型的例子还会有为数不菲,这种相比都以万分。

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

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

当不一致品类的变量实行比较的时候就能设有变量转变的标题,在转移之后就有比超大希望会存在难题。

    var_dump(intval(‘awqw12’));  //0

Hash比较

除了上述的这种办法之外在进展hash相比较的时候也会设不寻常。如下:

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

在拓宽相比较运算时,如若遭遇了0ed+这种字符串,就能将这种字符串深入解析为科学计数法。所以地方例子中2个数的值都以0因此就拾贰分了。假设不知足0ed+这种方式就不会等于。那些标题在进攻和防守平台南的md5
collision
就有考到。

    var_dump(intval(array()));    //0

十九进制转变

还留存一种十八进制余字符串进行相比较运算时的主题素材。例子如下:

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

当在这之中的三个字符串是0x开端的时候,PHP会将此字符串分析成为十进制然后再拓宽对比,0×1240剖析成为十进制便是123456,所以与int类型和string类型的123456比较都是相等。进攻和防守平新竹的起名字真难不畏考察的这么些特点。

    var_dump(intval(array(‘foo’,’val’))); //1

类型调换

附近的调换首要正是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…..

    var_dump(intval(0x1A卡塔尔国卡塔尔(قطر‎; //26  十一进制转变

置于函数的参数的松散性

嵌入函数的松散性说的是,调用函数时给函数字传送递函数无法选拔的参数类型。解释起来有一点刚烈,依旧向来通过实际的例证来表明难点,下边会首要介绍多少个这种函数。

   
var_dump(intval(‘asdfqwer’)); //0

md5()

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

PHP手册中的md5(卡塔尔函数的汇报是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有考到。

    intval 假诺转变值为字符串时,不会回来错误,而是重返0,假若转换值为数组时,有二种情状,转变值为空数组时,则会重返0,不然就能够回到
1

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(State of Qatar函数将$i举办了类型转变,转变结果为2。

    注意:php用32个人内部存储器来保存叁个整数,叁14人能够象征42949672九十几个数字,有号子的话正是-2147483647到2147483648;

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(卡塔尔国也是一律的难点。

 

二、内置函数松散性难点

     switch();

 

     $i=’3adcd’;

     switch($i){

              case 1:

                     echo ‘i is 1’;

                     break;

              case 2:

                     echo ‘i is 2’;

                     break;

              case 3:

                     echo ‘i is 3’;

                     break;

              default:

                    echo ‘i is default’;

                    break;

     }

       以上结果,会跻身switch case 3
里面,为啥会那样,假若switch是数字类型的case的判依期,switch会将中间的参数转换为int类,所以上述试行的时候,首先会把$i进行了类型转变,调换结果为3
,所以。。。

 

 

    in_array();

    $arr = [0,1,2,3,’test’];

    var_dump(in_array(‘abd’,$arr));    // true

    var_dump(in_array(‘1bc’,$arr));    // true

    为何上边实践结果会是那般的,后边通过查询手册,官方给出的传道是,
in_array
暗许是走松散比较艺术,只比值是还是不是等于,而不可比值的品类是还是不是一律,所以才有下边这种结果,可是能够设置in_array
函数第两个参数,设置为True就是严酷的可比艺术。

 

 

以上都以大家平日开采需求小心的地点。

发表评论

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