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.
In a SQLi you usually will want to somehow execute a new query to extract information from other tables. MS Access always requires that in subqueries or extra queries a FROM
is indicated.
So, if you want to execute a UNION SELECT
or UNION ALL SELECT
or a SELECT
between parenthesis in a condition, you always need to indicate a FROM
with a valid table name.
Therefore, you need to know a valid table name.
이것은 테이블의 이름을 알 필요 없이 현재 테이블의 값을 추출할 수 있게 해줍니다.
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 에 또 다른 목록이 있습니다.
현재 열 이름을 무차별 대입하여 찾을 수 있습니다. chaining equals trick을 사용하여:
또는 group by를 사용하여:
또는 다음과 같이 다른 테이블의 열 이름을 무차별 대입 공격할 수 있습니다:
우리는 이미 chaining equals technique 을 사용하여 현재 및 다른 테이블에서 데이터를 덤프하는 방법에 대해 논의했습니다. 하지만 다른 방법도 있습니다:
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)