-
모의해킹의 세 번째 SQL 인젝션 공격웹 해킹 2021. 3. 13. 14:46
SQL 인젝션 취약점은 웹 서버 영역의 데이터베이스로 전송되는 SQL 쿼리문을 사용자가 임의로 조작할 수 있는 경우를 말한다. 공격자는 이 취약점을 이용하여 데이터베이스에 저장되어 있는 다른 사용자의 개인정보를 허가되지 않은 정보에 접근하거나 데이터를 변조할 수 있다.
SQL 인젝션 공격은 WHERE 구문 우회와 UNION 공격으로 나뉜다.
WHERE 구문 우회 부터 보면, 쿼리문에 where 조건문이 있는데, 그 뒤에 or '1'='1' 과 같이 항상 참이 되는 조건을 추가하면 SQL 인젝션 공격이 성공할 수 있다.
UNION 공격은 합집합으로 UNION 뒤에 구문을 같이 포함시켜 쿼리문을 실행시킨다. 쿼리문 끝에 #은 뒤에 오는 내용을 주석처리하고자 할 때 사용하는 특수문자고 만약 없다면, 가장 끝에 '문자로 인해 에러가 발생할 수 있습니다' 라는 문구가 나올 수 있다.
이렇게 SQL 인젝션 공격의 두 가지 사례를 알아보았다.
WHERE 구문 우회 실습을 해보겠다.
우선 보안 레벨을 low로 설정하고 SQL Injection 메뉴를 선택한다.
SQL 인젝션 공격에 취약한지 테스트해볼 수있는 방법 중 가장 기본적인 방법은 '를 입력해보는 것이다.
파라미터에 '를 입력하고 에러가 발생하거나 비정상적인 상황이 나타나는지 확인한다. 비정상적인 상황이 나타나면 SQL 인젝션 취약점을 의심해 볼 수 있다.
그 이유는 where id=' ' '; 로 구성될 수 있기 때문에 syntax 에러가 발생하는 것이다. 이때 이 입력은 SQL 쿼리문에 영향을 줄 수 있다는 뜻이다.
or 뒤에 '1'='1'은 항상 참이기 때문에 모든 사용자의 정보가 출력된 것을 볼 수 있다.
UNION 실습을 해보겠다.
UNION은 합집합이기 때문에 원래의 SQL 쿼리문이 조회하는 SELECT 문의 칼럼 개수와 UNION 뒤의 SELECT 문에서 요청하는 칼럼 개수가 같아야한다. 그렇지 않으면 형식 에러가 발생한다. 따라서 UNION 공격을 성공시키기 위해서는 원래 SQL 쿼리문이 몇 개의 칼럼을 반환하는지 알아야한다.
칼럼 개수는 ORDER BY 구문으로 알 수 있다. ORDER BY는 지정된 칼럼을 기준으로 결과를 정렬할 때 사용하는 키워드이다. 칼럼의 이름으로도 정렬할 수 있지만, 인덱스를 이용하여 정렬하는 것도 가능하다. 인덱스 값을 증가시키다가 에러가 발생하면 그 전 값이 칼럼의 개수라는 것을 알 수 있다.
위 그림으로 전체 칼럼 개수가 2개 임을 알 수 있다.
칼럼의 개수를 두 개로 맞추어 입력해보면 에러없이 실행된다.
My SQL 데이터베이스는 information_schema 라는 데이터베이스에서 데이터베이스 이름, 테이블, 칼럼 정보 등을 관리하고 있습니다. 그래서 information_schema의 schemata 테이블로부터 schema_name을 가져오는 SQL 쿼리문을 이용하면, 데이터베이스 이름을 알아낼 수 있다.
이때 패스워드 값이 해쉬 값으로 암호화 되어있는 것을 볼 수 있다. 하지만 dvwa는 MD5라는 사이트에서 해쉬 값의 복원 값을 알 수 있다.
블라인드 SQL 인젝션 공격 실습을 해보겠다.
우선 보안 레벨을 low로 설정하고 SQL Injection(Blind) 메뉴를 선택한다.
위 그림에 따르면 데이터 베이스의 유무를 알 수 있지만, 에러가 발생하지 않아 SQL 쿼리문을 쉽게 알기 어렵다. 하지만 AND를 이요하여 공격을 시도할 수 있다.
위 그림들을 보면, AND 이후의 조건에 따라 결과가 바뀐다는 것이고 우리가 입력하는 값이 SQL 쿼리문을 통해 처리되고 있다는 것이다.
AND 연산을 이용하여 입력 값을 보낼 때 연산에 따라 결과가 달라진다면 블라인 SQL 인젝션 취약점을 의심해 볼 수 있다.
이와 같이, 결과를 직접적으로 알 수는 없어도, 참과 거짓일 때의 결과 차이를 분석하여 어떤 정보를 알아내는 기법을 블라인드 SQL 인젝션 공격이라고 한다.
또한 요청이 응답되는 시간의 차이를 이용하여 참/거짓을 구별해내는 방법을 시도해볼 수 있는다.
존재하는 ID와 존재하지 않는 ID를 입력하여 요청 시간의 차이로 알 수 있다. 블라인드 SQL 인젝션은 손수 진행해야 하는 번거로움이 있기 때문에 자동화 프로그램을 이용해야 한다.
그 자동화 프로그램으로 sqlmap 프로그램이 있다.
sqlmap 필수 옵션은 -u URL 정보이다. 또한 DVWA처럼 로그인된 페이지에 SQL 인젝션 공격을 시도하는 경우에는 cookie 정보도 필요하다.
이와 같이 sqlmap 프로그램을 이용해서 URL에 포함된 각 파라미터를 자동으로 테스트하여 SQL 인젝션 공격 가능 여부를 확인할 수 있다. 이와 더불어 개발 언어와 서버, DBMS 버전 등을 알 수 있고, 결과를 저장하기 때문에 결과를 참조하여 데이터를 수집할 수 있다.
이렇게 sqlmap을 이용하여 정보들을 자동화하여 가져올 수 있다.
SQL 인젝션 취약점이 무서운 것은, 이와 같이 사이트 내에 단 한개의 파라미터만 SQL 인젝션 공격에 취약하면 개인정보가 간단히 털릴 수 있기 때문이다.
SQL 인젝션 공격과 같은 모든 파라미터 입력 값 조작으로 이루어지는 공격은 입력 값 검정을 통해 대응할 수 있다. 그래서 사용자가 입력한 값은 SQL 쿼리문에서 오직 데이터로만 사용되어야 하지 SQL 쿼리문의 구조에 영향을 줄 수 없도록 해야 한다.
예방책은 쿼리문을 구성하고 실행하는 방법을 파라미터 쿼리로 변경하는 것이다.
prepare() 부분을 보면 미리 실행할 쿼리문의 형태를 가지고 있고 이를 프리페어드 스테이트먼트(prepared statement)라고 한다.
그리고 사용자 입력 값이 들어갈 id 부분은 bindParam()에서 설정되도록 하고 있다. 이후 사영자가 입력한 값이 쿼리문의 일부가 될 수 없고 온전히 데이터로만 처리된다.
이를 통해 SQL 인젝션 공격을 효과적으로 방지할 수 있다.
위 글은 화이트 해커를 위한 웹 해킹의 기술을 참고했습니다.
'웹 해킹' 카테고리의 다른 글
모의해킹의 여섯 번째 CSRF 공격 (0) 2021.03.16 모의해킹의 다섯 번째 XSS 공격 (0) 2021.03.15 모의해킹의 네 번째 커맨드 인젝션 공격 (0) 2021.03.14 모의해킹의 두 번째 취약한 인증 공격 (0) 2021.03.10 모의해킹의 첫 번째 정보수집 (0) 2021.03.09