MS Access SQL Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
문자열 연결은 & (%26)
및 + (%2b)
문자를 사용하여 가능합니다.
MS Access에는 주석이 없지만, NULL 문자로 쿼리의 마지막을 제거하는 것이 가능하다고 합니다:
쿼리의 구문을 수정할 수 있습니다:
지원되지 않습니다.
LIMIT
연산자는 구현되지 않았습니다. 그러나 TOP
연산자를 사용하여 SELECT 쿼리 결과를 처음 N 테이블 행으로 제한하는 것이 가능합니다. TOP
은 반환할 행의 수를 나타내는 정수를 인수로 받습니다.
Just like TOP you can use LAST
which will get the rows from the end.
SQLi에서는 일반적으로 다른 테이블에서 정보를 추출하기 위해 새로운 쿼리를 실행하고 싶어합니다. MS Access는 항상 서브쿼리나 추가 쿼리에서 FROM
을 명시해야 합니다.
따라서, UNION SELECT
또는 UNION ALL SELECT
또는 조건에서 괄호로 묶인 SELECT
를 실행하려면 항상 유효한 테이블 이름과 함께 FROM
을 명시해야 합니다.
따라서, 유효한 테이블 이름을 알아야 합니다.
이것은 테이블의 이름을 알 필요 없이 현재 테이블의 값을 추출할 수 있게 해줍니다.
MS Access는 **'1'=2='3'='asd'=false
**와 같은 이상한 구문을 허용합니다. 일반적으로 SQL 인젝션은 WHERE
절 안에 있기 때문에 이를 악용할 수 있습니다.
MS Access 데이터베이스에 SQLi가 있고, 하나의 열 이름이 username이라는 것을 알고 (또는 추측하고) 있으며, 그것이 추출하고자 하는 필드라고 가정해 보십시오. 체인 등호 기법이 사용될 때 웹 앱의 다양한 응답을 확인하고, Mid
함수를 사용하여 부분 문자열을 얻는 부울 인젝션으로 콘텐츠를 잠재적으로 추출할 수 있습니다.
테이블의 이름과 열을 알고 있다면, Mid
, LAST
및 TOP
의 조합을 사용하여 부울 SQLi를 통해 모든 정보를 유출할 수 있습니다:
Feel free to check this in the online playground.
chaining equals 기법을 사용하여 테이블 이름을 강제 추측할 수 있습니다:
전통적인 방법을 사용할 수도 있습니다:
Feel free to check this in the online playground.
http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html 에 또 다른 목록이 있습니다.
현재 열 이름을 무차별 대입하여 찾을 수 있습니다.
또는 group by를 사용하여:
또는 다음과 같이 다른 테이블의 열 이름을 무차별 대입 공격할 수 있습니다:
우리는 이미 체이닝 이퀄스 기법 을 사용하여 현재 및 다른 테이블에서 데이터를 덤프하는 방법에 대해 논의했습니다. 하지만 다른 방법도 있습니다:
In a nutshell, 쿼리는 성공 시 "200 OK"를 트리거하거나 그렇지 않으면 "500 Internal Error"를 트리거하기 위해 "if-then" 문을 사용합니다. TOP 10 연산자를 이용하여 처음 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(*)
항목 수를 계산합니다
From here you can see a query to get tables names:
그러나 MSysObjects
테이블을 읽을 수 있는 접근 권한이 없는 경우 SQL 인젝션을 발견하는 것이 매우 일반적이라는 점에 유의하십시오.
웹 루트 절대 경로에 대한 지식은 추가 공격을 용이하게 할 수 있습니다. 애플리케이션 오류가 완전히 숨겨지지 않은 경우, 존재하지 않는 데이터베이스에서 데이터를 선택하려고 시도함으로써 디렉토리 경로를 발견할 수 있습니다.
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)**은 다음 쿼리로 추론할 수 있습니다:
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
여기서 name[i]는 .mdb 파일 이름이고 realTable은 데이터베이스 내의 존재하는 테이블입니다. MS Access는 항상 오류 메시지를 트리거하지만, 유효하지 않은 파일 이름과 유효한 .mdb 파일 이름을 구별하는 것이 가능합니다.
Access PassView는 Microsoft Access 95/97/2000/XP 또는 Jet Database Engine 3.0/4.0의 주요 데이터베이스 비밀번호를 복구하는 데 사용할 수 있는 무료 유틸리티입니다.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)