웹사이트의 취약점을 공격하는 기술적 위협으로 웹페이지를 통하여 권한이 없는 시스템에 접근하거나 데이터 유출 및 파괴와 같은 행위를 말한다.
악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위이다. 간단하고 적용하기 쉬운 공격이지만 성공할 경우 큰 피해를 입힐 수도 있는 공격이다.
$ SELECT * FROM users WHERE username='USERNAME' AND password='PASSWORD'
이런 SQL 구문이 있다고 가정하였을 때 악의적인 사용자가 해당 구문의 입력값에 대한 검증이 없음을 확인하고 임의로 'USERNAME' 부분에 USERNAME OR 1=1 --
라는 SQL 구문을 주입한다. 그렇게 되면 OR 1=1
구문을 이용해 WHERE 절을 모두 참으로 만들고 --
를 넣어줘서 뒷부분의 구문을 모두 주석처리하게 된다.
결론적으로 users 테이블의 모든 정보를 조회하게 되면서 가장 먼저 만들어진 계정에 로그인하게 된다. 보통 관리자 계정을 제일 처음 만들기 때문에 관리자 계정에 로그인할 수 있게 되고 관리자의 권한을 이용해 또 다른 2차 피해를 발생시키게 된다.
SQL에서 Union 은 두 개의 쿼리문에 대한 결과를 통합해서 하나의 테이블로 보여준다.
$ SELECT * FROM board WHERE title LIKE '%INPUT1%' OR contents '%INPUT2'
이런 SQL 구문의 %INPUT1
부분에 UNION SELECT null, username, password FROM users --
라는 구문을 넣어주게 되면 두 쿼리문이 합쳐져서 하나의 테이블로 보여지게 된다. 성공하게 되면 사용자의 개인정보가 게시글과 함께 화면에 보여진다. 이 공격 역시 입력값에 대한 검증이 없을 때 발생한다.
이외에도 다양한 공격 방법이 있다.
웹페이지에 악성 자바스크립트를 삽입하는 공격이다. 대부분 사용자가 글을 쓰고 읽을 수 있는 게시판에 많이 발생하지만, 사용자의 입력값을 웹페이지에 보여주는 곳에서도 발생한다.
해커는 XSS 취약점이 있는 곳을 파악하고 악성 스크립트를 삽입한다. 삽입된 스크립트는 데이터베이스에 저장이 되고, 저장된 악성스크립트가 있는 게시글을 열람한 사용자들은 악성스크립트가 작동하면서 쿠키를 탈취당하거나, 다른 사이트로 리다이렉션 되는 공격을 받게 된다. 한번의 공격으로 수많은 피해를 입힐 수 있다는 점이 특징이다.
사용자에게 입력 받은 값을 서버에서 되돌려 주는 곳에서 발생한다. 보통 Reflected XSS는 공격자가 악의적인 스크립트와 함께 URL을 사용자에게 누르도록 유도하고, URL을 누른 사용자는 악의적인 스크립트가 실행되면서 공격을 당한다.
악의적인 스크립트가 포함된 URL을 사용자가 요청하게 되어 브라우저를 해석하는 단계에 발생하는 공격이다. 클라이언트 쪽 코드가 원래 의도와는 다르게 실행된다. 다른 XSS 공격과는 다르게 서버측에서 탐지가 어렵다.
Cross-Site Request Forgery 라고 한다. 공격자가 서비스 사용자를 이용하여 요청을 보내는 공격이다.
예를 들어 네이버 로그인과 똑같은 화면을 제공하는 피싱 사이트가 있다면 사용자는 피싱사이트인 것을 모르고 아이디, 비밀번호를 입력하고 로그인을 누를 것이다. 피싱 사이트는 진짜 네이버 로그인 URL에 요청을 하고 만약 CSRF 취약점이 있다면 성공/실패 Response가 온다. 이것을 이용하여 해커는 계정정보를 저장하고 진짜 사이트로 이동시킨 후 모른척 한다면 사용자는 해킹당했다는 사실조차 모를 수 있다.
간단한 공격이지만 매우 치명적인 공격이다.
쉘을 실행시키는 로직을 이용한 공격으로 시스템 권한이 탈취되는 것이나 마찬가지이기 때문에 매우 치명적이다.
각 언어마다 쉘 명령을 실행시키는 함수가 존재한다. 자바에는 System.runtime()
이나 Runtime.exec()
, 파이썬에는 exec()
, os.system()
등이 있다.
서버의 명령을 실행하는 함수는 되도록이면 사용하지 말아야 하고, 사용하더라도 서버에 영향을 끼칠 수 있는 명령어는 사용이 불가능하도록 해야 한다. 사용해야 한다면 |, &, ;, >, < 같은 문자는 필터링해야 한다.
공격 스크립트가 담긴 파일을 서버로 업로드하는 공격이다. 해커가 개발 언어에 따른 공격스크립트를 업로드하는데 성공하고 해당 파일을 브라우저로 접근할 수 있다면 Command Injection처럼 WebShell 접근이 가능해진다.
브라우저에서 자바스크립트를 삽입시키는 공격이다. 브라우저에서 제공하는 Console을 통해 조작이 가능하기 때문에 만약 클라이언트 사이드에 민감한 데이터를 넣어놨다면 해당 공격을 통해 탈취가 가능하다. 또한 데이터가 아니라도 클라이언트에서 로직을 결정하는 경우 함수 변조도 가능하기 때문에 왠만하면 서버에서 결정하도록 해야 한다.
Distributed Denial of Service 라고 한다. 이름 그대로 분산된 시스템을 이용하여 서버에 비정상적으로 많은 트래픽을 보내 마비시키는 공격이다. 몰래 심어놓은 좀비 PC를 이용할 수도 있고 본인이 사용할 수 있는 PC를 이용할 수도 있다. 많은 트래픽이 발생하면 서비스에 부하가 생겨 느려지거나 서버가 죽을 수 있다. 제일 단순하지만 제일 막기 힘든 공격이다.
미리 데이터베이스에 등록해놓은 수많은 문자열을 암호로 대입하는 공격으로 브루트 포스의 일종이다. 이 공격을 막기 위해서는 의미가 있는 간단한 단어는 비밀번호로 등록하지 못하게 막는 것이 좋다. 또한 Account Lockout Policy를 도입하여 몇 회 이상 로그인에 실패할 경우 계정을 잠그거나 OTP같은 2-factor 인증을 도입할 수 있다.
평문을 해시 함수로 만든 문자열을 모두 저장시켜 놓은 표를 말한다. 주로 계정 데이터 탈취 후에 원문을 알아내기 위해 사용한다.
인증&인가