web-dev-qa-db-ja.com

SQLインジェクションを試行するとサーバーが403を返す

友達のサイトに侵入しようとしています。さまざまなgetパラメータを入力すると表示されるエラーメッセージに基づくSQLインジェクション攻撃に対して明らかに脆弱です。

%27%20or%201=1%20である' or 1=1などのSQLコマンドを含む非常に単純な攻撃を試みるたびに、403エラーページが表示されます。また、unionselect--/**/などのSQLコマンドを使用しようとすると、403メッセージが表示されます。このサイトはMySQLデータベースを備えたphpサイトです。これは、彼が設定したある種のWAF(Webアプリケーションファイアウォール)ですか?もしそうなら、それを倒す方法について何かアドバイスはありますか?

%0b%271%0bor%20%271%27=%271などのパラメータを試行すると、次のエラーが返されます。

SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルで、 '1または' 1 '=' 1 '付近で使用する正しい構文と、1行目のテスト=' 0 'およびバージョン=' 1 ''を確認してください

2
Mohammad Ali

WebサイトからSQL構文エラーが返された場合は、SQLiの脆弱性が確実に見つかります。 WAFを扱っていません(違いを見分けるのが難しい場合があります)。また、便利なことに、彼はエラー印刷をオンにしています。これにより、何が起こっているのかを簡単に知ることができます。それも彼が修正すべき脆弱性です。

そうは言っても、SQLiに!ペイロードの構文を正しく理解するのは難しい場合があります。ただし、エラーメッセージは非常に役立ちます。この部分を見てみましょう。

_'1or '1'='1' and test = '0' and version = '1''_

MySQL自体が壊れていると言っている部分を一重引用符で囲んでいるため、外側の単一引用符を削除すると、MySQLが実際に実行しようとしていることがわかります。

_1or '1'='1' and test = '0' and version = '1'_

ペイロードとあまり一致しないため、少し混乱します(_'1 or 1=1_)。これはおそらく、彼がSQLiを軽減するために舞台裏で追加の翻訳を行っていることを意味します。残念ながら(彼にとって)彼のアドホックな実装は間違いなく完全ではありません(MySQLエラーを生成しているため)。ほとんどの場合、彼が実行している実際のクエリは次のとおりです。

_WHERE column='?' and test = '0' and version = '1'_

脆弱なパラメータの代わりに疑問符が付いています。これは通常、非常に簡単に悪用することができますが、彼はあなたのデータに奇妙な変換を行っているようです。その意味では、彼はWAFのようなものをしているかもしれないので、成功するPoCを構築するために、いじくり回さなければなりません。私はSLEEPベースの注射のような非常に異なる何かを試してみます:

1' and sleep(10)

単にペイロードの異なる「形式」を持つことによって、彼の「フィルター」を回避することができます。サーバーが応答を返すまでに最大10秒かかる場合は、ペイロードが成功していることがわかります。そこから、情報を抽出するためのさまざまな種類のペイロードの構築を試すことができます。

2
Conor Mancone