それで、私はしばらくの間Sqlmapを使用して会社のセキュリティをテストしています(IT担当者がいるには小さすぎて、今のところ最も近いので)、すでにリモートからデータベースにアクセスしてダンプしていますこれを使用するデータベース
パラメータ:id(GET)タイプ:ブールベースのブラインドタイトル:ORブールベースのブラインド-WHEREまたはHAVING句(一般的なコメント)ペイロード:id = -XXXX 'OR YYYY = YYYY---&gid = XXXXX
ここで、usersテーブルにいくつかの情報を注入したいと思います。テーブル名、列などを知っています。また、どの情報を入力したいかはわかっていますが、まだ知らない「オタク」言語に翻訳する必要があります。私はサーバーで--os-Shellも試しましたが、失敗しました(チェックするリストされた名前のいずれも使用していません)
もちろん、それを行った後はソフトウェアをアップグレードするので、もう一度すべてテストする必要があります。
私を助けることができる人をありがとう。
あなたはこれをテストして、いじり回すことを許可され、許可されていますか?それが悪くなった場合に備えて、あなた自身のために証拠を書く必要があるかもしれません。一部の本番サーバーでこれをライブで行わないようにしてください。代わりにテストサーバーを使用してください。
SQLインジェクションを示す古典的な方法:
_$id = isset($_GET['id']) ? $id : -1; // Set default value if id isn't set
$stmt = $db->query('SELECT * FROM articles WHERE id=' . $id);
$results = $stmt->fetchAll();
fancy_display($results);
_
すべての行を取得するには、_0 OR 1=1
_を使用します。最終的なクエリは、_SELECT * FROM articles WHERE id=0 OR 1=1
_のようになります。 _1=1
_は常にtrueなので、記事からすべての行を返します。
何らかの方法でサーバーにストレスをかけたくない限り、これは通常私たちが望むことではありません。したがって、他のテーブルに到達するためにUNION
を使用する傾向があります:_1 UNION SELECT ALL 1, 2, username, hash from users
_。
SQLインジェクションとは、本来のSQLクエリを意図しない方法で変更することです。クエリが成功するには、有効である必要があります。前の例に続いて、1つのクエリでINSERTとSELECTを混在させることはできません。
_SELECT * FROM articles WHERE id=1 ALSO INSERT INTO articles (title, content) VALUES ("foo", "bar")
_
ALSOはサポートされていないため、架空のキーワードにすぎないことに注意してください。別の試みは、_;
_でクエリを分離することにより、クエリを分離することです:
_SELECT * FROM articles WHERE id=1; INSERT INTO articles (title, content) VALUES ("foo", "bar")
_
ほとんどの場合、これは機能しません。 2番目のクエリは無視されます。これは、基になるコードが「スタックされたクエリ」とも呼ばれる「複数のクエリ」を使用して指定する必要があるためです。 PHPたとえば、 _mysqli::multi_query
_ の代わりに _mysqli::query
_ を使用する必要があります。ほとんどのアプリケーションは後者を使用します 私の以前の回答 を読みたいかもしれません。
したがって、もう1つの正当な方法は、INSERT
を使用する脆弱なコードを探して見つけることです。
_// Registration page
// Got credentials via $_POST
$username = 'foo';
$password = 'bar'; // not hashed, so bad
$db->query('INSERT INTO users (username, password, admin) VALUES ("' . $username . '", "' . $password . '", 0)');
_
最終的なクエリは次のようになります。
_INSERT INTO users (username, password, admin) VALUES ("foo", "bar", 0)
_
別のパスワードbar", 0), ("haxors_admin", "easy", 1)--
を使用してフローを変更します。最終的なクエリは次のようになります。
_INSERT INTO users (username, password, admin) VALUES ("foo", "bar", 0), ("haxors_admin", "easy", 1)--", 0)
_
_--
_の後はすべてコメント化されるため、事実上無視されます。管理ユーザーを追加しました。このシナリオは、攻撃を示すのが非常に簡単であることに注意してください。
sqlmap は、SQLの脆弱性を見つけて悪用する自動化ツールです。データの引き出し以外に、_--os-Shell
_や_--os-cmd
_などのOSテイクオーバーのオプションもあります。
内部では、スタックされたクエリがサポートされているかどうかをチェックします。ある場合は、_sys_exec
_または_sys_eval
_を使用してこれらのコマンドを実行します。そうでない場合、Webバックドア(たとえば、phpバックドア)を使用してこれらのコマンドを実行しようとします。バックドアは、_INTO OUTFILE
_を挿入することによって作成されます。クエリをだまして、書き込み可能なフォルダーに書き込みます。 MySQLにそのフォルダへの書き込み権限がない場合は、作成されません。したがって、攻撃は失敗します。この攻撃ベクトルは sqlmap usage wiki で詳しく説明されています。これについての詳細は オペレーティングシステムのフルコントロールへの高度なSQLインジェクション(ホワイトペーパー) です。
あなたの場合、スタックされたクエリはサポートされておらず、MySQLには十分な権限がありません。これは、攻撃が失敗した理由を説明しています。学習目的は別として、私はこれ以上気にせず、脆弱性の修正を開始することをお勧めします。