본문 바로가기
개념 노트장

[SQL] information_schema가 필터링 됐을 때 Union SQL Injection

by jwcs 2024. 3. 29.
728x90

https://www.bugbountyclub.com/pentestgym/view/54

 

UNION 기반 SQL 인젝션 | Pentest Gym | 버그바운티클럽

UNION 기반 SQL Injection이란?Union 기반 SQL Injection은 웹 애플리케이션이 백엔드 데이터베이스로 질의한 SQL 쿼리의 결과가 HTTP 응답에 표시될

www.bugbountyclub.com

일반적인 Union SQL Injection을 위 글을 참고하면 쉽게 풀 수 있었다. 하지만 information_schema가 필터링 되었을 땐 어떻게 우회해야 할까?

 

https://blog.redforce.io/sqli-extracting-data-without-knowing-columns-names/

 

[SQLi] Extracting data without knowing columns names

Extracting data without knowing columns names from MYSQL < 5 or in case of WAF blacklisting sending information_schema in the request

blog.redforce.io

위 글이 큰 도움이 됐다.

 

union 사용법 - 1

위와 같은 union 문이 있다면, 어떻게 출력이 될까?

union 사용법 - 2

앞 쪽 select 문의 1,2,3이 칼럼명이 되고 1,2,3과 4,5,6의 값이 레코드로 들어간다.

 

그럼 이 값이 테이블로 간다고 생각해보자.

union 사용법 - 3

`from`절 뒤에 나오는 서브 쿼리에는 alias 값을 붙여줘야 한다. 잊지 말자

이 쿼리의 값도 위와 같다.

union 사용법 - 4

UNION SQL Injection을 한다고 하면, 특정 열의 특정 행 값을 출력해야할 것이다. 그럼 우리는 2열 1행의 `5`를 출력해보도록 해보겠다.

 

칼럼 지정

우리는 2열을 지정해야 한다. 그 방법에 어떤 것들이 있을까?

 

백틱(`) 사용

백틱은 식별자를 나타낼 때 사용된다. 즉, 칼럼명을 지정해서 출력할 수 있다. 2번째 열의 칼럼명이 2이므로 `2`를 통해 2번째 열만 출력할 수 있다.

칼럼 지정 - 1

 

Alias 사용

별명(Alias)를 사용해도 쉽게 구할 수 있다. mysql에서 Alias 사용법은 `as`를 붙이면 된다.

칼럼 지정 - 2

 

행 지정

행 지정 방법에 대해 알아보자.

LIMIT 사용

`LIMIT` 구문은 출력되는 행의 수를 제한할 수 있다. 

limit 사용 예시 - 1

`LIMIT 1,1`은 1번째 인덱스에서 1개의 값을 출력한다는 의미다. 만약 `LIMIT 0,1`이라면 0번째 인덱스에서 1개의 값을출력한다는 의미다.

limit 사용 예시 - 2

limit의 위치를 위와 같이 바꿔도 정상적으로 출력된다.

 

예시

간단한 테이블과 함께 예시를 살펴보자.

예시 테이블

위와 같은 테이블이 있을 때, 2번째 행의 password 칼럼을 구해보겠다. 즉, `cs`를 구해보겠다.

sql 쿼리문 예시

만약 서버에서 위와 같이 SQL Injection에 취약한 코드를 가지고 있다는 가정하에 진행하겠다.

 

칼럼 지정

 

칼럼 지정 예시

위와 같이 칼럼 수를 맞춘 후, 백틱(`)으로 특정 칼럼을 지정해 출력시켜주고 있다.

 

행 지정

행 지정 예시

앞서 살펴 본 바와 같이 limit을 통해 특정 행을 출력하고 있다. 첫 행은 `union select 1,2`에 해당하는 부분이고, 두 번째 행은 우리가 목표로 하는 값이 아니기 때문에 건너뛰었다. 따라서 3번째 행의 값을 출력시키기 위해 `limit 2,1`을 써주었다.

728x90
반응형