1. Blind SQLi
1) 정의
- Blind SQL 인젝션은 쿼리의 결과를 참과 거짓으로만 출력하는 페이지에서 사용하는 공격이다.
- 출력 내용이 참 / 거짓 밖에 없어서 그것을 이용하여 데이터베이스의 내용을 추측하여 쿼리를 조작한다
2) 공격 방법
Blind SQLi는여러가지 정보들을 먼저 추출한는 공격을 수행한 뒤에 데이터를 수집해야한다.
순서에 따라서 다음과 같이 설명한다.
1) 취약점 확인
- 프록시 도구로 간단한 테스트를 통해 Blind SQLi 취약점이 있는지 확인한다.
- 공격 시 삽입 구문: john' and '1'='1
- 프록시 도구를 이용해 해당 부분에 쿼리를 조작하여 취약점을 확인한다.
- 공격 시 삽입 구문으로 쿼리를 조작하여 로그인이 성공하면 취약점이 존재한다.
- 최종적으로 ‘1’=’1 부분에 ‘1’=’2(거짓)를 삽입하여 거짓일 경우 로그인이 실패하면 취약점이 존재한다.
2) 데이터베이스 이름 확인
- Substring 함수와 ascii코드를 이용해 참/거짓 판단으로 Database 이름을 추출한다
- 공격 시 삽입 구문: john' and (ascii(substring((select database()),1,1))>0) and '1'='1
- 아스키 코드표를 보면서 데이터베이스 이름의 문자를 한 개씩 추출하면서 조합한다.
- 아스키 코드는 0보다는 무조건 크기 때문에 >0을 대입하면 참이므로 로그인이 성공한다.
- 해당 페이지에서는 76까지 참이 출력되고 77부터 거짓이 출력되므로 Database이름의 첫 번째 문자는 ‘M’ 이다.
- select database()),1,1))>0 부분에서 1,1(첫번째 문자) 2,1(두번째 문자) 순서로 삽입하여 이름을 추출한다.
- 마지막으로 >0을 대입했을 때 거짓이 나오면 더 이상 Database이름의 문자가 존재하지 않으므로 추출이 완료된 것이다.
3) 테이블 이름 확인
- 추출한 Database 이름과 Substring 함수, ascii코드를 이용해 참/거짓 판단으로 테이블 이름을 추출한다.
- 공격 시 삽입 구문: john' and (ascii(substring((select table_name from information_schema.tables where table_schema='MEMBER' limit 2, 1), 1, 1))>107) and '1'='
- 아스키 코드표를 보면서 테이블 이름의 문자를 한 개씩 추출하면서 조합한다.
- 아스키 코드는 0보다는 무조건 크기 때문에 >0을 대입하면 참이므로 로그인이 성공한다.
- 해당 페이지에서는 107까지 참이 출력되고 108부터 거짓이 출력되므로 테이블이름의 첫 번째 문자는 ‘l’ 이다.
- limit 2, 1) 부분에서 0,1(첫번째 행) 2,1(두번째 행) 순서로 삽입하여 테이블 이름을 추출한다.
- ), 1, 1))>107) 부분에서 1,1(첫번째 문자) 2,1(두번째 문자) 순서로 삽입하여 테이블 이름을 추출한다.
- 마지막으로 >0을 대입했을 때 거짓이 나오면 더 이상 테이블 이름의 문자가 존재하지 않으므로 추출이 완료된 것이다
4) 컬럼 이름 확인
- 추출한 테이블 이름과 Substring 함수, ascii코드를 이용해 참/거짓 판단으로 컬럼 이름을 추출한다.
- 공격 시 삽입 구문: john' and (ascii(substring((select column_name from information_schema.columns where table_name='login' limit 0, 1), 1, 1))>110) and '1'='1
- 아스키 코드표를 보면서 컬럼 이름의 문자를 한 개씩 추출하면서 조합한다.
- 아스키 코드는 0보다는 무조건 크기 때문에 >0을 대입하면 참이므로 로그인이 성공한다.
- 해당 페이지에서는 109까지 참이 출력되고 110부터 거짓이 출력되므로 컬럼 이름의 첫 번째 문자는 ‘n’ 이다.
- limit 2, 1) 부분에서 0,1(첫번째 행) 2,1(두번째 행) 순서로 삽입하여 컬럼 이름을 추출한다.
- ), 1, 1))>107) 부분에서 1,1(첫번째 문자) 2,1(두번째 문자) 순서로 삽입하여 컬럼 이름을 추출한다.
- 마지막으로 >0을 대입했을 때 거짓이 나오면 더 이상 컬럼 이름의 문자가 존재하지 않으므로 추출이 완료된 것이다
5) 데이터 추출
- 추출한 정보들을 바탕으로 Substring 함수, ascii코드를 이용해 참/거짓 판단으로 데이터를 추출한다
- 공격 시 삽입 구문: john' and (ascii(substring((select pw from login where id='blue' limit 0, 1), 1, 1))>49) and '1'='1
- 아스키 코드표를 보면서 데이터의 문자를 한 개씩 추출하면서 조합한다.
- 아스키 코드는 0보다는 무조건 크기 때문에 >0을 대입하면 참이므로 로그인이 성공한다.
- 해당 페이지에서는 48까지 참이 출력되고 49부터 거짓이 출력되므로 데이터의 첫 번째 문자는 ‘1’ 이다.
- ), 1, 1))>49) 부분에서 1,1(첫번째 문자) 2,1(두번째 문자) 순서로 삽입하여 데이터 이름을 추출한다.
- 마지막으로 >0을 대입했을 때 거짓이 나오면 더 이상 데이터의 문자가 존재하지 않으므로 추출이 완료된 것이다