0%00 php中的系统变量,全局可用
1 | $GLOBALS // 引用全局作用域中可用的全部变量 |
0%01 php中双引号与单引号的区别
双引号会输出变量,即使用服务器解析在双引号中的字符。
单引号将字符直接输出,不使用服务器解析,即使是\n也不解析。
php对单引号的解析速率比双引号快
0%02 php中scandir()函数可以看到目录下的所有文件名
scandir(‘/‘).;
0%03 php 变量覆盖
第一种:$$造成的变量覆盖
1 |
|
返回值为输入的变量的值。
第二种extract() 函数从数组中将变量导入到当前的符号表
extract()函数默认是覆盖已有变量
第三种parse_str()函数把查询字符串解析到变量中。
第四种import_request_variables — 将 GET/POST/Cookie 变量导入到全局作用域中
能从get,post,cookie三处传参。
unset($a)可以销毁一些变量。
0%04输出文件内容
1 | show_source('flag.php'); |
对于php文件,输出文件内容中,show_source()
,和hightlight_file()
均是输出源php格式。而var_dump()
是以数组的形式输出数据,数组[0]代表第一行,以此类推。print_r()
也以数组的形式输出。但是对于html,var_dump
输出的是html代码,而print_r
输出的html会被前端浏览器执行。(这四个函数都可以通过../
,/
,查看目录下的文件)
0%05文件读取
1 | <?php |
得到的将会是一个百度的界面。
0%06$_get和$_post
当向$_get和$_post传入数据name[]=a时,会自动将name转化为数组型且0=>a,正常传入的数据是string型的。
0%07strcmp 和 strcasecmp
在这两个函数中数组和字符串比较均会返回NULL。
0%08 parse_url()函数解析错误
1 |
|
当输入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 | i 在和正则匹配是不区分大小写 |
php中的另一个正则表达式ereg()进行正则匹配时存在0%00绕过问题,但是在php7+中将ereg()函数给移除了