首页web前端 › PHP弱类型安全难题总计

PHP弱类型安全难题总计

类型调换

遍布的转移首要正是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(卡塔尔国的这种特征在进攻和防守平高雄的MYSQL那道难题中就有考到。

同时,程序员在编制程序的时候也不应有选拔如下的这段代码:

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

其一时候$a的值有超大可能率是1002 union…..

生龙活虎经switch是数字类型的case的判别时,switch会将里面包车型地铁参数转变为int类型。如下:

php作为受接待的开源脚本语言,php是世界上最佳的言语,更加多的运用于Web开荒领域。php归于弱类型语言,即定义变量的时候不要注明它是怎么项目。作为四个技术员,弱类型确实给程序猿书写代码带给了比不小的谋福,可是也拉动了有些不供给的主题素材。

Hash比较

而外以上的这种办法之外在進展hash相比的时候也会设反常。如下:

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

在进行相比运算时,假如越过了0e\d+这种字符串,就能够将这种字符串解析为科学计数法。所以地方例子中2个数的值都以0因此就格外了。如果不满足0e\d+这种情势就不会等于。那个标题在进攻和防守平新竹的md5
collision
就有考到。

PHP手册中的md5(卡塔尔函数的叙说是string md5 ( string $str [, bool $raw_output = false ] )md5()中的需借使三个string类型的参数。不过当你传递一个array时,md5()不会报错,知识会不只怕正确地求出array的md5值,那样就能引致自便2个array的md5值都会等于。这些md5()的特点在进攻和防守平桃园的bypass
again同样有考到。

0x03 数组难点

if (isset($_GET['name']) and isset($_GET['password'])) {
    if ($_GET['name'] == $_GET['password'])
        print 'Your password can not be your name.';
    else if (sha1($_GET['name']) === sha1($_GET['password']))
        die('Flag: '.$flag);
else
    print 'Invalid password';

name和password的值不能够同意气风发,其次,sha1加密之后的name和password的值又一定要完全相同我们掌握,在php中,$a[] = 1;代表着$a[x] = 1;所以name[] =
1和password[]=
2绝比较,能够跳过第叁个判定,而意气风发旦接受sha1对二个数组举办加密,再次来到的将是NULL,NULL===NULL,那是建设布局的,所以组织七个数组绕过

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(State of Qatar不会报错,知识会不能够精确地求出array的md5值,这样就能够产生任意2个array的md5值都会等于。那一个md5(卡塔尔的特点在进攻和防守平新竹的bypass
again
一点差距也未有于有考到。

再者,工程师在编制程序的时候也不应该选拔如下的这段代码:

0x02 转变难点

类型转变

string转int:intval()函数

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

表明intval(State of Qatar调换的时候,会将从字符串的始发开展调换知道碰到八个非数字的字符。就算现身不能转移的字符串,intval(State of Qatar不会报错而是再次来到0。

十九进制转变

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

当当中的一个字符串是0x起始的时候,ox初叶表示16进制,PHP会将此字符串分析成为十进制然后再张开比较,0×1e240深入解析成为十进制正是123456,所以与int类型和string类型的123456相比都以相等。

如此在不让输入数字只是前面还要和黄金年代串数字比较的状态下能够利用这种艺术,将前边要相比的数字转为16进制,那样就能够绕过。

放到函数的参数的松散性

放置函数的松散性说的是,调用函数时给函数字传送递函数不能够承当的参数类型。解释起来有一些刚烈,照旧向来通超过实际际的事例来证实难点,上边会重点介绍多少个这种函数。

以上正是为大家总括的局地关于PHP弱类型的平安主题素材,希望那篇小说对咱们的上学可能干活能拉动一定的扶植,倘若有疑难我们能够留言调换。

0x04 平淡无奇函数难点

md5()

string md5 ( string $str [, bool $raw_output = false ] )

md5(State of Qatar中要求传入的是三个string类型的参数,当我们传递多个array时,它是不会报错的,函数无法求出array的MD5值,那样变成任意三个array的MD5值都等于,进而绕过输入数值的判别,在ctf代码审计中时常碰着。

strcmp()

int strcmp ( string $str1 , string $str2 )

进展字符串长度的相比,传入多个string的参数。假诺str1小于str2,再次来到-1,相等再次来到0,不然重临1。strcmp函数比较字符串的庐山真面目目是将三个变量调换为ascii,然后开展减法运算,然后依据运算结果来决定重回值。如若传入的参数为数字或数组

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

例2:
if (isset($_GET['password'])) {
if (strcmp($_GET['password'], $flag) == 0)
    die('Flag: '.$flag);
else
    print 'Invalid password';
}

此地使用strcmp(State of Qatar对pass和flag举办决断,假如==0,则输出flag。然则strcmp(State of Qatar函数独有在拾贰分的景况下重返0。那么大家传入三个数组,它会回去NULL,而推断使用了==,而NULL==0是bool(trueState of Qatar,那样就打响绕过。

switch()

即使switch是数字类型的case的论断时,switch会将中间的参数转换为int类型。

in_array()

bool in_array ( mixed $needle , array $haystack [, bool $strict =
FALSE ] )

风流洒脱经strict参数未有提供,那么in_array就能选取松散相比较来判别$needle是还是不是在$haystack中。当strince的值为true时,in_array(State of Qatar会相比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。

ereg()

int ereg(string pattern, string string, array [regs]);

字符串相比较深入分析,ereg函数存在NULL截断漏洞,当ereg读取字符串string时,如若碰着了%00,后边的字符串就不会被剖判。

bool类型的true跟放肆字符串能够弱类型相等

脚下就照应这么多,以往有新的会继续增多上去

麻痹大体相比的报表

类型调换

在$a==$b的相比中

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

如此的例证还应该有超多,这种比较都以特别。

运用相比操作符的时候也存在类型转变的标题,如下:

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

当分化类型的变量进行相比的时候就能够设有变量调换的难题,在转移之后就有相当的大大概会存在难题。

intval()的这种特征在攻防平新竹的MYSQL这道标题中就有考到。

0x01 ==和===的问题

==是相比较运算,它不会去反省条件式的表明式的项目

===是恒等,它会检查查表明式的值与项目是或不是等于。

NULL,0,"0",array(State of Qatar使用==和false相比较时,都以会回去true的,而选择===却不会

相比操作

多个数字和八个字符串举行相比,PHP会把字符串转变来数字再进行相比。PHP转变的规规矩矩的是:若字符串以数字起头,则取开始数字作为转变结果,若无则输出0。比方:123abc转变后应该是123,而abc则为0,0==0那当然是确立的啊!所以,0
=='abc'是起家的。当有叁个比照参数是整数的时候,会把此外一个参数强逼转换为整数。

Hash比较

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

在进行相比运算时,假诺遇到了0e\d+这种字符串,就能够将这种字符串解析为科学计数法。所以地点例子中2个数的值都是0由此就约等于了。假使不满意0e\d+这种情势就不会等于。

md5比较

<?php
$a = md5('240610708'); // = 0e462097431906509019562988736854
$b = md5('QNKCDZO'); // = 0e830400451993494058024219903391
var_dump($a == $b);
?>

归来结果bool(true)

240610708 和 QNKCDZO
md5值类型日常,但并不相通,在“==”相等操作符的运算下,结果回到了true。这是个精粹的疏漏,只须求找到md5值为0exxx(xxx全为数字,共31个人),这里笔者提供4个都足以通过的值:240610708、QNKCDZO、aabg7XSs、aabC9RqS

扩展:

先注册密码为240610708的用户A。
然后用密码QNKCDZO尝试登录用户A。
倘若成功登录,则证明此网站采用了不完备的加密体制md5一次加密。

先注册密码为0E33455555的用户A。
然后用密码0E234230570345尝试登录用户A。
倘若成功登录,则证明此网站采用了明文进行存储密码!

strcmp()

strcmp(卡塔尔(قطر‎函数在PHP官方手册中的描述是int strcmp ( string $str1 , string $str2 ),供给给strcmp(State of Qatar传递2个string类型的参数。假设str1小于str2,重临-1,相等再次来到0,否则再次来到1。strcmp函数相比字符串的本色是将五个变量转换为ascii,然后实行减法运算,然后依据运算结果来决定重回值。

生龙活虎经传入给出strcmp(State of Qatar的参数是数字呢?

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

strcmp这种特点在进攻和防守平桃园的pass check有考到。

当当中的一个字符串是0x开始的时候,PHP会将此字符串解析成为十进制然后再扩充相比较,0x1240拆解剖析成为十进制正是123456,所以与int类型和string类型的123456相比都以极度。进攻和防守平新北的起名字真难正是观察的那几个特点。

对比操作符

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

十一进制转变

还存在黄金时代种十七进制余字符串举行相比运算时的标题。例子如下:

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

当当中的三个字符串是0x在这里从前的时候,PHP会将此字符串解析成为十进制然后再开展比较,0×1240分析成为十进制就是123456,所以与int类型和string类型的123456相比都是极度。进攻和防守平台北的起名字真难纵然考查的那特个性。

类型转变

类型调换难题

类型调换是不能够幸免的标题。举例需求将GET或许是POST的参数转变为int类型,也许是五个变量不合作的时候,PHP会自动地拓宽变量调换。可是PHP是叁个弱类型的言语,引致在拓宽类型调换的时候会存在不菲奇异的主题材料。

switch()

PHP弱类型简要介绍

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

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

弱类型的语言对变量的数据类型未有范围,你能够在别的地时候将变量赋值给自由的别的品种的变量,同一时候变量也能够调换到任性地其余体系的数量。

比较操作符

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。

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

近年来做了San Jose邮政和邮电通讯大学网络进攻和防守平台上边的标题,写了五个writeup之后,还或者有供给计算一下。由于做的难题都以web类型的,全体的主题素材都以选择PHP来写的,所以众多标题并不曾观测到守旧的如SQL注入,XSS的项目标漏洞,非常多都以PHP自己语法的主题材料。鉴于近期PHP是社会风气上最佳的语言,PHP本身的难点也足以算作是web安全的四个方面。在PHP中的天性就是弱类型,以至内置函数对于传播参数的涣散管理。本篇作品首要就是记录自己在做进攻和防守平台方面境遇的PHP的函数中留存的标题,以至PHP的弱类型所带给的难题。

前言

in_array()

在PHP手册中,in_array(卡塔尔国函数的表达是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ),假若strict参数未有提供,那么in_array就能够动用松散比较来推断$needle是或不是在$haystack中。当strince的值为true时,in_array(State of Qatar会相比较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(卡塔尔(قطر‎也是大同小异的难题。

那般的例证还应该有为数不菲,这种相比都是相等。

in_array()

说明intval()转移的时候,会将从字符串的开端开展调换知道境遇一个非数字的字符。固然现身不只怕转移的字符串,intval()不会报错而是重回0。

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

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

类型调换难题

转载本站文章请注明出处:新萄京娱乐网址2492777 http://www.cdhbjs.com/?p=5327

上一篇:

下一篇:

相关文章