首页 后端开发 php教程 PHP弱类型安全问题总结

PHP弱类型安全问题总结

Nov 08, 2016 am 10:38 AM

前段时间做了南京邮电大学网络攻防平台上面的题目,写了一个writeup之后,还有必要总结一下。由于做的题目都是web类型的,所有的题目都是使用PHP来写的,所以很多题目并没有考察到传统的如SQL注入,XSS的类型的漏洞,很多都是PHP本身语法的问题。鉴于目前PHP是世界上最好的语言,PHP本身的问题也可以算作是web安全的一个方面。在PHP培训中的特性就是弱类型,以及内置函数对于传入参数的松散处理。本篇文章主要就是记录我在做攻防平台上面遇到的PHP的函数中存在的问题,以及PHP的弱类型所带来的问题。 
PHP弱类型简介 
在PHP中,可以进行一下的操作。 
$param = 1; 
$param = array(); 
$param = "stringg"; 
弱类型的语言对变量的数据类型没有限制,你可以在任何地时候将变量赋值给任意的其他类型的变量,同时变量也可以转换成任意地其他类型的数据。 
类型转换问题 
类型转换是无法避免的问题。例如需要将GET或者是POST的参数转换为int类型,或者是两个变量不匹配的时候,PHP会自动地进行变量转换。但是PHP是一个弱类型的语言,导致在进行类型转换的时候会存在很多意想不到的问题。 
比较操作符 
类型转换 
在$a==$b的比较中 
$a=null;$b=flase ; //true 
$a='';$b=null; //true 
这样的例子还有很多,这种比较都是相等。 
使用比较操作符的时候也存在类型转换的问题,如下: 
0=='0' //true 
0 == 'abcdefg' //true 
0 === 'abcdefg' //false 
1 == '1abcdef' //true 
当不同类型的变量进行比较的时候就会存在变量转换的问题,在转换之后就有可能会存在问题。 
Hash比较 
除了以上的这种方式之外在进行hash比较的时候也会存在问题。如下: 
"0e132456789"=="0e7124511451155" //true 
"0e123456abc"=="0e1dddada" //false 
"0e1abc"=="0"     //true 
在进行比较运算时,如果遇到了0e\d+这种字符串,就会将这种字符串解析为科学计数法。所以上面例子中2个数的值都是0因而就相等了。如果不满足0e\d+这种模式就不会相等。这个题目在攻防平台中的md5 collision就有考到。 
十六进制转换 
还存在一种十六进制余字符串进行比较运算时的问题。例子如下: 
"0x1e240"=="123456" //true 
"0x1e240"==123456 //true 
"0x1e240"=="1e240" //false 
当其中的一个字符串是0x开头的时候,PHP会将此字符串解析成为十进制然后再进行比较,0×1240解析成为十进制就是123456,所以与int类型和string类型的123456比较都是相等。攻防平台中的起名字真难就是考察的这个特性。 
类型转换 
常见的转换主要就是int转换为string,string转换为int。 
int转string: 
$var = 5; 
方式1:$item = (string)$var; 
方式2:$item = strval($var); 
string转int:intval()函数。 
对于这个函数,可以先看2个例子。 
var_dump(intval('2')) //2 
var_dump(intval('3abcd')) //3 
var_dump(intval('abcd')) //0 
说明intval()转换的时候,会将从字符串的开始进行转换知道遇到一个非数字的字符。即使出现无法转换的字符串,intval()不会报错而是返回0。 
intval()的这种特性在攻防平台中的MYSQL这道题目中就有考到。 
同时,程序员在编程的时候也不应该使用如下的这段代码: 
if(intval($a)>1000) { 
    mysql_query("select * from news where id=".$a) 

这个时候$a的值有可能是1002 union….. 
内置函数的参数的松散性 
内置函数的松散性说的是,调用函数时给函数传递函数无法接受的参数类型。解释起来有点拗口,还是直接通过实际的例子来说明问题,下面会重点介绍几个这种函数。 
md5() 
$array1[] = array( 
    "foo" => "bar", 
    "bar" => "foo", 
); 
$array2 = array("foo", "bar", "hello", "world"); 
var_dump(md5($array1)==var_dump($array2)); //true 
PHP手册中的md5()函数的描述是string md5 ( string $str [, bool $raw_output = false ] ),md5()中的需要是一个string类型的参数。但是当你传递一个array时,md5()不会报错,知识会无法正确地求出array的md5值,这样就会导致任意2个array的md5值都会相等。这个md5()的特性在攻防平台中的bypass again同样有考到。 
strcmp() 
strcmp()函数在PHP官方手册中的描述是int strcmp ( string $str1 , string $str2 ),需要给strcmp()传递2个string类型的参数。如果str1小于str2,返回-1,相等返回0,否则返回1。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。 
如果传入给出strcmp()的参数是数字呢? 
$array=[1,2,3]; 
var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。 
strcmp这种特性在攻防平台中的pass check有考到。 
switch() 
如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型。如下: 
$i ="2abc"; 
switch ($i) { 
case 0: 
case 1: 
case 2: 
    echo "i is less than 3 but not negative"; 
    break; 
case 3: 
    echo "i is 3"; 

这个时候程序输出的是i is less than 3 but not negative,是由于switch()函数将$i进行了类型转换,转换结果为2。
in_array() 
在PHP手册中,in_array()函数的解释是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ),如果strict参数没有提供,那么in_array就会使用松散比较来判断$needle是否在$haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同。 
$array=[0,1,2,'3']; 
var_dump(in_array('abc', $array));  //true 
var_dump(in_array('1bc', $array)); //true 
可以看到上面的情况返回的都是true,因为’abc’会转换为0,’1bc’转换为1。 
array_search()与in_array()也是一样的问题。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP记录:PHP日志分析的最佳实践 PHP记录:PHP日志分析的最佳实践 Mar 10, 2025 pm 02:32 PM

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

在Laravel中使用Flash会话数据 在Laravel中使用Flash会话数据 Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

php中的卷曲:如何在REST API中使用PHP卷曲扩展 php中的卷曲:如何在REST API中使用PHP卷曲扩展 Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了 简化的HTTP响应在Laravel测试中模拟了 Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本 在Codecanyon上的12个最佳PHP聊天脚本 Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

解释PHP中晚期静态结合的概念。 解释PHP中晚期静态结合的概念。 Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

自定义/扩展框架:如何添加自定义功能。 自定义/扩展框架:如何添加自定义功能。 Mar 28, 2025 pm 05:12 PM

本文讨论了将自定义功能添加到框架上,专注于理解体系结构,识别扩展点以及集成和调试的最佳实践。

See all articles