[WMCTF2020]Make PHP Great Again 2.0
require_once
表达式和 require 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
由于 require_once 包含的软链接层数较多时 once 的 hash 匹配会直接失效造成重复包含。
require_once
表达式和 require 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
由于 require_once 包含的软链接层数较多时 once 的 hash 匹配会直接失效造成重复包含。
打开题目,后先查看源码有没有什么有用的东西,发现了login.php、register.php
以及login.js
1 | //login.js |
代码会把cookie中的username和password填进当前表单
注册登录,根据题目提示这应该不是sql注入题目
我们f12看到页面源码
我们测试一下,先输入 1’ or ‘1 此时我们的current IP就等于它,让后我们再随便换一个其他的东西,只要和刚才那个不一样就可以,比如111,那么我们的current IP就成了:111,而last IP就是1’ or ‘1,此时1’ or ‘1已经写入了数据库 .因为第一次和第二次传输的IP不一样,所以服务器并不会从数据库找last IP,它会把上次的IP(1’or ‘1)直接显示为last IP,让后存入数据库。那么我们再传一次111,因为和currnet IP相同,那么last IP就会从数据库里寻找,也就是会执行1’or‘1,结果为一。
我们查看源码
1 | <?php |
进行代码审计,我们发现A类的调用关系为__destruct->save()->getForStorage->cleanContents
然后再进行到save()中的$this->store->set($this->key, $contents, $this->expire);
1 | <?php |