잘못된 SQL문 사용 시 RDBMS에서 발생하는 오류 페이지에서 정보를 얻어 공격하는 방법을 실습한다.
RDBMS 오류 페이지
위는 SQL문에 오류가 있을경우 보이는 오류 페이지이다. 개발자 입장에서는 오류의 원인을 파악할 수 있어 용이할 수 있으나 공격자의 경우 DB에 대한 여러 가지 정보를 얻을 수 있기 때문에 위험할 수 있다.
서비스 중인 웹 서버라면 이러한 오류 정보를 숨기고 동일한 오류 페이지를 구성해 정보의 유출을 최소화 해야한다.
실습 사이트 오류 페이지 정보 수집 공격
로그인에 SQL injection 취약점이 존재하는 실습용 페이지이다. 해당 페이지는 SQL문의 오류시 오류 페이지를 반환한다.
우리는 이를 이용하여 webmaster라는 계정의 비밀번호를 바꾸어 나만 접속가능하도록 만들 것이다.
우선 id에 ' having 1=1-- 를 입력하여 일부러 오류를 발생시킨다.
왜 having인가?
having 절은 group by가 선행되어야 쓸 수 있기 때문에 group by가 없다면 오류가 발생하며 오류의 내용에서 테이블, 컬럼의 정보를 얻을 수 있는 확률이 높다.
입력 결과 다음과 같은 페이지를 확인할 수 있다.
우리는 이 오류 메시지를 통해서 웹 서버가 MSSQL을 사용한다는 것과 로그인 테이블이 "tbl_member"이며 컬럼이 "uid", "userid", "passwd" 가 있다는 정보를 얻을 수 있다. 이 오류 페이지는 아래로 더 많은 정보가 있으며 모든 컬럼 정보가 나와있다.
SQL문에 해당하는 테이블과 컬럼을 알아냈음으로 우리는 완전한 SQL문장을 유추해볼 수 있다.
select userid, passwd from tbl_member where userid = ' 입력값 ' and passwd = ' 입력값 ';
DB 내부 정보를 알아낸 이상 우리는 데이터를 수정할 수 있는 힘이 생겼다.
webmaster라는 계정의 비밀번호를 1111로 바꾸어 볼 것이다.
입력은 SQL injection에 취약했던 로그인 창에서 진행한다.
' ; update tbl_member set passwd = 1111 where userid = 'webmaster'; -- 를 입력해본다.
이렇게 입력하는 이유는 기존 SQL문에 대입시키면 이해할 수 있다.
select userid, passwd from tbl_member where userid = ' ' ;update tbl_member set passwd = 1111 where userid = 'webmaster'; -- ' and passwd = ' ';
앞 문장을 '; 로 끝내고 업데이트문을 실행해서 webmaster의 비밀번호를 1111로 바꾼 뒤 뒷문장은 주석으로 무시한다.
입력하면 로그인은 되지 않지만 SQL문은 정상적으로 작동했을 것이다.
이제 id : webmaster, pw : 1111로 로그인하면 다음과 같이 정상적으로 로그인된다.
우리는 오류페이지에서 얻은 데이터베이스의 정보를 이용하여 계정의 비밀번호를 바꾸어 접속에 성공하였다.
해킹에 있어서 원래 비밀번호를 찾는 것보다 비밀번호를 바꾸는 것이 훨씬 쉽다고 할 수 있다.
'보안 이론 > 웹 보안' 카테고리의 다른 글
Blind SQL Injection - DB 데이터 값 추측 (0) | 2022.09.16 |
---|---|
SQL Injection - 다른 DB 데이터 접근 (0) | 2022.09.14 |
SQL Injection - 로그인 우회 (0) | 2022.09.14 |
HTTP 헤더와 오류코드 (0) | 2022.09.14 |
(2021) OWASP TOP 10에 대해서 (0) | 2022.09.13 |