이 블로그는 개인적인 공부 목적으로 정리한 내용입니다.
설명에 틀린 부분이 있을 수 있으며 잘못된 부분에 대한 지적은 언제나 환영입니다.
이번 포스팅에서는 인증 우회와 SQL Injection의 원리에 대해서 알아보겠습니다.
인증 우회는 무엇인가?
정상적인 인증 경로나 절차가 아닌 우회된 경로를 통해 인증을 거치지 않고 권한을 획득하거나 권한이 필요한 행위를 수행하는 보안 공격
인증 우회는 로그인같이 인증을 받아야 하는 절차를 무시하고 그 권한을 획득하는 것입니다.
인증 우회에는 여러 가지 방법이 있지만 그중에서 대표적으로 SQL Injection이 있습니다.
그럼 SQL Injection은 뭘까요?
SQL Injection
악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법
말 그대로 SQL문을 삽입하는 공격인데요. SQL이 뭔지 모르는 분들은 아래 SQL에 관한 글을 보고 와주세요.
2023.11.05 - [노말틱님 강의] - [노말틱님 강의 정리] 2주 차 SQL 기본문법
[노말틱님 강의 정리] 2주차 SQL 기본문법
이 블로그는 개인적인 공부 목적으로 정리한 내용입니다. 설명에 틀린 부분이 있을 수 있으며 잘못된 부분에 대한 지적은 언제나 환영입니다. 저번 데이터베이스에 이어 이번에는 관계형 데이
teng2.tistory.com
그럼 SQL문을 어떻게 삽입하는 걸까요?
로그인 페이지로 예를 들어보면
$inputID = $_POST['ID'];
$inputPASS = $_POST['PASS'];
$sql = "SELECT * FROM member WHERE user_id = '$inputID' AND user_pass = '$inputPASS'";
간단하게 로그인 페이지 코드를 작성해 보면 이런 구조일 겁니다.
input으로 받은 아이디와 비밀번호를 변수로 지정해서 sql문법에 넣는 거죠
그럼 여기서 저희가 건드릴 수 있는 부분은 어디일까요? 바로 변수 부분입니다.
저희가 입력한 아이디와 비밀번호가 변수에 저장되어 SQL문법으로 실행되기 때문에
아이디나 비밀번호에 로그인을 우회할 수 있을만한 SQL문을 삽입하는 겁니다.
이게 바로 SQL Injection의 핵심 원리입니다.
여기서는 어떤 SQL문을 넣어야 로그인이 우회가 가능할까요?
SQL문을 하나하나 뜯어보면 이렇습니다.
SELECT * FROM member
SELECT 즉, 조회합니다. * 모은 칼럼을 FROM member member라는 테이블에 있는
한마디로 member라는 테이블에 있는 모든 컬럼을 조회한다. 이런 뜻입니다.
WHERE user_id = '$inputID' AND user_pass = '$inputPASS'
member에 있는 모든 데이터를 조회하는 게 아니라
WHERE user_id = '$inputID' user_id라는 칼럼에 있는 값이 $inputID에 있는 변수와 같은 것을
AND user_pass = '$inputPASS' 그리고 user_pass에 있는 값이 $inputPASS에 있는 변수가 같은 것
그러니깐 아이디와 비밀번호 전부 참이여야지 조회되는 쿼리입니다.
반대로 말하면 무조건 참일 수밖에 없는 쿼리를 넣으면 조회된다는 뜻입니다.
무조건 참일 수 밖에 없는 건 어떤 게 있을까요? 정말 많지만 가장 쉬운 거 하나만 얘기해 보자면 1=1입니다.
1=1 너무나도 당연히 맞는 말이죠 그럼 이걸 이용해서 어떻게 SQL Injection을 할 수 있을까요?
아이디 부분에 이렇게 넣는 겁니다.
admin' OR '1'='1' #
아이디에 이렇게 넣었을 때 SQL문이 어떻게 되는지 한번 볼까요?
SELECT * FROM member WHERE user_id = 'admin' OR '1'='1' #' AND user_pass = '$inputPASS'
그전에 코드는 아이디 AND 비밀번호 그러니깐 아이디와 비밀번호 두 개다 만족했을 때 로그인이 가능했습니다.
그런데 아이디 부분에 admin' OR '1'='1' #을 넣으니깐
아이디가 admin OR 1=1 이렇게 바뀌게 되었네요 OR은 둘 중 하나만 만족해도 참입니다.
그럼 뒤에 AND와 비밀번호 부분은 어떻게 되는 거냐면 SQL에서 #과 --는 주석입니다.
#뒤에 문자는 아무 의미 없어지게 되는 거죠 그럼 아이디가 admin이 없어도 1=1이 참이 되게 되니깐
저 sql문은 참이 되고 로그인에 성공하게 되는 겁니다.
여기까지가 SQL Injection의 원리였고 제가 구현한 로그인 페이지에서 직접 확인해 보겠습니다.

구현을 위해 만든 로그인페이지고요 보시는 것처럼 SQL Injection 공격을 시도해 보겠습니다.

짠! 비밀번호를 입력하지 않아도 로그인에 성공한 걸 볼 수 있습니다!
왜 abc로 로그인 되었냐면 제가 짠 코드는 데이터베이스 제일 상단에 있는 정보를 조회하게 만들었기 때문이에요.
이건 코드를 어떻게 짜냐에 따라서 다르겠죠?
이번 포스팅에서는 SQL Injection을 통해 인증을 우회하는 방법에 대해서 알아봤습니다.
이건 SQL Injection의 원리를 설명하기 위해 취약하게 만든 로그인 페이지에 공격을 해서 가능했던 거고
실제로는 이 정도로 취약한 페이지는 거의 없다고 보시면 됩니다!
'모의해킹' 카테고리의 다른 글
| DB랑 업&다운게임? Blind SQL Injection (0) | 2023.12.09 |
|---|---|
| Error를 이용해서 데이터 탈취! Error Based SQL Injection (2) | 2023.12.08 |
| Normaltic님의 SQL Injection 2번 CTF 문제풀이 (4) | 2023.12.07 |
| Normaltic님의 SQL Injection 1번 CTF 문제풀이 (0) | 2023.12.06 |
| 데이터 추출! UNION SQL Injection 공격 (4) | 2023.12.03 |