0%00 php中的系统变量,全局可用

1
2
3
4
5
6
7
8
9
$GLOBALS // 引用全局作用域中可用的全部变量
$_POST // 获取 post 数据,是一个字典
$_GET // 获取 get 数据,是一个字典
$_COOKIE // 获取 cookie
$_SESSION // 获取 session
$_FILES // 获取上传的文件
$_REQUEST // 获取 $_GET,$_POST,$_COOKIE 中的数据
$_ENV // 环境变量
$_SERVER // 服务器和执行环境信息

0%01 php中双引号与单引号的区别

双引号会输出变量,即使用服务器解析在双引号中的字符。

单引号将字符直接输出,不使用服务器解析,即使是\n也不解析。

php对单引号的解析速率比双引号快

0%02 php中scandir()函数可以看到目录下的所有文件名

scandir(‘/‘).;

0%03 php 变量覆盖

第一种:$$造成的变量覆盖

1
2
3
4
5
6
<?php
foreach ($_GET as $key => $value) {
${$key} = $value;
}
echo $a;
?>

返回值为输入的变量的值。

第二种extract() 函数从数组中将变量导入到当前的符号表

extract()函数默认是覆盖已有变量

第三种parse_str()函数把查询字符串解析到变量中。

第四种import_request_variables — 将 GET/POST/Cookie 变量导入到全局作用域中

能从get,post,cookie三处传参。

unset($a)可以销毁一些变量。

0%04输出文件内容

1
2
3
4
show_source('flag.php');
highlight_file('flag.php');
var_dump(file('flag.php'));
print_r(file('flag.php'));

对于php文件,输出文件内容中,show_source(),和hightlight_file()均是输出源php格式。而var_dump()是以数组的形式输出数据,数组[0]代表第一行,以此类推。print_r()也以数组的形式输出。但是对于html,var_dump输出的是html代码,而print_r输出的html会被前端浏览器执行。(这四个函数都可以通过../,/,查看目录下的文件)

0%05文件读取

1
2
3
4
<?php
$a=file_get_contents('http://www.baidu.com');
print_r($a);
?>

得到的将会是一个百度的界面。

0%06$_get和$_post

当向$_get和$_post传入数据name[]=a时,会自动将name转化为数组型且0=>a,正常传入的数据是string型的。

0%07strcmp 和 strcasecmp

在这两个函数中数组和字符串比较均会返回NULL。

0%08 parse_url()函数解析错误

1
2
3
4
<?php
$a=$_GET['url'];
var_dump(parse_url($a));
?>

当输入url=baidu.com/about:80时会返回数组型host=baidu.com,port=80,path=/about:80/

0%09php弱类型比较

目前还存在的弱类型(我的php版本7.2.11)有0=='addafs'返回true'0.9999'==1返回true

0%10字符型和数值型的转换

$var 是一个字符串的时候,访问 $var["any string"] 跟访问 $var[intval("any string")] 效果是一样的。当输入两个不一样的any string时,即$var["aaa"]==$var["bbb"]=$var[0]

当进行switch()时,会将switch中的字符型数据转换为数值型,然后再到case中进行比较。

0%11preg_match()正则表达式

preg_match()在第一次匹配后将会停止搜索,因此如果正则表达式没有用^,$就有可能存在绕过,而且它的默认匹配方式为贪婪匹配,匹配尽可能多的字符。如果此函数开启了/m则也可能存在绕过,例如/^[a-zA-Z0-9-s_]+.rpt$/m如果要绕过这个限制只需要用a.rpt%0axxxx就可以执行后面的xxxx了。

开启/m后,^表示行首,$表示行尾

关闭/m后,^表示字符串的开始,$表示字符串的结尾

修饰符说明:

1
2
3
4
5
6
7
i 在和正则匹配是不区分大小写 
m 将字符串视为多行。默认的正则开始“^”和结束“$”将目标字条串作为一单一的一“行”字符(甚至其中包括换行符也是如此)。如果在修饰符中加上“m”,那么开始和结束将会指点字符串的每一行的开头就是“^”结束就是“$”。
o 评估表达式只有一次
s 如果设定了这个修正符,那么,被匹配的字符串将视为一行来看,包括换行符,换行符将被视为普通字符串。
x 忽略空白,除非进行转义的不被忽略。
g 在全局范围内找到所有匹配
cg 即使全局匹配失败也允许搜索继续

php中的另一个正则表达式ereg()进行正则匹配时存在0%00绕过问题,但是在php7+中将ereg()函数给移除了