web-dev-qa-db-ja.com

Sqlmap、どうやって前進するのですか?

それで、私はしばらくの間Sqlmapを使用して会社のセキュリティをテストしています(IT担当者がいるには小さすぎて、今のところ最も近いので)、すでにリモートからデータベースにアクセスしてダンプしていますこれを使用するデータベース

パラメータ:id(GET)タイプ:ブールベースのブラインドタイトル:ORブールベースのブラインド-WHEREまたはHAVING句(一般的なコメント)ペイロード:id = -XXXX 'OR YYYY = YYYY---&gid = XXXXX

ここで、usersテーブルにいくつかの情報を注入したいと思います。テーブル名、列などを知っています。また、どの情報を入力したいかはわかっていますが、まだ知らない「オタク」言語に翻訳する必要があります。私はサーバーで--os-Shellも試しましたが、失敗しました(チェックするリストされた名前のいずれも使用していません)

もちろん、それを行った後はソフトウェアをアップグレードするので、もう一度すべてテストする必要があります。

私を助けることができる人をありがとう。

2
Lumi Kor

まず最初に

あなたはこれをテストして、いじり回すことを許可され、許可されていますか?それが悪くなった場合に備えて、あなた自身のために証拠を書く必要があるかもしれません。一部の本番サーバーでこれをライブで行わないようにしてください。代わりにテストサーバーを使用してください。

基本に戻る

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_。

SELECTの後にINSERTを挿入するのはどうですか?

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_ を使用する必要があります。ほとんどのアプリケーションは後者を使用します 私の以前の回答 を読みたいかもしれません。

INSERTステートメントの挿入

したがって、もう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が楽しみに加わる

sqlmap は、SQLの脆弱性を見つけて悪用する自動化ツールです。データの引き出し以外に、_--os-Shell_や_--os-cmd_などのOSテイクオーバーのオプションもあります。

内部では、スタックされたクエリがサポートされているかどうかをチェックします。ある場合は、_sys_exec_または_sys_eval_を使用してこれらのコマンドを実行します。そうでない場合、Webバックドア(たとえば、phpバックドア)を使用してこれらのコマンドを実行しようとします。バックドアは、_INTO OUTFILE_を挿入することによって作成されます。クエリをだまして、書き込み可能なフォルダーに書き込みます。 MySQLにそのフォルダへの書き込み権限がない場合は、作成されません。したがって、攻撃は失敗します。この攻撃ベクトルは sqlmap usage wiki で詳しく説明されています。これについての詳細は オペレーティングシステムのフルコントロールへの高度なSQLインジェクション(ホワイトペーパー) です。

結論

あなたの場合、スタックされたクエリはサポートされておらず、MySQLには十分な権限がありません。これは、攻撃が失敗した理由を説明しています。学習目的は別として、私はこれ以上気にせず、脆弱性の修正を開始することをお勧めします。

1
HamZa