PHP常见特性(bug)

这篇具有很好参考价值的文章主要介绍了PHP常见特性(bug)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言:

1、intval():

一些特性:

2、__wakeup() :

3、strcmp() :

4、assert():

5、eval():

6、include():

7、readfile():

8、call_user_func():

9、trim():

10、is_number():

11、extract():

12、parse_str():

13、get_defined_vars():

14、gettext():

15、匿名函数(create_function):

16、$_SERVER['argv']:

17、哈希函数:

18、命令执行函数:

有回显:

无回显:

19、全局变量:

20、自增绕过:

21、违规变量名:

22、无法处理数组的函数:

23、命令运算:

        24、加减乘除运算符:

        25、 位运算符:

        26、三目运算符:

27、PHP代码表示方式:

1、正常写法xml格式

2、短标签

3、asp风格写法

4、长标签风格

28、松散比较:


前言:

此文中的PHP特性,都是博主在CTF题目以及渗透实战中所遇到的,可能有疏漏或不对的地方,还望各位大佬多多指出,感谢!

1、intval():

格式:intval (var, base)

  • base: 可选,无则十进制
  • 如果 base 是 0,通过检测 var 参数的格式来决定使用的进制(0开头8进制,0x开头16进制)

一些特性:

1、获取变量的整数值

例如 4.2取4

2、传入的字符串存在字母时,只会取字母前面的数字

例如 6e123 取6

3、函数里面有运算式,会把e正确识别为科学计数法符号,并进行运算

例如 intval(1e1+1) = 11

4、在没有运算式时,只会取e前面的数字,并不会把e看做科学计数法符号

参考2

5、在传入的参数非数字字符时,一律返回0

例如:

intval('a')==0 intval('.')==0intval('/')==0

0与字符串进行弱比较返回值为true,详细请看下文松散比较表格

6、非空数组返回1,空数组返回0

2、__wakeup() :

在反序列化之后立即被调用

将变量数改为大于真实变量数即可绕过

3、strcmp() :

格式:strcmp(str1,str2)

该函数返回值:

  • 0 - 如果两个字符串相等
  • <0 - 如果 string1 小于 string2
  • >0 - 如果 string1 大于 string2

strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,正是利用这点进行绕过

例如:传入数组类型 str1[]=666

只有PHP5.3有此漏洞

4、assert():

会把读到的字符串当做PHP执行,末尾不需要引号

5、eval():

会把读到的字符串当做PHP执行,末尾要有引号

6、include():

文件包含漏洞,会执行读到的PHP源码

特性:即使路径中的头目录不存在,也可以正确执行包含目标文件

例如: hint.php?/../../../flag.php

hint.php?这个目录不存在,但仍能够往上跳转4级目录,去包含flag.php

常见的文件包含函数还有:

include_once( )

功能与 Include()相同,区别在于当重复调用同一文件时,程序只调用一次

require( )

require()与 include()的区别在于 require()执行如果发生错误,函数会输出

错误信息,并终止脚本的运行。

require_once( )

功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次。

7、readfile():

读取一个文件,并写入到输出缓冲

特性:即使路径中的头目录不存在,也可以正确读取目标文件

例如: hint.php?/../../../flag.php

和include相似

8、call_user_func():

回调函数,call_user_func(a,b,...)  a为要执行的函数名,剩下的都为a的参数,可以没有

返回值为将参数带入a函数的执行结果

但该函数还可以接受数组来调用类中的静态方法

例如:
call_user_func($array);
调用classname这个类里的sya_hello方法

array[0]=$classname  类名
array[1]=say_hello   say_hello()静态方法

9、trim():

该函数会移除变量中的

  • "\0" - NULL
  • "\t" - 制表符
  • "\n" - 换行
  • "\x0B" - 垂直制表符
  • "\r" - 回车
  • " " - 空格

但不会移除 \f 换页符,ASCII值为12 url编码为%0c

10、is_number():

可解析科学计数法

判断变量是否为纯数字,但变量开头有非打印字符(如\f \n)仍会识别为数字

11、extract():

将数组变量中的键和键值转化为变量名和变量,如果有冲突,则覆盖已有的变量

例子:
<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c";
?>
// $a=Cat;$b=Dog;$c=Horse

12、parse_str():

函数把查询字符串(例如这种:name=Peter&age=43)解析到变量中

格式: parse_str(string,array)

array可选(规定存储变量的数组名称,该参数指示变量存储到数组中)

如果不设置array参数,将会覆盖同名变量

例如:
<?php
parse_str("name=Peter&age=43");
echo $name."<br>";
echo $age;
?>
// Peter
   43

13、get_defined_vars():

返回由所有已定义变量所组成的数组

可配合 var_dump使用

14、gettext():

gettext() 函数的工作原理是,在翻译前,需要使用 gettext() 函数将要翻译的文本字符串标记为可翻译字符串,然后环境中是什么语言,就会输出相应语言的翻译,该函数可用于凑数

_()是gettext()的拓展函数在开启相关设定后,_("666")等价于gettext("666")

<?php
echo gettext(666);   //输出 666
echo "\n";
echo _("666");        //输出 666
?>

15、匿名函数(create_function):

php里默认命名空间是\,所有原生函数和类都在这个命名空间中

调用该函数需要前面加斜杠 /create_function()

该函数内部构造类似于

function fT(,$a) {
  echo "test".$a;
}

该函数不需要第一个参数,并可添加第二个参数,可用于构造闭合

该函数自PHP 7.2起已经弃用

16、$_SERVER['argv']:

$_SERVER['argv']:

1、cli模式(命令行)下

    第一个参数$_SERVER['argv'][0]是脚本名,其余的是传递给脚本的参数

2、web网页模式下

    在web页模式下必须在php.ini开启register_argc_argv配置项
    
    设置register_argc_argv = On(默认是Off),重启服务,$_SERVER[‘argv’]才会有效果

    这时候的$_SERVER[‘argv’][0] = $_SERVER[‘QUERY_STRING’]   此变量为URL问号后面的所有值

    $argv,$argc在web模式下不适用

17、哈希函数:

哈希函数(sha1,md5等),无法处理数组,若处理,会返回NULL,可用于===强比较

18、命令执行函数:

有回显:

system()

passthru()

无回显:

exec()

shell_exec()  或者`` 反引号

无回显函数需要添加echo  输出 exec只返回最后一行内容 ,shell_exec()返回完整内容

在题目中如果没有echo的话,需要利用curl来实现flag.php的外带

19、全局变量:

$GLOBALS所有已定义的变量都在此变量数组里存储

var_dump($GLOBALS) 可查看所有的变量信息

20、自增绕过:

payload:

code=$=(/.);$=$[''!=''];$%ff=%2b%2b$;$%ff=%2b%2b$.$%ff;$%2b%2b;$%2b%2b;$%ff.=%2b%2b$;$%ff.=%2b%2b$;$=.$%ff;$$_;&=system&__=cat /flag

21、违规变量名:

PHP变量名由数字字母下划线组成,GET或POST方式传进去的变量名,会自动将空格 + . [转换为_

有一种特殊情况,GET或POST方式传参时,变量名中的 [ 也会被替换为_,但其后的字符就不再进行替换了

CTF[SHOW.COM = CTF_SHOW.COM

22、无法处理数组的函数:

md5() 返回NULL

sha1() 返回NULL

preg_match() 返回false

intval() 非空数组返回1,空数组返回0

stripos() 返回NULL

strcmp() 返回0

23、命令运算:

php里数字可以和命令可以进行运算,且不影响运行结果

并且也可以使用位运算符 |,或三目运算符

        24、加减乘除运算符:

<?php
$v1=1;
$v2=3;
$v3=-phpinfo();+  (url编码)
    $code =  eval("return $v1$v3$v2;");
    echo "$v1$v3$v2 = ".$code;
?>

        25、 位运算符:

<?php
$v1=1;
$v2=3;
$v3=|phpinfo();| (url编码)
    $code =  eval("return $v1$v3$v2;");
    echo "$v1$v3$v2 = ".$code;
?>

        26、三目运算符:

<?php
$v1=1;
$v2=?phpinfo():;
$v3=1;
eval("return $v1$v2$v3;'");
>  

27、PHP代码表示方式:

1、正常写法xml格式

<?php
echo '1111';
?>

2、短标签

<?
echo '1111';
?>

<?=  //相当于<? echo
?>

 需要 php.ini 配置文件中的指令 short_open_tag 打开后才可用,或者在 PHP 编译时加入了 --enable-short-tags 选项。自 PHP5.4 起,短格式的 echo 标记 <?= 总会被识别并且合法,而不管 short_open_tag 的设置是什么

3、asp风格写法

<%
echo '1111';
%>

 (注意:这种写法在php配置中默认关闭了的,如果要正常输出,需要配置php.ini文件。在配置文件中找到asp_tags=off ,将off改为on。改动配置文件后需要重启apache。)但是在php7之后被移除了

4、长标签风格

<script language="php">



</script>

在php7之后被移除了

28、松散比较:

PHP常见特性(bug)文章来源地址https://www.toymoban.com/news/detail-439888.html

到了这里,关于PHP常见特性(bug)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PHP特性之CTF中常见的PHP绕过

    目录 一、关于md5()和sha1()的常见绕过 1、使用数组绕过 2、 使用特殊字符串绕过 二、strcmp绕过 三、switch绕过 四、intval绕过 人工智能 https://www.captainbed.cn/myon/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   正文开始   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 知识介绍: 1、对于php强比较和弱比较:md5(),sha1()函

    2024年02月07日
    浏览(41)
  • CTF必看~ PHP反序列化漏洞6:绝妙_wakeup绕过技巧

    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半

    2024年02月08日
    浏览(40)
  • 《Git入门实践教程》前言+目录

    版本控制系统(VCS)在项目开发中异常重要,但和在校大学生的交流中知道,这个重要方向并未受到重视。具备这一技能,既是项目开发能力的体现,也可为各种面试加码。在学习体验后知道,Git多样化平台、多种操作方式、丰富的资源为业内人士提供了方便的同时,也造成

    2024年02月10日
    浏览(72)
  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(58)
  • 【明道云】关于环境迁移的一些Bug

    部署了明道云的测试环境和生产环境两个环境,在测试环境开发的东西需要迁移到生产环境中去,这个过程中发现一些问题。 迁移分为两个部分,应用功能的迁移和记录内容的迁移。 应用功能的迁移 这个只需要利用现有功能,在测试环境中导出应用,再在生产导入应用即可

    2024年02月20日
    浏览(34)
  • Vant 4.6.4发布,增加了一些新功能,并修复了一些bug

    导读 Vant 4.6.4发布,增加了一些新功能,并修复了一些bug等。 新功能 feat(area-data): 更新芜湖的县区数据,由 nivin-studio 在 #12122 中贡献 feat(Locale): 添加塞尔维亚语到国际化,由 RogerZXY 在 #12145 中贡献 feat(ImagePreview): 添加 closeOnClickOverlay 选项,由 chenjiahan 在 #12153 中贡献 feat(List)

    2024年02月11日
    浏览(36)
  • 微服务系列文章 之 SpringCloud中遇到的一些bug

    错误原因: 该服务尝试将自己作为客服端注册 解决办法: 在application.yml配置文件中,设置 错误原因: 使用的框架是Spring Boot,处理完请求之后,返回数据之前,在POJO转化成JSON时,有些属性违背输出规则或者有些属性循环引用会造成无法输出。 解决办法: 在实体类上面

    2024年02月16日
    浏览(47)
  • 【C++】一些关于visual stdio,vscode,Mingw的思考 |bug

    今天在做YOLOV8的C++部署时遇到的一些问题: 在进行一系列的操作之后会生成解决方案文件sln: 当然按道理到这一步之后,应该使用make命令进行下一步操作(但是我确实不会make命令,所以准备进sln来生成解决方案): 点开后会发现有一个解析命令行参数的库文件没有(因为这

    2024年02月11日
    浏览(43)
  • vue3中Fragment特性的一个bug,需要留意的注意事项

    vue3中的Fragment 模版碎片特性是什么,简单的理解就是 template模板代码 不在像vue2中那样必须在根节点在包裹一层节点了。 vue2写法 vue3写法 vue3中Fragment特性的一个bug(需要留意的问题) 组件HelloWorld: 组件HelloWorld的使用 同时控制台waring : 利用开发者模式看dom结构, 发现v-show的

    2024年01月22日
    浏览(44)
  • 测试常见前端bug

    目录 协作 后端:确定 数据类型保持一致 修改公共组件:同步修改 测试方法 标签:标签 内容/ref/ 调用方法/属性前要确保一定存在:赋初值/判断 arrarr.length this.$message.error(e e.msg) UI 动态文字 交互 包裹icon 样式不生效:devtools查找,编译前的标签,运行时不一定存在 可交互的

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包