블랙박스 문제 중 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 사용 가능 여부
유니온문이 가능할려면 조건이 있습니다.
- 쿼리가 select 문이어야 함.
- 결과가 화면에 출력되어야 함.(아닐시 블라인드로)
- 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 |