PHP弱类型漏洞学习
简介
PHP在使用双等号(==)判断的时候,不会严格检验传入的变量类型,同时在执行过程中可以将变量自由地进行转换类型。由于弱数据类型的特点,在使用双等号和一些函数时,会造成一定的安全隐患
eg:
<?php
var_dump("admin"==0); //true
var_dump("1admin"==1); //true
var_dump("admin1"==1); //false
var_dump("admin1"==0); //true
var_dump("0e123456"=="0e4456789"); //true
?>
== 在进行比较的时候,会先将字符串类型转化成相同,再比较
=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
Hash比较缺陷
研发人员在对比Hash2字符串的时候常常用到等于、不等于(!=)进行比较。如果Hash值以0e开头,后面都是数字,当与数字进行比较时,就会被解析成0x10n,会被判与0相等,攻击者可以绕过某些系统逻辑
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
攻击者可以利用这一漏洞,通过输入一个经过哈希后以”0E”开头的字符串,即会被PHP解释为0,如果数据库中存在这种哈希值以”0E”开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。
<?php
var_dump("0e123456789012345678901234567890"==="0"); //false
var_dump("0e123456789012345678901234567890"=="0"); //true
?>
加密后为0E的字符
QNKCDZO
0e830400451993494058024219903391 s878926199a
0e545993274517709034328855841020 s155964671a
0e342768416822451524974117254469 s214587387a
0e848240448830537924465865611904 s214587387a
0e848240448830537924465865611904 s878926199a
0e545993274517709034328855841020 s1091221200a
0e940624217856561557816327384675 s1885207154a
0e509367213418206700842008763514 s1502113478a
0e861580163291561247404381396064 s1885207154a
0e509367213418206700842008763514 s1836677006a
0e481036490867661113260034900752 s155964671a
0e342768416822451524974117254469 s1184209335a
0e072485820392773389523109082030 s1665632922a
0e731198061491163073197128363787 s1502113478a
0e861580163291561247404381396064 s1836677006a
0e481036490867661113260034900752 s1091221200a
0e940624217856561557816327384675 s155964671a
0e342768416822451524974117254469 s1502113478a
0e861580163291561247404381396064 s155964671a
0e342768416822451524974117254469 s1665632922a
0e731198061491163073197128363787 s155964671a
0e342768416822451524974117254469
CTF例题
<?php
$pass=$_GET['password'];
$password='0e342768416822451524974117254469'; if (md5($pass)==$password) {
echo "flag{xx-xx-xxxx-xiaohua}";
}else{
echo "error";
} ?>
payload:
http://127.0.0.1/index.php?password=s1885207154a
预防方案 :
PHP5.6以上使用hash_equals()函数比较Hash值,可以避免对比恶意绕过
低于5.6可用可以实现的函数解决
参考学习:https://www.freebuf.com/news/67007.html
bool比较缺陷
在使用json_decode()函数或使用unserialize()函数时,部分结构被解释成bool类型,也会造成缺陷。
json_decode漏洞代码:
<?php
$str='{"user":true,"pass":true}';
$data=json_decode($str,true); if($data['user']=='root' && $data['pass']=='myPass'){
print_r('登陆成功 获得flag{xx-ssss-xiaohua}');
}else{
print_r('登陆失败!');
}
unserialize漏洞代码:
<?php
$str='a:2:{s:4:"user";b:1;s:4:"pass";b:1;}';
$data=unserialize($str); if($data['user']=='root' && $data['pass']=='myPass'){
print_r('登陆成功 获得flag{xx-ssss-xiaohua}');
}else{
print_r('登陆失败!');
}
?>
避免bool比较可以使用三个等号作比较即可。
数字转换比较缺陷
当赋值给PHP变量的整型超过PHP的最大值PHP_INT_MAX时,PHP将无法计算出正确的结果,攻击者可能会利用其跳过某些校验逻辑,如密码校验、账号充值校验等
<?php
$a=98869694308861098395599991222222222222;
$b=98869694308861098395599992999999999999; var_dump($a===$b); ?>
再实际的业务逻辑中,一定要对最大值进行限制,避免数据越界而导致错误的执行结果。
switch比较缺陷
当再switch中使用case判断数字时,switch会将其中的参数转换为int类型进行计算
<?php
$num='2xiaohua';
switch($num){
case 0:echo '000000';
break;
case 1:echo '1111';
break;
case 2:echo '2222222';
break;
case 3:echo '333333';
} ?>
最终输出2222
数组比较缺陷
当使用in_array()或array_search()函数时,如果$strict参数吗有设置为true,则in_array()或array_search()将使用松散来判断$needle是否存在$haystack中
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )//strict默认为false
miixed array_search( mixed $needle , array $haystack [, bool $strict = FALSE ] )//strict默认为false
漏洞代码:
<?php
$array=[0,1,2,'3'];
var_dump(in_array('abc',$array));
var_dump(array_search('abc',$array)); ?>
2222
参考学习:《php安全之道》
PHP弱类型漏洞学习的更多相关文章
- CTF中常见的 PHP 弱类型漏洞总结
作者:ZERO 所属团队:Arctic Shell 参考资料: http://archimesan.me/2017/12/21/php%E5%BC%B1%E7%B1%BB%E5%9E%8B%E6 ...
- 攻防世界-Web-lottery(.git泄露、php源码审计、弱类型利用)
扫描目录,发现.git泄露: 提取.git泄露的源码,得到许多文件: 网站这里: 这就要审计一下代码,找找漏洞了. 经过一番审计,猜数字对应的函数在api.php中: 我们要绕过这个$win_numb ...
- PHP弱类型:WordPress Cookie伪造
1 PHP弱类型 PHP是弱类型语言,所以变量会因为使用场景的不同自动进行类型转换.PHP中用 == 以及 != 进行相等判断时,会自动进行类型转换,用 === 以及 !== 进行判断时不会自动转换类 ...
- PHP弱类型语法的实现
PHP弱类型语法的实现 前言 借鉴了 TIPI, 对 php 源码进行学习 欢迎大家给予意见, 互相沟通学习 弱类型语法实现方式 (弱变量容器 zval) 所有变量用同一结构表示, 既表示变量值, 也 ...
- XSS漏洞学习笔记
XSS漏洞学习 简介 xss漏洞,英文名为cross site scripting. xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的. 说白了就是想尽办法让你加载 ...
- PHP代码审计笔记--弱类型存在的安全问题
0x01 前言 PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型. 弱类型比较,是一个比较蛋疼的问题,如左侧为字符串,右侧为一个整 ...
- PHP反序列漏洞学习
0x00 序列化和反序列化 在PHP中,序列化和反序列化对应的函数分别为serialize()和unserialize(). 序列化:serialize()将对象转换为字符串以便存储传输的一种方式. ...
- php 弱类型总结
0x01 前言 最近CTF比赛,不止一次的出了php弱类型的题目,借此想总结一下关于php弱类型以及绕过方式 0x02 知识介绍 php中有两种比较的符号 == 与 === <?php $a = ...
- [代码审计]php弱类型总结
0x01 前言 php是世界上最好的语言,所以php自身的安全问题也是web安全的一个方面.由于其自身弱类型语言的特性以及内置函数对于传入参数的松散处理,所以会带来很多的问题,这里将进行简要介绍. 弱 ...
随机推荐
- Ubuntu18.04中安装virtualenv和virtualenvwrapper
1.安装virtualenv和virtualenvwrapper pip3 install virtualenv pip3 install virtualenvwrapper 2.创建目录用来存放虚拟 ...
- GeoServer发布shapfile字段名和值乱码问题解决
摘要: 网上说了一大堆方法又是转格式咯又是改源代码了,修改很简单: 修改Styles下的你的style: Xml代码 修改Stores下你的图层的属性,设置 DBF charset为GBK 以上设置G ...
- 分布式协调服务之Zookeeper集群部署
一.分布式系统概念 在聊Zookeeper之前,我们先来聊聊什么是分布式系统:所谓分布式系统就是一个系统的软件或硬件组件分布在网络中的不同计算机之上,彼此间通过消息传递进行通信和协作的系统:简单讲就是 ...
- PyTorch 中 weight decay 的设置
先介绍一下 Caffe 和 TensorFlow 中 weight decay 的设置: 在 Caffe 中, SolverParameter.weight_decay 可以作用于所有的可训练参数, ...
- Ubuntu Eclipse启动时报错:A Java RunTime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. No java virtual machine was found after searching the following locations:
此问题起于我在Ubuntu1004上装了两个版本的eclipse:Galieo+helios:卸载前者后出现启动不了eclipse的问题:在网上找了下,可以按如下过程进行解决: Eclipse 3 ...
- js堆排序
堆的预备知识 堆是一个完全二叉树. 完全二叉树: 二叉树除开最后一层,其他层结点数都达到最大,最后一层的所有结点都集中在左边(左边结点排列满的情况下,右边才能缺失结点). 大顶堆:根结点为最大值,每个 ...
- 一份超全的Python学习资料汇总
一.学习Python必备技能图谱二.0基础如何系统学习Python?一.Python的普及入门1.1 Python入门学习须知和书本配套学习建议1.2 Python简史1.3 Python的市场需求及 ...
- List集合,对象根据某个相同的属性,合并另外属性
描述及实现: 1.List中有 Modular字段值有重复一样的2.Modular字段一样的话去重并且OrderAmount相加 HashMap<String,DataReport> te ...
- MySQL全面瓦解3:数据类型介绍与分析
概述 MySQL支持很多数据类型,以便我们能在复杂的业务场景中支持各种各样的数据格式,存储适当的数据内容.我们在设计数据库时,正确的使用数据库类型对整个数据库的整洁和高效,会有很大的帮助. 目前常用的 ...
- selenium中的三种等待方式
1.强制等待,采用的time.sleep,然后后面加上要等待的时间: 2.隐性等待implicitly_wait,隐性等待设定后,会对之后的所有代码生效,会在设定的时间之内,不停的去查找元素,如果找到 ...