[WebGoat] (A3)-1. SQL Injection (intro)

신지훈·2025년 7월 4일

WebGoat(웹 해킹)

목록 보기
6/8
post-thumbnail

1. SQL Injection (intro)

SQL Injection은 개발자가 설계한 SQL 쿼리문에 해커가 악의적인 공격 구문을 삽입해 해커의 의도대로 실행되게 하여 정보보안의 3대 요소인 기밀성, 무결성, 가용성을 모두 침해하는 공격을 말한다. 그럼 모의 해킹을 통해 어떻게 정보보안의 3대 요소를 침해하는지 살펴보자.

정보보안의 3대 요소의 내용은 아래쪽의 정리를 참고하자.

2. 모의 해킹 실습

본격적으로 들어가기에 앞서 SQL의 기본 문법을 다루고 있는 2,3,4,5실습은 넘어가고 9번 부터 모의 해킹 내용을 정리했다.

1. 9번 문제

먼저 SQL문에서 작은 따옴표(')의 역할을 알아보자. SQL문세서 작은 따옴표는 문자열을 감싸는데 사용된다. SELECT * FROM employees WHERE first_name='John'과 같이 작은따옴표로 감싸주면 해당 값이 문자열임을 SQL이 인식하게 된다.

이는 '로 인해서 SQL문의 해석이 달라질 수 있음을 의미하기도 한다. 이를 바탕으로 9번 문제를 확인해보자.

위의 문제를 살펴보면 양끝에 빨간 네모 안에 '가 있는 것을 확인할 수 있다. 만약 중간에 다른 '가 있으면 어떻게 될까?

중간의 '까지가 last_name에 기대하는 값이 된다. 하지만 SQL문에서 '의 개수는 짝수여야 하기 때문에 중간에 하나의 '를 추가하며 해커가 원하는 명령을 할 수 있게 된다.

이 경우 다음과 같이 Simth'로 last_name에 기대하는 값을 입력을 끝낸 후 or '1'='1
를 입력하면 모든 사용자의 결과값을 확인할 수 있게 된다.

이 SQL문은 어떻게 모든 정보를 조회할 수 있게 되었을까?

그 이유는 WHERE절을 살펴보면 and와 or 이 있는 것을 확인할 수 있다. 이때 and와 or중 and가 먼저 실행되기 때문에 first_name이 John이고 last_name이 Smith인 사람들은 여기서 true값이기 때문에 문제없이 조회되는 것이 정상이다. 하지만 그 외 사람들은 and구문에서 false값으로 끝이 나야한다. 하지만 뒤에 or이 있기 때문에 뒤에 연산도 실행하게 되고 or뒤에는 '1'='1'이라는 항상 true값이 있기 때문에 결과적으로 모든 사용자들의 데이터가 조회되게 된다.

그렇게 때문에 첫번에 박스에 Smith'가 라니라'만 들어가도 모든 데이터가 조회되게 된다.

SELECT * FROM user_data WHERE first_name = 'John' and last_name = 'Smith' or '1' = '1'
SELECT * FROM user_data WHERE first_name = 'John' and last_name = '' or '1' = '1'
둘 다 가능

2. 10번 문제

이 문제는 문제에서 Login_Count와 User_Id중 한 곳에서만 Injection 공격이 가능하다고 한다. 그럼 두 개 항목 중 공백이나 특수문자를 차례로 넣어봐 어느 곳에서 문자열로 공격 가능한지 확인해보자.


확인 결과 Login_count에 특수문자를 넣었을 때 number로 넣으라는 표시가 있기에 User_Id를 통해 공격을 해보자.

아래 나온 SQL문을 보면 User_Id도 '로 감싸지 않을걸로 봐서 '없이 공격을 진행해보면 User_Id에 or 1=1를 입력하면 다음과 같이 정보를 조회할 수 있게 된다.

이번 문제에서 숫자는 '로 감싸지 않아도 되기 때문에 123 or 1=1로 입력해도 이전과 같은 원리로 모든 정보가 조회된다.

3. 11번 문제: 기밀성 침해

이전 문제까지 기본적인 공격을 알아봤고, 이제부터 명확한 상황이 주어진 상황에서 정보보안의 3대 요소를 하나씩 침해해보자.

먼저 11번 문제를 보면 이름과 TAN이라는 값을 이용해 자신의 정보를 확인할 수 있는데 이를 이용해서 모든 정보를 조회해 보고 싶다고 한다.

주어진 쿼리를 보면 +'로 문자열을 이어붙인 형태이고 이는 이전 문제에서 Injection 취약점이 있는 것을 확인했다.

그럼 이전 문제와 같이 마지막 asdf' or '1'='1 를 넣어 조회할 수 있다.

하지만 여기서 --이 SQL문에서 어떤 역할을 하는지 확인해보자.

다음과 같이 Employee Name에 asdf' or 1=1 -- 넣으면 -- 뒤의 문장들은 주석처리가 되서 아무런 의미가 없는 문장이 되어 이전과 똑같은 효과를 볼 수 있다.

4. 12번 문제: 무결성 침해

이번에는 같은 상황에서 자신의 이름인 John Smith의 연봉을 최고로 올린고 싶다고 한다. 그럼 먼저 Smith의 연봉을 99999로 설정하기 위해 UPDATE문이 필요한데 다른 SQL문을 사용하기 위해서 앞의 쿼리를 끝낼 필요가 있다. 앞의 쿼리는 ;를 활용해 다음과 같이 끝내고 뒤에 다른 쿼리문을 작성할 수 있다.

asdf' ; update employees set SALARY=99999 where LAST_NAME='Smith' and AUTH_TAN='3SL99A' --

이 문장을 다음과 같이 넣어주면 연봉을 수정할 수 있게 된다. 이로서 무결성까지 침해해보았다.

5. 13번 문제: 가용성 침해

마지막으로 가용성 침해를 해보자. 이전에 연봉을 update문을 사용해 수정했던 내용이 access_log에 다음과 같이 기록에 남아 있는 것을 확인할 수 있다.

그럼 연봉을 수정했다는 증거를 없애기 위해 이 기록을 delete해보자. 이번에도 ;rhk --를 활용해 aaa' ; delete from access_log -- 와 같이 정보를 삭제할 수 있다.

이렇게 데이터를 삭제했지만 증거가 될만한 access_log까지 삭제하라고 한다. 이 역시 만찬가지 aa' ; drop table access_log -- 로 테이블 자체를 다음과 같이 삭제할 수 있다.

이로써 가용성 까지 기밀성, 무결성, 가용성 까지 모두 침해해보았다.

3. 정리

정보보안의 3대 요소
1. 기밀성: 오직 인가된 사람만이 필요성에 근거하여 시스템에 접근해야 한다는 원칙
2. 무결성: 정보는 고의적, 비인가된, 우연한 변경으로부터 보호되어야 한다는 원칙
3. 가용성: 정보는 사용자가 필요로 하는 시점에 접근 가능해야 한다는 원칙

우리는 이런 정보보안의 3대 요소를 다음과 같은 SQL에서는 다음과 같은 특수 문자를 사용해 침해할 수 있었다.
' : 문자열을 감싸는 역할
--: 뒤에 문장을 주석 처리하는 역할
;: 해당 쿼리를 끝내는 역할

그 외에도 SQL 문의 DML(select, insert, update, delete),DDL(create, alert, drop, truncate),DCL(grant, revoke, commit, rollback)의 사용 방법도 숙지한다면 다양의 공격에 대해 이해할 수 있을 것 같다.

profile
주주주주니어 개발자

0개의 댓글