前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php弱类型引发的血案

php弱类型引发的血案

作者头像
用户5878089
发布2019-07-24 14:46:05
1.1K0
发布2019-07-24 14:46:05
举报

一个php题目代码审计的CTF题目:

来自西电网信杯线下赛

代码语言:javascript
复制
if(intval($password) <  && intval($password + ) > ))

直接提交password=0x123 就好了

同样的代码 在php7里面测试不成功 这是为什么呢

在PHPstudy里面测试

php5+的版本里面都是成功的

php7+的版本里面都是失败的

修改一下代码

代码语言:javascript
复制
echo '+++++++++++++++++++++++++++++++++++++++++++++++';
echo '<br>';
echo $password;
echo '<br>';
echo intval($password);
echo '<br>';
echo $password+;
echo '<br>';
echo intval($password + );
echo '<br>';
echo '+++++++++++++++++++++++++++++++++++++++++++++++';

测试一下效果:

php7里面 结果如下:

代码语言:javascript
复制
0x1234
0
1
1

php5里面 结果如下:

代码语言:javascript
复制
0x1234
0
4661
4661

猜测:

最开始以为是和这个intval有关系

后来发现intval的结果是一样的,那么问题就出在php5和php7的强制类型转换上,按照上面的结果可以发现,php5在相加之前把0x1234 变成一个十进制数字,而php7则是将0x1234 变成0之后和1相加,那么问题来了,为什么会有这种差异呢 ,去查阅一下文档就知道了

代码语言:javascript
复制
PHP 在变量定义中不需要(或不支持)明确的类型定义;变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个 string 值赋给变量 $var,$var 就成了一个 string。如果又把一个integer 赋给 $var,那它就成了一个integer。 
代码语言:javascript
复制
PHP  以前的版本里,如果向八进制数传递了一个非法数字(即  或 ),则后面其余数字会被忽略。PHP  以后,会产生 Parse Error。 

有一个弱类型的通用语句:

代码语言:javascript
复制
$test = $_GET['test'];
echo $test + 1;
//test=1asdf

php5

代码语言:javascript
复制
2

php7

代码语言:javascript
复制
2

查看文档

主要因为php5.6到php7 之后一些特性的变化

代码语言:javascript
复制
https://www.php.net/manual/zh/migration7.incompatible.php
代码语言:javascript
复制
string处理上的调整
十六进制字符串不再被认为是数字

含十六进制字符串不再被认为是数字。例如:
<?php
var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1"));
?>

Output of the above example in PHP :

bool(true)
bool(true)
int()
string() "oo"

Output of the above example in PHP :

bool(false)
bool(false)
int()

Notice: A non well formed numeric value encountered in /tmp/test.php on line 
string() "foo"

这就一目了然了。

我是个菜? ,就是为了记录一下,师傅们不要搞我。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无级安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
代码审计
代码审计(Code Audit,CA)提供通过自动化分析工具和人工审查的组合审计方式,对程序源代码逐条进行检查、分析,发现其中的错误信息、安全隐患和规范性缺陷问题,以及由这些问题引发的安全漏洞,提供代码修订措施和建议。支持脚本类语言源码以及有内存控制类源码。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档