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. 怎么解决JSP中出现乱码的问题

    首先我们先了解一下问题的原因.一般情况在在每个JSP页的头部都有这样一条语句: 这条语句决定了此页面使用GB2312编码形式,而在数据库中一般用的是iso-8859-1字符集存储数据. 而Java程序 ...

  2. postgresql远程连接中断的处理

    在网络上连接远程服务器postgresql时,不活动时间稍长就会自动断开连接,不利于操作. 琢磨了一下,服务器上使用以下网络配置时,解决了这个问题.   #man 7 tcp   net.ipv4.t ...

  3. mysql游标的使用

    这是一个游标的使用例子. 但是其中有几点需要注意,就是为什么要加入 declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname = null;这 ...

  4. 使用cssQuery选择器语法来查找元素

    使用选择器语法来查找元素 问题 你想使用类似于CSS或jQuery的语法来查找和操作元素. 方法 可以使用Element.select(String selector) 和 Elements.sele ...

  5. 【Python】windows电脑 python3.6安装lxml库

    1.下载lxml的wheel文件 https://download.lfd.uci.edu/pythonlibs/t5yhk4lc/lxml-4.2.1-cp36-cp36m-win32.whl 其他 ...

  6. e834. 设置JTabbedPane中卡片的位置

    The tabs of a tabbed pane can be placed on one of the four edges of its container. By default, when ...

  7. Java注解Annotation学习笔记

    一.自定义注解 1. 使用关键字 @interface 2. 默认情况下,注解可以修饰 类.方法.接口等. 3. 如下为一个基本的注解例子: //注解中的成员变量非常像定义接口 public @int ...

  8. Java多线程之细说线程池

    前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...

  9. 【FastJSON】使用JSON.toJSONString()-解决FastJson中“$ref 循环引用”的问题

    fastjson 是一个 不错的json格式化工具, 但是在使用时,如果 碰到统一地址对象引用,就会用$ref替代 . 怎么去掉ref呢, 解决方法如下: String mapStr = JSONOb ...

  10. ubuntu下gedit和vim输入中文和中文显示

    安装和配置VIM,参考   http://jingyan.baidu.com/album/046a7b3efd165bf9c27fa915.html?picindex=4 在home/你的用户名 这个 ...