- web109
- web110
- web111
- web112
- web113
- web114
- web115
- web123
- web125
- web126
解答:正则匹配要求v1和v2要包含字母。题目中eval里的语句,和之前web101有点相似。 初始化$v1
,v1是个类,$v2()
是参数。
这道题用到了魔术方法__toString()
,不少php的内置类里都包含有这个方法,如Reflectionclass
、Exception
、Error
。
不知道哪些类有的话,可以用php手册搜一下。
__toString()
:当一个对象被当作字符串对待的时候,会触发这个魔术方法,格式化输出这个对象所包含的数据。
PHP5.2.0之前,__toString() 方法只在使用 echo 或 print 时才生效。PHP5.2.0之后,可以在任何字符串环境生效。
所以echo使得$v1
类触发__toString()
,传递的参数v2会被输出。
payload: ?v1=CachingIterator&v2=system(ls)
?v1=Exception&v2=system('cat fl36dg.txt')
最后,再对v2后面的括号进行解释,如v2=system(ls),
$v2()
会把$v2
返回的值会作为函数名去调用,但是调用失败了。
只要变量后面紧跟着(),那么对这个变量进行函数调用。
如可以让返回值是phpinfo,就可以调用phpinfo()。
解答:不能包含数字和上面一系列的符号,下划线和括号都不行,只能输入字母。v1是类名,v2是函数名,同时该函数的返回值是string,可以触发__toString()。
先用?v1=exception&v2=phpinfo
查看一下有没有限制什么函数,以及扩展都有什么。
接下来就是找返回值是字符串的无参数函数。 FilesystemIterator ?v1=FilesystemIterator&v2=getcwd
返回第一个文件,正好是flag的文件。 flag文件就在当前目录下,所以直接访问即可获取flag。
知识点: DirectoryInterator:遍历目录的类 FilesystemIterator:遍历文件的类
解答:v1和v2只能输入字母,同时1要包含字符串ctfshow。
看一下getFlag,&
属于地址传参,意思就是在函数内,如果对v1和v2变量进行修改,就是真实的被修改了。因此题目说的是变量覆盖。
eval("$$v1 = &$$v2;");
意思是:以v1变量的值为新的变量名,和以v2变量的值为新的变量名,这两个新的变量指向同一个地址,改变一个的值另外一个也跟着改变。如下示例:
$n1=a;$n2=b;
$$n1=$a;$$n2=$b; ==> $a=&$b;#变量b将地址传给了变量a,即两个变量指向同一个地址
v1用来满足条件判断,v2用来输出想要的信息,v2也是只能输入字母。include(flag.php),$flag是在外部声明,不能直接使用。 可以查看一下全局变量,发现flag。 payload:?v1=ctfshow&v2=GLOBALS
解答:限制了部分伪协议,但是php://filter
还可以用,可以不用过滤器直接读取。 同时if判断要求file不能为文件,可以用包装器伪协议来绕过。 伪协议不影响file_get_contents,和highlight_file。
payload1:?file=php://filter/resource=flag.php
payload2:也可以用web117的convert.iconv过滤器读取。
?file=php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php
读完需要转一下。
结尾。 GET:
?$fl0g=flag_give_me;
POST:CTF_SHOW=&CTF[SHOW.COM=&fun=eval($a[0])
![]()