0x01 前言 

 PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型。

  弱类型比较,是一个比较蛋疼的问题,如左侧为字符串,右侧为一个整数,只不过左侧与右侧内容完全相等。

<?php
var_dump(null ==false); //bool(true)
var_dump('aa'==0); //bool(true)
?>

0x02 Magic Hash

  PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,在进行比较运算时,如果遇到了 0e\d+ 这种字符串,就会将这种字符串解析为科学计数法。所以上面例子中 2 个数的值都是 0 因而就相等了。如果不满足 0e\d+ 这种模式就不会相等。

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

参考链接:http://www.freebuf.com/news/67007.html   http://www.cnblogs.com/Primzahl/p/6018158.html

常见的payload:

0x01 md5(str)
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
0x02 sha1(str)
sha1('aaroZmOk')
sha1('aaK1STfY')
sha1('aaO8zKZF')
sha1('aa3OFF9m')

MD5不能处理数组,若有以下判断则可用数组绕过:

if(@md5($_GET['a']) == @md5($_GET['b']))
{
echo "yes";
}
//http://127.0.0.1/test.php?a[]=1&b[]=2
//$_GET: array(2) { ["a"]=> array(1) { [0]=> string(1) "1" } ["b"]=> array(1) { [0]=> string(1) "2" } }

 0x03 弱类型函数

通过利用弱类型进行数据比较,外来变量自动类型转换,导致恶意数据进入到条件体内,可能存在极大的安全风险。

下面开始介绍几个弱类型的函数:

【is_numeric()】

  is_numeric() 检测变量是否为数字或数字字符串。如果 是数字和数字字符串则返回 TRUE,否则返回 FALSE。

  它的弱类型问题是他支持十六进制0x格式,攻击者把payload改成十六进制0x,is_numeric会先对十六进制做类型判断,十六进制被判断为数字型,为真,就进入了条件语句,如果再把这个代入进入sql语句进入mysql数据库,mysql数据库会对hex进行解析成字符串存入到数据库中,如果这个字段再被取出来二次利用,就可能导致二次注入、XSS等安全漏洞。

<?php
$type= is_numeric($_GET['id'])?$_GET['id']:0;
$sql="insert into test(id,type)values(1,$type);";
echo $sql;
?>

把‘1 or 1’ 转换为16进制 0x31206f722031 为参数的值,带数据库执行,查询结果:

如果再重新查询这个表的字段出来,不做过滤带入另一个SQL语句,将会造成二次注入。

【in_array()】

  in_array() 函数搜索数组中是否存在指定的值。

<?php
if (in_array($_GET['id'],array(1,2,3,4)))
{
$sql="select * from admin where id ='".$_GET['id']."'";
}
echo $sql;
?>
//提交:?id=1' union select 1,2,3,4%23
//结果:select * from admin where id ='1' union select 1,2,3,4#'

in_attay()函数做比较之前,自动做类型转换,从而匹配成功,绕过检查。

【strcmp()】

  strcmp() 函数比较两个字符串,如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

  先将两个参数先转换成string类型

  当比较数组和字符串的时候,返回是0

  如果参数不是string类型,直接return

<?php
$id=$_GET['id'];
if (strcmp('test',$id)) {
echo 'YES!';
} else{
echo 'NO!';
}
?>
//提交:?id[]=
//结果:YES

类似这样的函数还有switch()

关于我:一个网络安全爱好者,致力于分享原创高质量干货,欢迎关注我的个人微信公众号:Bypass--,浏览更多精彩文章。

参考文章:

php代码审计之弱类型引发的灾难

http://blog.topsec.com.cn/ad_lab/php%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E4%B9%8B%E5%BC%B1%E7%B1%BB%E5%9E%8B%E5%BC%95%E5%8F%91%E7%9A%84%E7%81%BE%E9%9A%BE/

PHP代码审计笔记--弱类型存在的安全问题的更多相关文章

  1. [代码审计]php弱类型总结

    0x01 前言 php是世界上最好的语言,所以php自身的安全问题也是web安全的一个方面.由于其自身弱类型语言的特性以及内置函数对于传入参数的松散处理,所以会带来很多的问题,这里将进行简要介绍. 弱 ...

  2. PHP弱类型安全问题的写法和步骤

    鉴于目前PHP是世界上最好的语言,PHP本身的问题也可以算作是web安全的一个方面.在PHP中的特性就是弱类型,以及内置函数对于传入参数的松散处理.本篇文章主要就是记录我在做攻防平台上面遇到的PHP的 ...

  3. PHP弱类型:WordPress Cookie伪造

    1 PHP弱类型 PHP是弱类型语言,所以变量会因为使用场景的不同自动进行类型转换.PHP中用 == 以及 != 进行相等判断时,会自动进行类型转换,用 === 以及 !== 进行判断时不会自动转换类 ...

  4. CTF中常见的 PHP 弱类型漏洞总结

    作者:ZERO    所属团队:Arctic Shell 参考资料: http://archimesan.me/2017/12/21/php%E5%BC%B1%E7%B1%BB%E5%9E%8B%E6 ...

  5. php 弱类型总结

    0x01 前言 最近CTF比赛,不止一次的出了php弱类型的题目,借此想总结一下关于php弱类型以及绕过方式 0x02 知识介绍 php中有两种比较的符号 == 与 === <?php $a = ...

  6. javascript 核心语言笔记- 3 - 类型、值和变量

    JavaScript 中的数据类型分为两类:原始类型(primitive type)和对象类型(object type).原始类型包括数字.字符串和布尔值 JavaScript 中有两个特殊的原始值: ...

  7. PHP弱类型需要特别注意的问题

    下面介绍的问题都已验证, 总结:字符数据比较==不比较类型,会将字符转数据,字符转数字(转换直到遇到一个非数字的字符.即使出现无法转换的字符串,intval()不会报错而是返回0).0e,0x开头的字 ...

  8. [JS2] JS是弱类型

    <html> <head> <title>JavaScript 是弱类型的</title> <Script Language="Java ...

  9. sqlite 的比较等运算是根据不同的值而不同的,并不是根据的字段类型,因为 sqlite 是弱类型字段

    sqlite 的比较等运算是根据不同的值而不同的,并不是根据的字段类型,因为 sqlite 是弱类型字段   --------------------------------------------- ...

随机推荐

  1. 基于Zookeeper的分步式队列系统集成案例

    基于Zookeeper的分步式队列系统集成案例 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, ...

  2. js学习(一)-动态添加、修改、删除对象的属性和方法

    //-----------------------js代码--------------------------- function class1(){ } //-------------------- ...

  3. 微信小程序——修改data里面数组某一个值

    比如我现在有个data数据如下: data: { playIndex: null, courseList: [{ videoId: '0', isPlaying: false, }, { videoI ...

  4. ViewPager自定义选项卡

    转自:http://www.open-open.com/lib/view/open1352621601262.html

  5. 关于Unity中自带摇杆与车轮碰撞器的使用

    准备 在创建好项目目录的基础上 导入一个第三方的资源包,在Project面板里面 右键---->Import Package---->Custom Package---->easy_ ...

  6. Mac和Linux下pip更换源

    cd ~mkdir .pip vim .pip/pip.conf 在pip.conf中写入 [global]timeout = 6000index-url = https://pypi.tuna.ts ...

  7. 对微软Microsoft Dynamics CRM 的认识

    MS CRM的认识 技术层面: MS CRM使用了当前最为流行的Web Service作为数据交互的手段,这给我们的二次开发和系统级的集成带来了无可比拟的方便性.易用性.我们不用关心如何去访问CRM数 ...

  8. qualcomm batch 烧录脚本

    在烧录android系统候用到了windows的批处理文件,拿出来分析一下,顺便记录一下高通平台烧录系统的命令. @echo off :: @ :不显示后面的命令,就是后面的"echo of ...

  9. C# 将DateTime.Now.DayOfWeek的值转为中文星期

    1.  如果常规使用DateTime.Now.DayOfWeek则得到是英文,如果加ToString后再加上相关参数(“G”.“g”.“X”.“x”.“F”.“f”.“D”或“d”),则还会有所变化. ...

  10. Keepalived + Nginx + Tomcat 的高可用负载均衡架构搭建

    Keepalived + Nginx + Tomcat 的高可用负载均衡架构搭建 Nginx 是一个高性能的 HTTP反向代理服务器 Keepalived 是一个基于VRRP协议来实现的LVS服务高可 ...