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(卡塔尔(قطر‎会比较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(卡塔尔也是生机勃勃律的标题。

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

0x01 ==和===的问题

==是相比较运算,它不会去检查条件式的表达式的品类

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

NULL,0,”0″,array(卡塔尔国使用==和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全为数字,共三拾肆个人),这里小编提供4个都得以通过的值:240610708、QNKCDZO、aabg7XSs、aabC9RqS

扩展:

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

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

比较操作符

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

0x02 转换难题

类型转换

string转int:intval()函数

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

证实intval(State of Qatar转换的时候,会将从字符串的初步实行改造知道蒙受一个非数字的字符。尽管现身不能转变的字符串,intval(卡塔尔(قطر‎不会报错而是重回0。

十一进制调换

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

当在那之中的五个字符串是0x此前的时候,ox初叶表示16进制,PHP会将此字符串深入分析成为十进制然后再扩充比较,0×1e240解析成为十进制正是123456,所以与int类型和string类型的123456相比都以特别。

如此在不让输入数字只是前边还要和生龙活虎串数字相比较的处境下能够使用这种情势,将后边要比较的数字转为16进制,那样就能够绕过。

近期做了德班邮电大学互连网进攻和防守平台上边的主题素材,写了三个writeup之后,还会有供给总结一下。由于做的难点都是web类型的,全数的主题素材都以采纳PHP来写的,所以众多标题并不曾观测到观念的如SQL注入,XSS的类型的错误疏失,比超多都是PHP本人语法的题目。鉴于前段时间PHP是世界上最佳的言语,PHP本人的难题也能够算作是web安全的八个上面。在PHP中的本性正是弱类型,以至内置函数对于传播参数的松弛管理。本篇文章主要正是记录自个儿在做进攻和防守平台方面蒙受的PHP的函数中设有的难题,以至PHP的弱类型所带动的主题材料。

类型转变

0x04 习以为常函数难点

md5()

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

md5(卡塔尔中必要传入的是三个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(卡塔尔国对pass和flag进行判别,借使==0,则输出flag。不过strcmp(State of Qatar函数独有在异常的气象下重回0。那么我们传入二个数组,它会回去NULL,而判定使用了==,而NULL==0是bool(true卡塔尔,那样就水到渠成绕过。

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跟大肆字符串能够弱类型相等

眼前就收拾这么多,将来有新的会持续增多上去

粗心浮气相比的报表

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。

in_array()

php作为受款待的开源脚本语言,php是世界上最佳的语言,更加的多的接收于Web开荒世界。php归于弱类型语言,即定义变量的时候绝不申明它是什么样本种。作为二个程序猿,弱类型确实给技士书写代码带来了非常大的有益,可是也拉动了有的不供给的难点。

PHP弱类型简要介绍

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

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

弱类型的言语对变量的数据类型未有范围,你能够在另各地时候将变量赋值给自由的其余类其他变量,同有时候变量也足以调换到任性地其余类型的数额。

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,那是起家的,所以协会几个数组绕过

Hash比较

除了这些之外以上的这种措施之外在开展hash相比的时候也会存在难题。如下:

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

在进展比较运算时,假若蒙受了0e\d+这种字符串,就能将这种字符串深入深入分析为科学计数法。所以地点例子中2个数的值都是0因而就等于了。纵然不满意0e\d+这种格局就不会等于。那一个问题在攻防平新竹的md5
collision
就有考到。

如果switch是数字类型的case的论断时,switch会将中间的参数转变为int类型。如下:

嵌入函数的参数的松散性

放到函数的松散性说的是,调用函数时给函数字传送递函数不恐怕担负的参数类型。解释起来有一些刚毅,依然向来通过实际的事例来评释难点,上面会主要介绍多少个这种函数。

switch()

类型调换难题

类型转变是无法防止的主题素材。比如需求将GET或许是POST的参数转变为int类型,或然是四个变量分裂盟的时候,PHP会自动地拓宽变量转变。可是PHP是三个弱类型的语言,以致在进行类型转变的时候会设有重重意料之外的难题。

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

strcmp()

strcmp(State of Qatar函数在PHP官方手册中的描述是int strcmp ( string $str1 , string $str2 ),要求给strcmp(卡塔尔(قطر‎传递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有考到。

接纳相比较操作符的时候也存在类型调换的标题,如下:

十五进制转变

还存在风流洒脱种十五进制余字符串进行比较运算时的标题。例子如下:

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

当当中的多少个字符串是0x开端的时候,PHP会将此字符串拆解剖判成为十进制然后再实行比较,0×1240解析成为十进制正是123456,所以与int类型和string类型的123456相比较都是相等。攻防平新北的起名字真难就算侦察的这些特点。

澳门新萄京8522,Hash比较

类型调换

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

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

那样的事例还应该有好些个,这种相比较皆甚特别。

动用比较操作符的时候也设有类型调换的难点,如下:

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

当不一致类其他变量进行相比较的时候就能够存在变量调换的标题,在调换之后就有望会设失常。

那篇随笔首要就是记录本人在做进攻和防守平台上面碰着的PHP的函数中存在的主题材料,以致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…..

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

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()

如上正是为大家总计的有个别有关PHP弱类型的安全题材,希望那篇小说对大家的就学只怕办事能带来一定的佑助,若是有疑点我们能够留言调换。

说明intval()更动的时候,会将从字符串的始发开展转移知道境遇贰个非数字的字符。就算现身无法调换的字符串,intval()不会报错而是重临0。

if { mysql_query("select * from news where brush:php;">$array1[] = array( "foo" => "bar", "bar" => "foo",);$array2 = array("foo", "bar", "hello", "world");var_dump==var_dump; //true
"0e132456789"=="0e7124511451155" //true"0e123456abc"=="0e1dddada" //false"0e1abc"=="0" //true

strcmp这种天性在进攻和防守平台北的pass check有考到。

发表评论

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

网站地图xml地图