php开发实战1200例 源码(PHP代码安全杂谈)

wufei123 发布于 2024-08-18 阅读(9)

替换高清大图虽然PHP是世界上最好的语言,但是也有一些因为弱类型语言的安全性问题出现WordPress历史上就出现过由于PHP本身的缺陷而造成的一些安全性问题,如 CVE-2014-0166 中的cookie伪造就是利用了PHP Hash比较的缺陷。

当然一般这种情况实战中用到的不是很多,但是在CTF竞赛中却是一个值得去考察的一个知识点,特此记录总结之一、精度绕过缺陷理论在用PHP进行浮点数的运算中,经常会出现一些和预期结果不一样的值,这是由于浮点数的精度有限。

尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16 非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递下面看一个有趣的例子:。

以十进制能够精确表示的有理数如 0.1 或 0.7 ,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式这就会造成混乱的结果:例如, floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8 ,因为该结果内部的表示其实是类似 7.9999999999999991118… 。

实践问鼎杯2017 老眼昏花网上很多write-up感觉就像是看着答案写write-up,个人感觉真正的write-up中应该体现自己的思考在里面。题目描述

题目言简意赅,让我们把 2017 这个值传递给服务器考察点PHP浮点精确度write-upwhat year is this? 所以第一反应是直接给 year 参数赋值为 2017 :?year=2017。

然而结果如下:

有提示了,说明 year 这个参数是对的,但是 2017 中不可以出现 7 ,这里如果不了解php精度的话,肯定是对 2017 进行各种编码绕过,但是这里对编码也进行过滤了:

所以最后一种可能就是利用PHP精度来绕过:?year=2016.99999999999

二、类型转换的缺陷理论PHP提供了 is_numeric 函数,用来变量判断是否为数字PHP弱类型语言的一个特性,当一个整形和一个其他类型行比较的时候,会先把其他类型intval数字化再比实践is_numeric() 用于判断是否是数字,通常配合数值判断。

案例代码665){ echo $flag; } ?>

考察点PHP类型转换缺陷write-up分析下代码:首先对GET方式提交的参数 id 的值进行检验 id 通过 is_numeric 函数来判断是否为数字,如果为数字的话,GG如果不是数字的话,和 665 进行比较, id 的值大于 665的时候输出 flag 。

乍看上去又好像不可能这里,但是如果知道 PHP弱类型语言的一个特性,当一个整形和一个其他类型行比较的时候,会先把其他类型intval数字化再比 这个特性的话就可以很好的绕过http://localhost/?id=666gg。

三、松散比较符的缺陷理论php比较相等性的运算符有两种,一种是严格比较,另一种是松散比较。如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行

严格比较符 严格比较符,会先判断两种字符串的类型是否相等,再比较。=== //全等 !== //不全等

松散比较符松散比较符,会先将字符串类型转换成相同,再比较== //等于 != //不等替换高清大图PHP 会根据变量的值,自动把变量转换为正确的数据类型这一点和C 和 C++ 以及 Java 之类的语言明显不同。

虽然这样PHP方便了程序员,但是随之而来却会带来一些安全性的问题一个简单的例子

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。