web-dev-qa-db-ja.com

'OR 1 = 1 / * SQLインジェクションログインバイパスの質問

最近、私は' or 1=1/*と混同しているこの特定のチートシートを含むSQLインジェクションチートシートに遭遇しました。

以下のサーバーサイドコードでテストしていると仮定します。

SELECT * FROM users WHERE login='$login' AND password='$password';

まあ、そのチートシートでそれを迂回することはできないようです。なぜそれがチートシートとして含まれているのですか?その特定のチートシートはどのように使用されますか?

私が推測して私のロジックを使用しているのは、このチートシートの使用の可能性は、プログラマが誤って終了コメントタグ* /を以下のサーバー側コードに示すようにSQLクエリの後ろに配置した場合のみであるということです。 。

SELECT * FROM users WHERE login='' or 1=1/*' AND password='$password' */;

使用法を自由に説明し、このチートシートの使用法についての私の理解を確認してください。

編集:誤解については、プログラマが誤ってそれを入れた場合に言及されているように、コードの最後にある* /の意味を以下に示します。

SELECT * FROM users WHERE login='$login' AND password='$password' */;
2
Cash-

ここではいくつかの考慮事項があります。まず、これがどのように機能するかを説明します。

SQLインジェクションは非常に古い種類のハックであり、最新のSQL実装に影響を与えるべきではありません。準備されたステートメントを使用できるようになる前は、SQLクエリは通常、連結された文字列を使用して行われていました。これは、入力が次のように実行されたSQLの一部になることを意味します。

$login = "John";
$password = "' OR 1=1 --";
$myIP = '555.555.555.555';
$sql = "SELECT * FROM users WHERE login='" . $login . "' AND password='" . $password . "' AND userip = '" . $myIP . "'";
echo $sql;

出力:SELECT * FROM users WHERE login = 'John' AND password = '' OR 1 = 1-AND userip = '555.555.555.555'

その最初の 'は、構文を有効に保つために文字列の引用符を閉じます。次に、1は常に1と等しいため、常に真であるselectステートメントを作成します。つまり、ユーザー "John"を選択して、パスワードを知らなくても彼としてログインできるようにします。次に-は、その後に続くすべてのことを述べるSQL構文です。これは、IP検証やそのような性質など、ログインの成功を妨げる可能性があるその他の条件を排除するために使用されます。

ここで2番目のものは/ *です。これは実際には1 = 1のインジェクションを壊します。これは、それが無効なトランザクションSQL構文だからです。とはいえ、/ *は実行レベルの攻撃に使用できます。多くの開発者は準備されたステートメントに過度の信頼を置きます。 SQLトランザクションで入力を実行しないからといって、後で実行できるものを含めることができないわけではありません。

たとえば、Webサイトに入力ボックスがあり、そのサイトがJS-XSS攻撃に対して脆弱かどうかをテストする場合は、「<script>/*」と入力します。これは、プログラムがデータベースからこれを取得して実行するときに、ページの残りの部分を示すJavaScriptを実行し、その情報の出力をロードしようとするとプログラムを強制終了することを意味します。

簡単に言うと、あなたのソースは2種類の異なる攻撃の構文を混同していますが、適切な脆弱性を考えると、どちらも正当な懸念事項です。

2
Nosajimiki