IT 성장기 (교육이수)/모의해킹 스터디 (2024.04-09)

[정보보안] Error based & Blind SQL Injection 실행 방법

eezy 2024. 7. 2. 13:23

모의해킹 스터디 7주차 강의 내용에 대한 정리입니다. (근 한 달간 현생 이슈라는 핑계로 블로그 작성이 뜸했으나 다시 마음을 잡아보도록 하죠! 한 번에 완벽하지 않더라도 꾸준히만 하자!... 제발)

 

Error based & Blind SQLi 실행 방법에 대해 알아 보자

 

목차

 

1. Error Based SQLi

2. 예제) Error Based

3. Blind SQLi

4. 예제) Blind

5. 입력하기

위의 목차를 클릭하면 해당 글로 자동 이동 합니다.

 

Error Based SQLi

SQL의 잘못된 문법이나 자료형 불일치 등에 의해 데이터베이스가 알려주는 데이터베이스 오류 메시지에 의존하여 수행되는 공격 기법이다. 따라서 웹 애플리케이션에서 데이터베이스 오류를 표시해 주는 곳에서만 사용할 수 있다는 것이 특징이다. 

공격자는 일부러 SQL 쿼리의 잘못된 문법을 사용해 오류를 일으키고, 오류를 표시해주는 곳에 원하는 데이터를 추출하는 방식으로 이루어 진다. 

 

문법 불일치로 인한 오류 발생 구문 삽입

 

select * from member where id = 'normaltic' and extractvalue('1', concat(0x3a, (select 'normaltic'))) and '1'='1'

 

extractvalue([xml 값], [xPath 표현식]) 으로 표현되어야 한다. 여기서는 두 개의 매개변수 모두

 

  • 첫 번째 매개변수의 문제: '1' 은 XML 형식의 문자열이 아니므로 올바르지 않다.
  • 두 번째 매개변수의 문제: concat(0x3a, (SELECT 'normaltic'))는 유효한 XPath 표현식이 아니다. concat 함수는 문자열 연결을 위한 것이지만, XPath 표현식으로 사용될 수 없다.
SELECT EXTRACTVALUE('<root>normaltic</root>', '/root');

 

 

xml 데이터가 /root 경로에 저장되어 있다 가정했을 때, 위와 같은 표현식으로 표현 되어야 올바르다. 이를 올바르게 사용하기 위해서는 사용하는 DB에 따라, XML 데이터를 어떻게 저장하고 있는지 확인해보아야 한다.

 

그렇다면 Error based SQLi 에서 Extractvalue 함수를 이용하는 이유에 대해 자세히 알아보았다. 

 

  • 이유 1 : extractvalue 함수는 XPath 표현식을 처리할 때, 작은 문법 오류도 쉽게 탐지하고 상세한 오류 메시지를 반환한다. 이를 통해 공격자는 데이터베이스 시스템에서 발생하는 오류 메시지를 활용하여 데이터베이스 구조, 테이블, 컬럼 이름 등을 유추할 수 있다.
  • 이유 2 : 에러 기반 SQL 인젝션에서는 주로 데이터베이스로부터 직접적으로 데이터를 추출하지 않고, 오류 메시지를 통해 간접적으로 정보를 얻는다. extractvalue 함수는 잘못된 XML 데이터나 XPath 표현식을 처리할 때 명확한 오류 메시지를 반환하기 때문에, 공격자가 이를 통해 데이터베이스의 정보를 추론하기가 상대적으로 쉽다.

이 외에 다른 방법으로 오류를 발생할 수 있는 방법에 대해 간단히 알아 보자. 

 

1. updatexml

updatexml 함수는 XML 문서에서 노드를 업데이트하려고 시도할 때 사용되며, 잘못된 XPath 표현식을 제공할 경우 오류를 반환할 수 있다.

SELECT updatexml(NULL,CONCAT('0x3a',(SELECT database())),NULL);

 

normaltic' and updatexml(NULL, concat(0x3a,(select 'normaltic')), NULL) and '1'='1

 

error 유발 화면

2. floor

floor 구문은 주로 GROUP BY 를 통해 그룹을 집계하는 곳에서 RAND 함수를 이용해 기준 값을 2개로 인식하여 오류를 발생시킬 수 있다. 

SELECT floor(rand(0)*2) FROM table;
 
이와 유사한 방식으로는 SORT 구문을 이용한 방법도 생각해 볼 수 있다. 이는 order by 절은 1개의 기준점을 가지고 정렬을 해야 하는데, 중복된 정렬값을 불러오며 문법 상 오류가 발생하는 것 이다. 물론 아래 페이지에서는 이 에러를 통해 데이터를 추출하기에는 부적합하겠지만, 이러한 방법으로도 오류를 발생시킬 수 있다. 
 

SELECT * FROM table WHERE SORT=(SELECT 1 UNION SELECT 2 WHERE 1=1) -- 

 
normaltic' ORDER BY (SELECT 1 UNION SELECT 2 WHERE 1=1) -- '
 
여러 행을 반환하는 오류

예제) Error based

Step-by-Step 간단 정리

 

1. SQL Injection 포인트 찾기

2. SQL 쿼리 유추 및 에러 출력 확인

3. 공격 format 만들기

4. DB 이름, Table 명, Column 명 확인 후 원하는 Data 출력

 

2024.06.03 - [Info Sec/CTF 문제풀이] - [모의해킹 CTF] Error Based SQLi3

 

[모의해킹 CTF] Error Based SQLi3

모의해킹 스터디 중 CTF 문제에 대한 풀이 과정을 서술하며, 문제에 도달하는 과정을 이해하기 위한 목적으로 작성.  Error Based SQLi3목차 1. SQL Injection Point 찾기 2. Data 추출 코드 3. Python 코드 문

yyz-code.tistory.com

 

 

Blind SQLi

해당 기법은 사용자의 입력이 SQL 쿼리로 해석되기는 하나 웹 애플리케이션이 HTTP 응답에 어떠한 데이터나 데이터베이스 오류 메시지를 전혀 표시하지 않을 때 사용할 수 있다. SQL 쿼리를 실행했을 때, 규칙적으로 나오는 참 / 거짓 값을 기반으로 데이터를 추출할 수 있다. SQL injection이 가능한 모든 곳에서 사용될 수 있다.

 

아래와 같은 공격 구문을 이용하여, 1 글자씩 데이터를 추출하는 것이 특징이다.

SELECT * FROM member WHERE id='normaltic’ and (ascii(substr((SQL 구문), 1, 1)) >0) and ‘1’=‘1'

 

SUBSTR("문자열", "시작위치", "길이") : 문자열을 자르는 함수이다. 이는 모든 데이터가 즉시 반환되지 않는 상황에서 정보를 점진적으로 추출할 수 있다. 

자른 문자열을 ASCII 코드 값으로 출력하고, 코드 값을 문자로 환산하여 데이터를 확인한다. 반환된 데이터가 문자열일 경우, 참/거짓을 연산할 수 없기 때문에 문자열을 숫자로 변환하여 ASCII(데이터)>(0~127) 와 같이 연산 값을 찾는다. 

 

 

예제) Blind

<sqli6> 링크

 

 

<참조 링크>

 

https://dystopia050119.tistory.com/185

 

Error 기반 SQL 인젝션

💡해당 내용은 pentestqym의 내용을 다시 한 번 정리한 내용이며, 모든 저작권은 해당 사이트에게 있습니다. 오류기반 SQLi에 대하여 배워봅시다. Error based SQLi 데이터베이스 오류 메시지를 활용하

dystopia050119.tistory.com

 

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

 

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

오류 기반 SQL Injection이란?오류 기반(Error based) SQL Injection은 주로 데이터베이스에 대한 정보를 획득하기 위해 사용됩니다. SQL의 잘못된 문법

www.bugbountyclub.com