PHP特殊函数

(基本上是根据show上面整理的,还有一起其他上面的)

intval

<?php
echo boolval(intval('a'))?'true':'false'; //false
echo boolval(intval('a', 16) === 10) ? 'true' : 'false'; //true 'a'代表需要转换为整数的变量 16代表转换时使用的进制,默认值为 10(十进制)。合法范围是 2 到 36

intval() 是 PHP 中的一个内置函数,其主要功能是将变量转换为整数类型,如果转换失败,就会返回0,不过这个函数如果包含的是数组,只要数组里面存在值,则返回1,反之,返回0,字符串转换规则:从开头提取数字,遇非数字停止(如 "1a" → 1,"a" → 0)。

preg_match

<?php
$num = 0x12306;
if (preg_match("/[0-9]/", $num)){
  die("no no no!");
} //no no no!

preg_match函数是正则匹配,匹配/【变量】/,如果正好匹配,则返回1,进入下面的条件

正则表达式修饰符

i 
不区分(ignore)大小写
m
多(more)行匹配
若存在换行\n并且有开始^或结束$符的情况下,
将以换行为分隔符,逐行进行匹配
$str = "abc\nabc";
$preg = "/^abc$/m";
preg_match($preg, $str,$matchs);
这样其实是符合正则表达式的,因为匹配的时候 先是匹配换行符前面的,接着匹配换行符后面的,两个都是abc所以可以通过正则表达式。
s
特殊字符圆点 . 中包含换行符
默认的圆点 . 是匹配除换行符 \n 之外的任何单字符,加上s之后, .包含换行符
$str = "abggab\nacbs";
$preg = "/b./s";
preg_match_all($preg, $str,$matchs);
这样匹配到的有三个 bg b\n bs
A
强制从目标字符串开头匹配;
D
如果使用$限制结尾字符,则不允许结尾有换行;
e
配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; 存在严重安全漏洞(如命令注入),PHP 7.0 后已移除。

===与==

===是强等于,需要类型和数值都相等于,==则是弱等于,会进行类型转换,数值相等就行,例如1a==1,0==任意字符

<?php
echo boolval(123===123)?'true':'false'; // 输出:true
echo boolval(0==='abc')?'true':'false';   // 输出:false
echo boolval(0=='a')?'true':'false';     // 输出:true
echo boolval(1=='1a')?'true':'false';     // 输出:true
?>

MD5与sha

if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
<?php
$a = [];
$b = [];
echo boolval(md5($a)==md5($b))?'true':'false'; //会报错,返回false

md5 弱类型比较可以直接数组绕过,其结果都会转换为 null,sha也类似

&

一:引用传递

他并不是指针的意思,而是不同的名字访问同一个变量内容

function increment(&$num) {
  $num++;
}
$a = 5;
increment($a);
echo $a; // 输出 6(函数直接修改了原始变量)

二:引用返回

函数可以通过 & 返回变量的引用,而非值的副本。

function &getArray() {
  static $arr = [1, 2, 3];
  return $arr;
}

$ref = &getArray();
$ref[] = 4;
echo implode(',', getArray()); // 输出 1,2,3,4

三:and连接符

这里插入一点,= > and

三元运算符

(expr1) ? (expr2):(expr3)。如果 expr1 为 true,则执行 expr2;否则,执行 expr3。

array_push

向数组尾部插入一个或多个元素。

rand

生成随机数。

in_array

in_array($a,$b):搜索数组中是否存在指定的值。第一个参数为要搜索的值,第二个参数为被搜索的数组。

绕过 in_array ():当没有指定第三个参数的时候,in_array 就相当于 ==,弱类型对比。

补充

in_array($needle, $haystack, $strict=false) 中,若 $strict 为 false,使用弱等于(==)比较;若为 true,使用强等于(===)。
绕过场景:如 in_array('1', [1]) 为 true(弱类型匹配),in_array('1', [1], true) 为 false。

file_put_conntent (filename, data):

filename是要写入名字为data文件的内容

is_numeric

用于检测变量是否为数字或数字字符串。

反射类

反射类(Reflection Classes)是 PHP 内置的一组类,用于实现反射功能,它们提供了对类、方法、属性、参数等的详细信息进行 introspection(内省)的能力。

作用

获取类的定义信息,例如类的属性、方法、常量等。 动态调用类的方法。 修改类的属性。 检查函数和方法的参数。

常见的类

 ReflectionClass:用于获取类的详细信息。 
ReflectionMethod:用于获取方法的详细信息。
ReflectionProperty:用于获取属性的详细信息。
ReflectionFunction:用于获取函数的详细信息。
ReflectionParameter:用于获取方法或函数参数的详细信息。
起一个栗子
<?php
class MyClass {
private $privateProp = 'private';
protected $protectedProp = 'protected';
}
$class = new \ReflectionClass('MyClass');
$properties = $class->getProperties();
foreach ($properties as $property) {
  $name = $property->getName();
  $value = $property->getValue(new MyClass());
  echo "$name: $value\n";
} //
privateProp: private
protectedProp: protected

substr

substr($a,$b):截取,从字符串$a里面截取$b位字符

call_user_func

call_user_func($a,$b):调用函数,第一个参数为被调用的函数,第二个参数为被调用函数所需的参数

栗子
<?php
// 示例1:调用普通函数
function aaa($a,$b) {
  echo $a*$b;
}
// 直接调用
echo aaa(1,2) . "\n"; //2
// 通过 call_user_func 调用
echo call_user_func("aaa", 1,2); //2

hex2bin()

将十六进制字符转化为 ASCII 码字符(hex2bin () 是 PHP 中的一个内置函数,用于将十六进制字符串转换为二进制字符串。返回值:成功时返回转换后的二进制字符串;如果输入的十六进制字符串无效,函数返回 false。十六进制字符串的长度必须是偶数,否则 hex2bin () 会返回 false)

变量覆盖

概念

变量覆盖漏洞是指自定义的参数替换原有变量值的情况,如$$使用不当,extract函数使用不当,parse_str() 函数使用不当,import_request_variables() 使用不当,开启了全局变量注册等。

全局变量导致的变量覆盖

漏洞简介:

当register_globals全局变量设置开启时,传递过来的值会被直接注册为全局变量而使用,这会造成全局变量覆盖 。

register_globals全局变量设置, 在PHP5.3之前默认开启, PHP5.3默认关闭 ,PHP5.6以后已经被移除 。

<?php
$num=0;
if ($num){
echo "flag{this is flag}";
}
?>
//payload: http://xx.xx.xx.xx/test.php?num=1
//result: flag{this is flag}
//解析:由于我们使用的是低版本的PHP,默认开启了全局变量,当我们传入num的时候,PHP会直接将传入的参数定义为全局变量,导致变量覆盖。

$$动态变量覆盖

PHP动态变量是指一个变量名的变量名可以动态的设置和使用,一个变量获取另一个变量的值作为这个变量的变量名。

<?php
$bar= "a";
$foo="bar";
$world="foo";
$hello="world";
$a="hello";

echo $a;       // hello
echo $$a;       // world
echo $$$a;     // foo
echo $$$$a;     // bar
echo $$$$$a;   // a
echo $$$$$$a;   // hello
echo $$$$$$$a; // world

extract()函数变量覆盖

定义:extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量,返回成功设置的变量数目。
语法:extract(array,extract_rules,prefix)
//array:必须,规定用于准换的数组
//extract_rules:可选,函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。默认设置EXTR_OVERWRITE,有冲突则覆盖。
//prefix:该参数规定了前缀。前缀和数组键名之间会自动加上一个下划线,可选。
<?php
$a = "Original";
$my_array = array("a" => "Cat", "b" => "Dog", "c" => "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c; ";
?>
//result: $a = Cat; $b = Dog; $c = Horse;

parse_str函数变量覆盖

语法:parse_str(string,array)
定义:parse_str() 函数把查询字符串解析到变量中。如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。
注释:php.ini 文件中的 magic_quotes_gpc 设置影响该函数的输出。如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。
<?php
parse_str("a=this&b=is&c=flag");
echo $a." ";
echo $b." ";
echo $c;
?>
//this is flag

parse_str

把v1的值相应的换成键值对再存入v2
<?php
// 模拟传入的 URL 查询字符串
$query = "username=alice&role=admin";

// 第二个参数指定存放解析结果的数组
parse_str($query, $params);

echo "用户名:" . $params['username'] . "\n"; // 输出:用户名:alice
echo "角色:" . $params['role'] . "\n";       // 输出:角色:admin
?>

strrev

反转字符串

<?php
echo strrev("hello");
?>
//olleh

异常处理

常见的 PHP 异常类
Exception

使用场景:Exception 是所有异常类的基类。任何未被特定异常类捕获的异常都会作为 Exception 类型处理。
底层原理:当抛出一个未指定类型的异常时,默认会创建一个 Exception 对象。这个对象包含错误消息、错误码、文件名和行号等信息。
RuntimeException

使用场景:RuntimeException 用于表示运行时发生的非预期错误。这些错误通常是在正常操作过程中发生的,而不是由于编程错误。
底层原理:当某个函数或方法在执行过程中遇到不可预见的问题(如资源不足)时,可以抛出 RuntimeException。
LogicException

使用场景:LogicException 用于表示逻辑上的错误,通常是由于编程错误导致的。
底层原理:当代码逻辑出现问题,例如参数验证失败或违反了某些前提条件时,可以抛出 LogicException。
InvalidArgumentException

使用场景:InvalidArgumentException 继承自 LogicException,用于表示传递给函数或方法的参数无效。
底层原理:当函数或方法接收到不符合预期的参数时,可以抛出 InvalidArgumentException。
OutOfRangeException

使用场景:OutOfRangeException 也继承自 LogicException,用于表示访问数组或集合时索引超出范围。
底层原理:当尝试访问不存在的数组元素或集合成员时,可以抛出 OutOfRangeException。
OutOfBoundsException

使用场景:OutOfBoundsException 与 OutOfRangeException 类似,但更通用,适用于任何超出边界的访问。
底层原理:当尝试访问超出合法范围的数据结构时,可以抛出 OutOfBoundsException。
DomainException

使用场景:DomainException 用于表示值不在有效范围内的情况。
底层原理:当某个值不符合业务规则或数据模型的要求时,可以抛出 DomainException。
LengthException

使用场景:LengthException 用于表示长度相关的问题,例如字符串或数组长度不满足要求。
底层原理:当检测到长度不符合预期时,可以抛出 LengthException。
BadFunctionCallException

使用场景:BadFunctionCallException 用于表示调用了不正确的函数或方法。
底层原理:当调用了一个不存在的函数或方法,或者以错误的方式调用时,可以抛出 BadFunctionCallException。
BadMethodCallException

使用场景:BadMethodCallException 用于表示调用了不正确的方法。
底层原理:当调用了一个不存在的方法,或者以错误的方式调用时,可以抛出 BadMethodCallException。
UnexpectedValueException

使用场景:UnexpectedValueException 用于表示收到了一个意外的值。
底层原理:当接收到的值不符合预期格式或类型时,可以抛出 UnexpectedValueException。

toString

将一个对象作为字符串使用时(echo < 一个对象>),php 会自动调用该对象的 toString () 方法来获取字符串表示。注意,__toString () 方法在对象被隐式转换为字符串时(echo < 一个对象 >)才会触发,如果直接调用该方法,不会有任何效果 php 中,自带 __toString() 方法的内置类有:DataTime、Exception、SimpleXMLElement

filesystemiterator

<?php
$dir = new FilesystemIterator(__DIR__);

foreach ($dir as $file) {
  echo $file->getFilename() . "\n";
}
?>
//遍历文件类(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DirectoryIterato

与上面的类似

getcwd()

返回当前的目录

<?php
echo "当前目录是: " . getcwd();
?>//当前目录是: D:\php代码

is_file

检查是不是文件

<?php
$path = "flag.txt";

if (is_file($path)) {
  echo "$path 是一个文件";
} else {
  echo "$path 不是文件或不存在";
}
?>

trim

函数移除字符串两侧的空白字符或其他预定义字符。一般是用来去除字符串首尾处的空白字符(或者其他字符),一般在用在服务端对接收的用户数据进行处理,以免把用户误输入的空格存储到数据库,下次对比数据时候出错
关键就在于如何绕过这个 trim ()
trim 函数会过滤空格以及 \n\r\t\v\0,但不会过滤 \f

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇