php黑魔法,PHP黑魔法

弱比较

若字符串以数字开头,则取开头数字作为转换结果,若无则输出0

md5(),sha1()

md5()是不能处理数组的,md5(数组)会返回null,两个null相等绕过

sha1()也是同理

转换

php会自动进行转换,比如16进制,科学计数法等,有时也用这点绕过

strcmp()

strcmp()函数只有在相等的情况下返回0。

那么我们传入一个数组,它会返回NULL,而判断使用了== ,但是NULL==0是bool(true),这样就成功绕过。

intval()

intval()转换的时候,会将从字符串的开始进行转换知道遇到一个非数字的字符。

即使出现无法转换的字符串,intval()不会报错而是返回0。

注:

在科学计数法字符串转换为数字时,如果 E 后面的数小于某个值会弄成 double 类型,再强制转换为 int 类型时可能会有奇妙的结果,测试发现某变量为 1e-1000 时已经可以触发这个漏洞绕过两个检查,使得某变量既大于 0 又不大于 0。

例如:

var_dump((int)('1e-1000')>0);

var_dump('1e-1000'>0);

结果

Command line code:1:

bool(true)

Command line code:1:

bool(false)

再入:

var_dump((int)('1e-10')>0);

var_dump('1e-10'>0);

结果

Command line code:1:

bool(true)

Command line code:1:

bool(true)

ereg()

字符串对比解析,ereg函数存在NULL截断漏洞,当ereg读取字符串string时,如果遇到了%00,后面的字符串就不会被解析。

注:这里的%00是需要urldecode才可以截断的,这是url终止符,且%00长度是1不是3

is_numeric()

当有两个is_numeric判断并用and连接时,and后面的is_numeric可以绕过

16进制也可以绕过is_numeric()检验,可以用来绕过sql注入里的过滤

switch()

当switch没有break时可以继续往下执行。

这里也有自动转换,比如$switch_bug = a,会当0执行,=1a,会当1执行……

array_search()

用到了PHP弱类型的一个特性,当一个整形和一个其他类型行比较的时候,会先把其他类型intval再比。

当检索中带入字符串,比如”sky”,会intval(‘sky’)==0,从而致使数字数组也可以查询成功

json_decode()

这个漏洞迷一样……我也是偶然发现,只能自己从下面的样例代码中领悟了

黑魔法实例脚本

echo "---------------- 弱比较黑魔法 -------------------------";

echo "
";echo "
";

if (1 == "1abc") {

if (0 == "abc") {

if ("0e132456789" == "0e7124511451155") {

#常见于md5弱比较绕过

echo "两个'=='的弱比较成功";

}

}

}

echo "
";echo "
";

echo "---------------- md5(),sha1()黑魔法 -------------------------";

echo "
";echo "
";

if (md5($md5_bug1[]=1) === md5($md5_bug2[]=1)){

if (sha1($md5_bug1[]=1) === sha1($md5_bug2[]=1)){

echo "md5传入数组绕过成功";

}

}

echo "
";echo "
";

echo "---------------- 转换黑魔法 -------------------------";

echo "
";echo "
";

echo "0x1e240 自动转换10进制:",0x1e240;

echo "
";

echo "123456 十进制数:",123456;

echo "
";

echo "1e240 科学计数法自动转换:",1e240;

echo "
";echo "
";

echo " ---------------- intval()黑魔法 -------------------------";

echo "
";echo "
";

echo "2 的intval()转换结果:",intval('2');

echo "
";

echo "3abcd 的intval()转换结果:",intval('3abcd');

echo "
";

echo "abcd 的intval()转换结果:",intval('abcd');

echo "
";echo "
";

$intval_bug = '1e-1000';

if ((int)($intval_bug) > 0) {

if ($intval_bug <= 0) {

echo "intval()转换问题绕过成功";

}

}

echo "
";echo "
";

echo "---------------- strcmp()黑魔法 -------------------------";

echo "
";echo "
";

$strcmp_bug[]=1;

if (@strcmp($strcmp_bug, "you_don't_know_this_string") == 0){

echo "strcmp()数组黑魔法绕过成功";

}

echo "
";echo "
";

echo "---------------- ereg()黑魔法 -------------------------";

echo "
";echo "
";

$input = urldecode('1e8%00*-*');

// echo strlen($input); #7

if (isset($input)){

if (@ereg ("^[a-zA-Z0-9]+$",$input) === FALSE){

echo $input;

echo '输入只能是数字和字母!';

}

else{

echo "ereg()%00截断绕过成功";

}

}

echo "
";echo "
";

echo "---------------- is_numeric()黑魔法 -------------------------";

echo "
";echo "
";

$is_numeric1 = "0123";

$is_numeric2 = "abc";

$c=is_numeric($is_numeric1) and is_numeric($is_numeric2);

if ($c) {

if (is_numeric(' +.1234e5678')) {

echo "is_numeric()连用漏洞绕过";

# 这样也能绕过检测……

}

}

echo "
";echo "
";

echo "---------------- switch()黑魔法 -------------------------";

echo "
";echo "
";

@$switch_bug = 0;

if (isset ( $switch_bug )) {

switch ($switch_bug) {

case 0 :

echo '你已经运行到了case0';

echo "
";

case 1 :

echo '你已经运行到了case1';

echo "
";

case 2 :

echo '你已经运行到了case2';

echo "
";

echo "switch()没有break连续运行绕过成功";

break;

default :

echo "1";

break;

}

}

echo "
";echo "
";

echo "---------------- array_search()黑魔法 -------------------------";

echo "
";echo "
";

$array_search=[1,0];

$eee = @array_search("XMAN", $array_search);

if($eee){

echo "array_search()检索字符串绕过成功";

}

echo "
";echo "
";

echo "---------------- json_decode()黑魔法 -------------------------";

echo "
";echo "
";

$v3=0;

$input = '{"key":0001}';

$b=json_decode(@$input);

if($var = $b === NULL){

($var === true)?$v3=1:NULL;

if ($v3) {

echo "json_decode()函数漏洞绕过成功";

}

}

?>

标签:黑魔法,intval,numeric,echo,绕过,PHP,md5

来源: https://www.cnblogs.com/NPFS/p/12662645.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值