웹 사이트들은 사용자의 입력 값을 이용해 데이터베이스 접근을 위한 SQL Query를 생성한다.
공격
비정상적인 SQL Query를 이용한 공격
- 사용자 인증을 비정상적으로 통과
- 데이터베이스에 저장된 데이터를 임의로 열람
- 데이터베이스의 시스템 명령을 이용하여 시스템 조작
웹 로그인 시 SQL문
웹에서 사용자가 ID와 패스워드 입력창에 자신의 ID와 패스워드를 입력하면, 다음과 같은 SQL문이 작성되어, 데이터베이스에 전송
예시로 member라는 데이터 베이스가 있다고 가정하자.
즉, 입력한 로그인과 비밀번호를 찾아서 데이터베이스에 정보가 존재하면 비교하는 코드가 필요하다
SELECT user_id
FROM member
WHERE user_id='입력된 아이디' AND user_pw='입력된 패스워드'
형식으로 비교한다.
이때, user_id도 문자열이다. 문자열은 ''로 둘러쌓여있다.
따라서, 사용자 입력에 대해 언제나 ''가 붙어있다.
SQL Injection 공격이란, 어떤 수단을 써도 결과값이 NULL이 나오지 않게 즉, 출력값이 사용자 ID가 되도록 하여 로그인하는 것이다.
만약, ID, PW에 모두
'or''='
를 입력해주면 where로 입력되는 조건문을 항상 참으로 만들 수 있다.
SELECT user_id
FROM member
WHERE user_id = ''or ''='' AND paassword = '' or ''=''
이 되므로 "무조건" 참이 되므로 로그인된다.
즉, 어떤 것이든 True가 되는 문장을 넣을 수 있다면 무엇을 넣어도 상관 없다
SQL 에러 메지시를 이용한 DB 열람
- select ~ where : where에 주어진 조건을 만족하는 rows
- select ~ having : group by 된 데이터들에 대한 조건 검사
'having 1=1--
이라는 문자열을 로그인 창에 입력하면 에러 메세지가 뜬다
이를 통해 테이블 이름이 user이고, 첫번째 열 이름이 id임을 알 수 있다.
MS-SQL 상에서의 시스템 명령어 실행
- xp-cmdshell이라는 저장 프로시저를 통해서 시스템 명령어 실행
- 인증 페이지에서 실행 가능
ex)
id : test
password : '; exec master ..xp_cmdshell ping~~ --
을 입력하면
DB에는 해당 쿼리가 전송된다.
SELECT ID, Password
FROM user_table
WHERE ID='test' AND Password = ''; exec master ..xp_cmdshell'ping~' --
이는 SQL 쿼리를 끝낸 후에, 커맨드 쉘로 핑을 보내고 이후는 모두 주석처리하는 쿼리이다.
최근에는 비활성화 되어있다.
SQL Injection은 사용자의 입력값을 받아 데이터베이스에 SQL 문으로 데이터를 요청하는 모든 곳에 사용이 가능하다
대응책
- 사용자 입력값 중에 특수문자가 존재하는지 여부를 필터링
ex ) ', ", /, \, ;, :, space, -- - SQL 서버의 에러 메시지가 외부에 제공되지 않도록 설정
- 웹 애플리케이션이 사용하는 데이터베이스 사용자의 권한 제한
일반 사용자 권한과 시스템 저장 프로시저에 접근할 수 없도록 설정
'Hacking > Web Hacking' 카테고리의 다른 글
XSS (0) | 2024.10.15 |
---|---|
취약점 & 정보 수집 (2) | 2024.10.14 |
패킷 변조 (0) | 2024.07.16 |