노말틱 모의해킹

[8주차 강의] Error SQL Injection, Blind SQL Injection

debugginglog 2025. 5. 28. 01:02

Part1. 6주차 리뷰

한번에 여러개 데이터가 안나오는 경우도 있다.
그럴 때는 특정 행만 출력하게 해야한다.
이럴 때는 limit[index],[count] 문법을 사용하면 된다.

Part2. 에러 문구를 통한 해킹기법

1. SQL 질의 결과가 화면에 출력된다 -> union sqli를 활용한다.(지난주에 배운 것)
2. Error가 출력된다. -> Error Based SQL Injection을 사용한다.
3. 에러 메시지를 활용해서 데이터를 출력한다.
우리가 활용하기 위해서는 두가지 조건이 있다.
1. logic 에러
2. SQL 에러 : 웹서버나 백엔드의 코드 에러는 필요없고 SQL 구문의 에러여야한다.

logic 에러가 아닌 syntax 에러는 우리에게 쓸모가 없음
1. Syntax 에러 : 실행이 안되기때문에 우리에게는 쓸모가 없다. 에러를 보기 위한게 아니라 데이터를 뽑기 위함이다. 즉, select문을 실행해야한다. 문법에러는 실행자체가 안된다.
2. logic 에러 : 문법적으로는 말이 되지만 실행하다보니 에러가 발생한다.

우리가 얻고자 하는 결과 값이 에러 문구에 나오게 하는 것이 목표이다.
loogic error를 유발하는 팁이 있는데 이건 Mysql, oracle, mssql마다 달라진다.
select * from member where id ='' 구문에 넣을 때 
normaltic' and(select pass from member limit 0,1) and '1' = '1을 넣으면 잘 나온다.(삭제)

normaltic' and extractvalue('1',concat(0x3a, (select 'normaltic'))) and '1'='1을 넣을 경우 select 결과값이 나오게 된다.
- 예를 들어서 (select pass from member where id='normaltic')=1을 실행하면 비밀번호가 '1234'일 때 '1234'=1을 실행하면 '1234'는 숫자가 아니라는 에러 문구가 나온다.
- 여기서 extractvalue는 xml데이터에서 xml표현식으로 표현된 특정 문구를 찾아내는 함수. 즉, DB와 직접적으로 연관있는 함수가 아니라 단순히 에러 문구를 내기 위한 수단으로 활용되는 함수.
- 0x3a는 콜론(:)을 의미함 직접 ':'을 입력하면 넣어지지 않기 때문.

Part3. 실제 해킹 프로세스

1. SQL Injection의 포인트를 찾는것 : normaltic을 검색할 때 normaltic'을 검색하면 SQL syntax 에러가 뜨고 "normaltic'" 이런 식으로 화면에 출력되는지 확인하기
2. 에러를 출력할 수 있는 함수 찾기 : ex)extractvalue
3. 공격 format을 만들기 : union 기법처럼 공격 format 만들기 ex. normaltic' and extractvalue('1',concat(0x3a,(select 'normaltic'))) and '1'='1
4. DB 이름 출력 : select database()
5. 테이블 이름 출력 : select table_name from information_shcema.tables where table_schema='테이블이름' *한개이상 나올 경우에는 limit 활용하기
6. 컬럼 이름 출력 : select column_name from information_schema.columns where table_name='테이블이름'
7. 테이블의 값 출력 : select name from '테이블이름'

Part4. Blind SQL Injection

1. SQL 질의문 결과가 화면에 나오는 경우 : Union SQL Injection
2. SQL 에러 메시지가 화면에 출력되는 경우 : Error Based SQLi
3. SQL 질의문 결과가 화면에 안나오는 경우 : Blind SQL Injection (ex. 로그인, 아이디 중복체크)

Blidnd SQL Injection : 참과 거짓의 응답 차이에 따라서 알아낼 수 있다.
normaltic 아이디 중복 검사의 경우를 상상해보자
normaltic을 넣어서 존재하는지 알아보는 구문(select * from member where id='___')에서 ___에다가 normaltic' and ('1'='1') and '1'='1 이런식으로 물어볼 수 있고 우리는 괄호 안에다가 우리가 알고 싶은 질의문을 넣음으로서 해당 질의문의 결과가 true false 결과를 알 수 있다.
비밀번호가 a로 시작하는지, b로 시작하는지 등을 참, 거짓을 물어봐서 순차적으로 알아내는 것.

Part5. 실전을 위한 프로세스 정리

1. SQL Injection 포인트 찾기 : 항등원을 넣고 결과가 잘 나오는지 확인하기. 그리고 참인 결과와 거짓인 결과가 다른지 확인하기
2. SELECT 문구가 사용가능한지 확인하기 : ()안에다가 select를 사용하는 항등원 넣고 참거짓 되는지 확인하기 ex. (select 'test')='test'
3. 공격 format 만들기 : ex. normaltic' and (__조건__) and '1'='1
substr('test',1,1) => 't'가 나옴 index가 0이 아니라 1부터 시작함 / substr('test',1,2) => 'te'가 나옴
substr((__SQL__),1,1) 를 넣어본다. ex. substr((select 'test',1,1))='t'
자동으로 하기 위해서 글자를 ascii 코드로 바꿈. 예를들어 ascii('a')는 97이 나옴
normaltic' and (ascii(substr((__SQL__),1,1)) > 0) and '1'='1 이라는 공격 포맷이 만들어짐. 왜냐하면 substr결과로 나오는 값이 ascii코드로 만들었을 때 글자라면 0보다 크기 때문에 true로 나올 것 
repeater로 빠르게 효율적으로 할 수 있음
4. 공격포맷으로 db데이터 찾기
5. 공격포맷으로 table 찾기
6. 공격포맷으로 column 이름 찾기
7. 공격포맷으로 데이터 값 찾기

수작업으로 해보는 것을 권유! 특히 SQL Injection Blind Practice문제는 수동화로 풀기
blind injection은 sql injection이 다 적용되긴하지만 시간이 오래걸린다. blind는 최후의 보류