0

Windows XP の仮想サーバー「Wamp」で動作する PHP システムを所有しています。SQL インジェクション手法を使用してシステムの脆弱性を検出しようとしています。

「 ' OR 1=1 」などの基本的な注入方法を試してみたところ、いくつかの問題が見つかりました。ただし、次の問題で立ち往生しています。

システムに次のコード行があります。

$sql2="SELECT * FROM $table1 WHERE question_id='$id'";

このコード行の後、クエリを実行し、結果を次のように表示します。

$result2=mysql_query($sql2);

while($rows=mysql_fetch_array($result2)){
?>
<table width="400" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td><table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td bgcolor="#F8F7F1"><strong>ID</strong></td>
<td bgcolor="#F8F7F1">:</td>
<td bgcolor="#F8F7F1"><?php echo $rows['a_id']; ?></td>
</tr>
<tr>
.......
.......

変数「$id」の値は、前のページから _GET[] パラメータとして送信されることに注意してください。

私の問題は、パラメーター id=2 を注入しようとしていることです。(2は一例です)前のページから送られてきます。次に例を示します。

http://localhost/PHPforum/view_topic.php?id=2

table1 の代わりに別のテーブル (table2) のデータを表示するために、変数「$id」の値を挿入する方法を探しています。両方のテーブルを表示しても問題ありませんが、その注入によって table2 データを表示する必要があります。

どうすればそれを行うことができますか?

繰り返しますが、私はどのシステムも攻撃しようとはしていません。それは私が所有するシステムであり、その脆弱性を検出しようとしています。

4

4 に答える 4

2

SQL インジェクションの脆弱性の単なる概念実証から、まずインジェクションが発生するコンテキストを特定します。ほとんどの場合、インジェクションはWHERE句内にありますが、他の可能性のある位置もあります。

次に、選択されている列の数を特定しようとします。これは MySQL であるためORDER BY x、結果を並べ替える列の番号を使用して指定できます。したがって2' ORDER BY 1 --2' ORDER BY 2 --失敗するまで、、、から始めます。

UNION SELECT次に、元の結果セットを、次のように挿入した別の結果セットと結合できます。

' UNION SELECT 1, 2, 3, …, n --

これは単純なテストであり、挿入された結果セットのみが表示されます。数値は、どの値がどこに反映されているかのヒントを提供します。ここから、他のテーブル、ビュー、または他のデータ ソースから他の値を選択できます。pentestmonkey のMySQL SQL インジェクション チート シートは、どの情報が価値があるかについての良いヒントです。

于 2012-10-17T18:12:57.150 に答える
1

通常の方法は、UNION を使用して 2 つの異なるクエリの結果を結合することです。クエリが通過できるように、正しい数の列と文字セットを取得するために、少し遊んでみる必要があるかもしれません。

Web 上には、攻撃ベクトルの参考として使用できる SQL インジェクションの優れたチート シートがいくつかあります。

クエリを自分で作成 (およびエスケープ) する代わりに、パラメーター化されたクエリ (準備されたステートメントなど) をデータベースのクエリに使用できるライブラリの使用を検討する必要があります。PDO と mysqli はどちらも PHP で使用でき、準備済みステートメントを使用できます。

于 2012-10-17T14:13:01.787 に答える