文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP常见函数漏洞

2023-09-03 09:02

关注

目录

前言:

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)

一些特性:

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)

该函数返回值:

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():

该函数会移除变量中的

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

 

10、is_number():

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

 

11、extract():

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

例子: "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参数,将会覆盖同名变量

例如:";echo $age;?>// Peter   43

 

13、get_defined_vars():

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

可配合 var_dump使用

 

14、gettext():

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

_()是gettext()的拓展函数在开启相关设定后,_("666")等价于gettext("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() 返回NULLsha1() 返回NULLpreg_match() 返回falseintval() 非空数组返回1,空数组返回0stripos() 返回NULLstrcmp() 返回0

 

 

23、命令运算:

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

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

        24、加减乘除运算符:

        25、 位运算符:

        26、三目运算符:

  

27、PHP代码表示方式:

1、正常写法xml格式

2、短标签

 需要 php.ini 配置文件中的指令 short_open_tag 打开后才可用,或者在 PHP 编译时加入了 --enable-short-tags 选项。自 PHP5.4 起,短格式的 echo 标记

3、asp风格写法

<%echo '1111';%>

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

4、长标签风格

在php7之后被移除了

28、松散比较:

04ac74dbffdf4e78b8c6edaea7527189.png

 

 

 

 

来源地址:https://blog.csdn.net/Elite__zhb/article/details/130095325

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯