SQL 주입 튜토리얼: 예제를 통해 학습하는 방법
SQL 주입이란 무엇입니까?
SQL 주입은 동적 SQL 문을 손상시켜 문의 특정 부분을 주석 처리하거나 항상 true인 조건을 추가하는 공격입니다. 잘못 설계된 웹 애플리케이션의 설계 결함을 이용하여 SQL 문을 악용하여 악성 SQL 코드를 실행합니다.
데이터는 정보 시스템의 가장 중요한 구성 요소 중 하나입니다. 데이터베이스 기반 웹 애플리케이션은 조직에서 고객으로부터 데이터를 얻는 데 사용됩니다. SQL 구조적 쿼리 언어(Structured Query Language)의 약어입니다. 데이터베이스의 데이터를 검색하고 조작하는 데 사용됩니다.
SQL 주입 공격은 어떻게 작동하나요?
SQL 인젝션을 사용하여 수행할 수 있는 공격 유형은 데이터베이스 엔진 유형에 따라 다릅니다. 공격은 동적 SQL 문에서 작동합니다.. 동적 문은 웹 양식 또는 URI 쿼리 문자열의 비밀번호 매개변수를 사용하여 런타임 시 생성되는 문입니다.
SQL 주입 예
로그인 양식이 있는 간단한 웹 애플리케이션을 고려해 보겠습니다. HTML 양식의 코드는 아래와 같습니다.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
이리,
- 위의 양식은 이메일 주소와 비밀번호를 수락한 후 이를 다음 주소로 전송합니다. PHP index.php라는 파일입니다.
- 쿠키에 로그인 세션을 저장하는 옵션이 있습니다. 우리는 이것을 remember_me 체크박스에서 추론했습니다. 이것은 post 메서드를 사용하여 데이터를 제출합니다. 즉, URL에 값이 표시되지 않습니다.
사용자 ID를 확인하기 위한 백엔드 명령문이 다음과 같다고 가정해 보겠습니다.
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
이리,
- 위의 명령문은 다음 값을 사용합니다.
$_POST[]
소독하지 않고 직접 배열합니다. - 비밀번호는 MD5 알고리즘을 사용하여 암호화됩니다.
sqlfiddle을 이용한 SQL 주입 공격을 설명하겠습니다. URL 열기 http://sqlfiddle.com/ 웹 브라우저에서. 다음 창이 나타납니다.
참고: SQL 문을 작성해야 합니다.
단계 1) 왼쪽 창에 이 코드를 입력하세요
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
단계 2) 스키마 구축을 클릭하세요.
단계 3) 오른쪽 창에 이 코드를 입력하세요
select * from users;
단계 4) SQL 실행을 클릭합니다. 다음 결과가 표시됩니다.
사용자 용품을 가정해보자 관리자@admin.sys and 1234 비밀번호로. 데이터베이스에 대해 실행될 명령문은 다음과 같습니다.
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
위의 코드는 비밀번호 부분을 주석으로 처리하고 항상 참이 되는 조건을 추가하면 악용될 수 있습니다. 공격자가 이메일 주소 필드에 다음 입력을 제공한다고 가정해 보겠습니다.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
비밀번호는 xxx입니다.
생성된 동적 문은 다음과 같습니다.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
이리,
- xxx@xxx.xxx 문자열 따옴표를 완성하는 작은 따옴표로 끝납니다.
OR 1 = 1
LIMIT 1은 항상 true이고 반환된 결과를 하나의 레코드로 제한하는 조건입니다.- — ' AND …는 비밀번호 부분을 제거한 SQL 주석입니다.
위의 SQL 문을 복사하여 붙여넣으세요. SQL Fiddle아래와 같이 SQL 텍스트 상자를 실행합니다.
해킹 활동: 웹 애플리케이션에 SQL 삽입
우리는 간단한 웹 애플리케이션을 가지고 있습니다. http://www.techpanda.org/ 이는 데모 목적으로만 SQL 주입 공격에 취약합니다. 위의 HTML 폼 코드는 로그인 페이지에서 가져온 것입니다. 이 애플리케이션은 이메일 필드의 살균과 같은 기본적인 보안을 제공합니다. 즉, 위의 코드는 로그인을 우회하는 데 사용할 수 없습니다.
이를 해결하기 위해 대신 비밀번호 필드를 활용할 수 있습니다. 아래 다이어그램은 따라야 할 단계를 보여줍니다.
공격자가 다음과 같은 입력을 제공한다고 가정해 보겠습니다.
- 1단계: 이메일 주소로 xxx@xxx.xxx를 입력합니다.
- 2단계: xxx')를 입력하거나 1 = 1 — ]
- 제출 버튼 클릭
- 대시보드로 이동됩니다
생성된 SQL 문은 다음과 같습니다.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
아래 다이어그램은 명령문이 생성되었음을 보여줍니다.
이리,
- 이 명령문은 md5 암호화가 사용된다고 지능적으로 가정합니다.
- 작은따옴표와 닫는 괄호를 완성합니다.
- 항상 참인 명령문에 조건을 추가합니다.
일반적으로 성공적인 SQL 주입 공격은 성공적인 공격을 수행하기 위해 위에서 설명한 것과 같은 다양한 기술을 시도합니다.
기타 SQL 주입 공격 유형
SQL 주입은 로그인 알고리즘을 통과하는 것 이상으로 더 많은 피해를 입힐 수 있습니다. 일부 공격에는 다음이 포함됩니다.
- 데이터 삭제
- 데이터 업데이트
- 데이터 삽입
- 트로이 목마 등 악성 프로그램을 다운로드 및 설치할 수 있는 명령을 서버에서 실행
- 신용 카드 정보, 이메일, 비밀번호와 같은 귀중한 데이터를 공격자의 원격 서버로 내보내기
- 사용자 로그인 세부 정보 등을 얻기
- 쿠키 기반 SQL 주입
- 오류 기반 SQL 주입
- 블라인드 SQL 인젝션
위 목록은 완전한 것이 아닙니다. 단지 SQL 주입이 무엇인지에 대한 아이디어를 제공할 뿐입니다.
SQL 주입을 위한 자동화 도구
위의 예에서는 SQL에 대한 방대한 지식을 바탕으로 수동 공격 기법을 사용했습니다. 가능한 가장 짧은 시간 내에 보다 효율적으로 공격을 수행하는 데 도움이 되는 자동화된 도구가 있습니다. 이러한 도구에는 다음이 포함됩니다.
- SQLMap – http://sqlmap.org/
- JSQL 주입 – https://tools.kali.org/vulnerability-analysis/jsql
SQL 주입 공격을 방지하는 방법
조직은 SQL 주입 공격으로부터 자신을 보호하기 위해 다음 정책을 채택할 수 있습니다.
- 사용자 입력은 절대로 신뢰할 수 없습니다. 동적 SQL 문에서 사용되기 전에 항상 삭제되어야 합니다.
- 저장 프로시저 – 이는 SQL 문을 캡슐화하고 모든 입력을 매개변수로 처리할 수 있습니다.
- 준비된 진술 – 먼저 SQL 문을 생성한 다음 제출된 모든 사용자 데이터를 매개변수로 처리하여 작동하도록 준비된 문입니다. 이는 SQL문의 구문에 영향을 주지 않습니다.
- 정규식 – 이는 잠재적으로 유해한 코드를 감지하고 SQL 문을 실행하기 전에 제거하는 데 사용될 수 있습니다.
- 데이터베이스 연결 사용자 접근 권한 – 다음 작업에 사용되는 계정에는 필요한 액세스 권한만 부여되어야 합니다. 데이터베이스에 연결. 이렇게 하면 SQL 문이 서버에서 수행할 수 있는 작업을 줄이는 데 도움이 될 수 있습니다.
- 오류 메시지 – 이것들은 민감한 정보와 오류가 정확히 어디에서 발생했는지를 공개해서는 안 됩니다. "죄송합니다. 기술적 오류가 발생했습니다. 기술 팀에 연락했습니다. 나중에 다시 시도하세요"와 같은 간단한 사용자 지정 오류 메시지를 사용하여 오류를 일으킨 SQL 문을 표시하는 대신 사용할 수 있습니다.
해킹 활동: SQL 주입에 Havij 사용
이 실제 시나리오에서는 Havij Advanced SQL 주입 프로그램을 사용하여 웹사이트의 취약점을 검사해 보겠습니다.
참고: 당신의 안티 바이러스 프로그램 특성상 플래그가 지정될 수 있습니다. 제외 목록에 추가하거나 바이러스 백신 소프트웨어를 일시 중지해야 합니다.
아래 이미지는 Havij의 기본 창을 보여줍니다.
위 도구는 웹 사이트/응용 프로그램의 취약성을 평가하는 데 사용할 수 있습니다.
요약
- SQL 인젝션은 잘못된 SQL 문을 이용하는 공격 유형이다.
- SQL 주입은 로그인 알고리즘을 우회하고, 데이터를 검색, 삽입, 업데이트, 삭제하는 데 사용할 수 있습니다.
- SQL 주입 도구로는 SQLMap, SQLPing, SQLSmack 등이 있습니다.
- SQL 문을 작성할 때 좋은 보안 정책을 사용하면 SQL 주입 공격을 줄이는 데 도움이 될 수 있습니다.