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. php 二维数组打乱顺序

    public function shuffle_assoc($list) { if (!is_array($list)) return $list; $keys = array_keys($list) ...

  2. R语言中的factor

    对于初学者来说,R语言中的factor有些难以理解.如果直译factor为“因子”,使得其更加难以理解.我倾向于不要翻译,就称其为factor,然后从几个例子中理解: <span style=& ...

  3. 引用dataframe的值为什么会不同

    在R语言中,通常有一些操作符可以来提取对象的子集,如以下三种: 1.“[” 单层方括号,返回的对象与原对象类型相同,它也可以返回一个对象中的多个元素: 2.“[[” 双层方括号,用来从列表(list) ...

  4. 【转】VSCode Web开发插件

    Web开发必备插件 1.Beautify - HTML.CSS.JS.JSON语法高亮 语法高亮,你懂的.   Beautify 2.Auto rename tag - 自动重命名标签 在HTML, ...

  5. <<、|=、&的小例子

    1. << 移位符 0x1 << 1  表示向左移1位 0x1二进制为:0001 左移1位:0010 效果: 2. | 按位或运算, & 按位与运算 enum STAU ...

  6. unity-----------------------------关于WheelCollider设置或小车运动的注意事项

    转载:Unity3d 汽车物理引擎 WheelCollider总结   WheelCollider总结 写了前面两篇文章,我想总结一下WheelCollider! 让我们能够更清晰的学会物理车的开发! ...

  7. application.properties详解 --springBoot配置文件

    本文转载:http://blog.csdn.net/lpfsuperman/article/details/78287265###; # spring boot application.propert ...

  8. 运行 Shell 脚本有两种方法:

    1.作为可执行程序 将上面的代码保存为 test.sh,并 cd 到相应目录: chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本 注意,一定要写成 ./tes ...

  9. fedora26 编译内核出现Can't use 'defined(@array)' 错误

    cd /kernel/ vim timeconst.pl 把373行中的if (!defined(@val)) { 改为if (!@val) {

  10. js 浅拷贝和深拷贝

    传值与传址 了解了基本数据类型与引用类型的区别之后,我们就应该能明白传值与传址的区别了.在我们进行赋值操作的时候,基本数据类型的赋值(=)是在内存中新开辟一段栈内存,然后再把再将值赋值到新的栈中.例如 ...