블랙박스 문제 중 SQLi 문제들을 풀때 막막한 부분들이 있었습니다.

이번 기회에 그런 문제들을 풀 때를 대비하여 여러가지 사고흐름들을 정리해보고자 합니다.

 

1. SQLi 존재 여부 확인

url에 get으로 페이지 인덱스 부분에 값이 들어가고, 혹은 회원가입이나 로그인 창에서 id, pw를 입력하는 칸에 저희가 원하는 값을 넣을 수 있습니다. 

이런 상황에서 SQLi가 작동하는지, 작동하면 어느 부분에서 어떤 쿼리로써 코드가 작성되어있는지를 확인해야합니다.

입력포인트에 SQL 에러를 유도하며 값을 넣어봅니다.

  • ' → SQL 쿼리 닫기
  • " → 같은 맥락
  • \ → 이스케이프 처리 확인
  • ' or 1=1 → 늘 보던 참 거짓 비교
  • ' or 1=2 → 거짓을 유도하여 빈 페이지나 에러 등 다른 응답 확인
  • ' and sleep(3) → 시간 기반 SQLi 확인

2. 입력값에 대한 추론

코드를 보여주지 않는 상태에서는 쿼리의 구조를 모릅니다.

때문에 쿼리 구조를 유추해가며 쿼리를 무력화시켜야합니다.

주로 입력넣은 값의 뒤에오는 원래 쿼리를 무력화하는것을 목표로합니다.

  • 1 또는 1' → 따옴표를 하나 더 넣음으로써 문법에러를 유도, 그걸 통해서 SQLi 가능성을 추론합니다.
  • 1) -- → 괄호를 감쌌을 때 에러가 나지 않으면 괄호를 이용한 구조
  • --, # 등 → 주석 처리가 되는지 시도

3. UNION 사용 가능 여부

유니온문이 가능할려면 조건이 있습니다.

  1. 쿼리가 select 문이어야 함.
  2. 결과가 화면에 출력되어야 함.(아닐시 블라인드로)
  3. union 키워드가 필터링되지 않아야 함.

특히 정상 요청을 보냈을 때 쿼리 결과가 페이지에 보이는것이 중요합니다.

유니온문을 넣었을 때 blocked나 forbidden 같은 반응이면 우회가 필요하다는거고, SQL 에러면 파싱은 되었다는것 이기에 유니온문이 가능하다는 판단을 할 수 있습니다.

4. 컬럼 수 맞추기

유니온 문은 select문의 컬럼 수가 같아야만 합니다. 

때문에 컬럼 수를 맞춰가면서 알맞은 컬럼 수를 찾아야합니다.

 

1. order by 절 사용

  • 1 ORDER BY 1 -- → 정상
  • 1 ORDER BY 2 -- → 정상
  • 1 ORDER BY 3 -- → 에러

이런 상황이라면 컬럼 수가 3일 때 에러가 났으므로 쿼리에 컬럼이 2라는것을 알 수 있습니다.

 

2. union select 문의 컬럼수 늘려보기

  • 1 UNION SELECT 1 -- → 에러
  • 1 UNION SELECT 1, 2 -- → 정상

1, 2 같은 값 대신 NULL값을 넣어도됩니다.

보통 NULL을 넣을 때 타입 충돌을 피할 수 있기에 NULL이 좀 더 편하긴합니다.

order by 와 다르게 에러가 아닌 정상 메세지로 컬럼 수를 확인 합니다.

5. 컬럼 출력 위치 파악

컬럼 수를 알았으면 어떤 컬럼이 어느 위치에 출려되는지 확인해야합니다.

  • -1 UNION SELCET 1,2 -- 

일부러 존재하지 않는 값 (예시에선 -1)을 넣어 1과 2가 출력되게 한 후, 어느 부분에 1과 2가 각각 출력되는지 확인할 수 있습니다.

존재하는 값을 넣으면 만약 출력부분이 하나의 데이터만 출력한다면, 1과 2가 아닌 기존의 존재하던 값이 출력되어 출력포인트 체크가 힘들게 됩니다.

6. 원하는 정보 추출

출력 위치를 알았다면 그 부분에 원하는 쿼리값을 넣어 데이터를 추출합니다.

DB 버전을 원한다면 version()을, DB 명을 원하면 database()를, 특정 컬럼의 값을 원하면 그 컬럼명을 넣어 정보를 얻습니다.

 

 

 

'보안 > 이론 정리' 카테고리의 다른 글

웹 해킹 - default-src와 네비게이션  (0) 2026.06.07
API - GraphQL  (0) 2026.03.05
웹 해킹 - PHP output buffer overflow  (0) 2025.12.04
웹 해킹 - XSS Filter Bypass  (0) 2025.10.15
스프링부트 - URL 매핑과 컨트롤러  (0) 2025.10.03

+ Recent posts