DVWA Security Level 을 Medium으로 설정하고 SQL Injection 페이지로 간다. 이번에는 ID를 폼에다가 입력하는 것이 아니라 정해진 값을 선택하도록 되어 있다. 이 경우 비록 GUI에서 값을 선택하도록 만들어놨지만 Intercept 기능을 이용해서 값을 바꾸는 것을 시도해 볼 수 있다. Burp Suite의 Proxy -> Intercept로 가서 Intercept를 켠다. User ID를 1로 선택하고 submit을 눌러 본다. Burp Suite에서 위와 같은 화면이 나오는데 여기서 id=1 부분을 id=1' or '1'='1 로 수정하여 Forward를 한다. Forward를 했더니 그림과 같이 구문 에러가 난다. id값이 1, 2, 3, 4, 5 로 숫자로 되어 있었는데..
지금까지 우리는 SQL 인젝션 공격을 손수 시도하여 각종 정보를 알아내는 실습을 하였다. 이번 시간에는 SQL 인젝션 공격 프로그램 중 가장 대중적이라고 할 수 있는 SQLMAP 이라는 프로그램을 이용하여 자동으로 공격하는 방법을 배워 보자. Applications 메뉴로 가서 Web Application Analysis -> sqlmap 클릭 sqlmap은 파이썬으로 개발된 프로그램으로 터미널에서 명령을 실행 할 수 있다. sqlmap 화면을 보면 sqlmap과 관련된 각종 옵션들을 참고 할 수 있다. 이 중 필수 옵션은 -u 이다. -u 뒤에다가 공격할 URL주소를 입력하면 sqlmap 프로그램이 그 url을 대상으로 자동으로 공격을 수행한다. DVWA처럼 로그인 된 상태에서 공격을 수행할 때는 쿠키..
이번에는 블라인드 SQL 인젝션에 대해서 알아보자. DVWA의 블라인드 SQL 인젝션 페이지에 들어가서 1이라는 id를 입력해보자. 사용자 1에 대한 정보가 나오는 대신에 이 페이지에는 ID 1인 사용자가 존재한다는 것만 알려준다. 이번에는 지난번에 SQL 인젝션 공격을 할 때 했던 것 처럼 한 번 작은 따옴표를 입력해본다. 특별한 에러가 발생하는 대신 사용자가 존재하지 않는다는 메시지를 보여준다. 에러가 발생하지 않기 때문에 이 폼 뒤에 SQL 쿼리문이 사용되고 있는지, 또 우리가 조작할 수 있는지 쉽게 알기 어렵다. 만약 조작한다고 하더라도 데이터의 내용을 출력하지 않기 때문에 쉽게 정보를 빼내기도 어렵다. 이번에는 1'AND 1=1# 을 입력해본다. ID가 존재한다고 나온다. 1' AND 1=2# ..
데이터베이스 정보를 알아내보자. 깃허브에 올려져 있는 SQL 구문을 보면 데이터베이스 명 조회에 관련된 구문이 있다. 이 구문을 사용한다. information_schema라는 데이터베이스의 schemata라는 테이블에서 정보를 가져오는데 mysql에서는 information_schema라는 데이터베이스에서 데이터베이스 정보나 테이블, 칼럼 정보를 관리하고 있다. schema_name을 가져오면 데이터베이스 명을 조회할 수 있다. user ID에 위의 구문을 넣고 실행한다. 모든 데이터베이스의 이름들이 출력되었다. dvwa, information_schema, mysql 등의 데이터베이스 명이 있음을 알 수 있다. dvwa 데이터베이스가 우리가 관심을 가질만한 DB이다. select로 schema_nam..
이번에는 UNION 키워드를 이용한 공격을 실습 해보자. UNION을 이용하면 데이터베이스의 모든 정보를 알아낼 수 있다. UNION은 합집합 이라고 했었는데 UNION을 사용하기 위해서는 원래 쿼리문이 조회하는 select문에 칼럼 개수와 union 뒤의 select문에서 요청하는 칼럼 개수가 같아야 한다. 그렇지 않으면 에러가 발생하기 때문에 먼저 원래의 쿼리문이 몇 개의 칼럼을 리턴하는지 알아내야 한다. DVWA의 SQL Injection 페이지에 가서 UserID에 1'union select 1# 을 입력해보자. 이 select 뒤에 1이라는 상수 값을 주게 되면 그것을 그대로 출력 할 수 있다. 꼭 1 뿐만 아니라 2, 3 혹은 null 이라는 값을 줄 수 있다. submit을 누른다. 실행을 ..
SQL 인젝션 공격 SQL 인젝션 공격 이란 데이터베이스에 전송되는 SQL 쿼리문을 사용자 입력으로 조작하여, 데이터베이스 내의 데이터를 변조하거나 허가되지 않은 정보에 접근 할 수 있는 공격이다. 웹사이트의 회원정보 등 개인정보를 빼낼 때 최근까지도 자주 쓰이는 웹 공격이다. 실제 사례 · 2011년 소니 해킹 2011년에 소니 데이터베이스가 SQL 인젝션 공격을 당해 100만 명의 회원정보와 350만 개의 디지털 쿠폰 등이 탈취 · 2015년 뿜뿌 해킹 뿜뿌 사이트가 해킹 되어 190만의 회원정보가 유출 · 2015년 어나니머스 WTO 해킹 유명한 해킹그룹인 어나니머스가 WTO 세계무역기구의 한 사이트를 SQL 인젝션 공격으로 해킹하여 수천 명의 각국 재직자 정보를 유출 두 가지의 기본적인 SQL 인..
악성 쿼리 오늘은 악성 쿼리문에 대해 알아보도록 하겠습니다. 악성 쿼리문이란 서버의 처리량을 많이 사용해서 결국 서버의 전반적인 성능을 나쁘게 하는 쿼리문을 뜻합니다. 비유를 하자면 많은 사람(쿼리문)이 음식을 주문하기 위해 줄 서 있는데, 어떤 사람(악성 쿼리문)이 계속 판매원에게 필요치 않은 질문을 던져서 뒤에 서 있는 다른 수많은 사람들이 음식을 주문하는데 시간이 오래 걸리는 것과 같습니다. SQL 초보자들은 결과만 나오면 잘 된 것처럼 느끼지만 실무에서는 얼마나 효과적으로 결과를 얻느냐가 중요한 이슈가 되기 때문에 잘못된 악성쿼리를 자꾸 만들지 않도록 신경을 써서 SQL문을 만들 필요가 있습니다.
일반 문자열 (CHAR, VARCHAR) 먼저 일반 문자열인 CHAR와 VARCHAR에 대해 알아보도록 하겠습니다. CHAR나 VARCHAR 앞에 'N'이 붙지 않은경우 일반 문자열입니다. 이 일반 문자열을 사용할 경우 데이터를 정의할 때, 바이트 수를 신경써주셔야 합니다. 일반적으로 영문 1바이트, 한글(유니코드)는 2바이트 입니다. CHAR => 고정 문자열 + 일반 문자열 EX) char(100)으로 지정하고, "abc"를 입력하면 항상 100byte의 영역을 확보합니다. (97바이트 낭비) VARCHAR => 가변문자열 + 일반 문자열 EX) varchar(100)으로 지정하고, "abc"를 입력하면 3byte의 영역을 확보합니다. (낭비 X) CHAR, VARCHAR의 경우 한글(2바이트) EX..