SQL Injection 공격

상곤·2025년 8월 10일

SQL

목록 보기
5/5
post-thumbnail

코드를 대충 짜 놓으면
SQL Injection 공격을 당할 수도 있으니 조심하자

SQL Injection 공격이 뭔데?

먼저, SQL Injection 공격이 뭔지 알아보자

백문이 불여일견

직접 사이트를 하나 털어보도록 하자!

물론 실제 사이트에다가 하면 범죄다

그래서 IQ 추적을 당해서 경찰서에 갈 수도 있으니 하지 않기로 하자

이 사이트는 해킹해볼 수 있게 만든 가짜 뱅킹 사이트이다.

평소에 아이디 비번이 잘못입력되면 이런 화면이 뜬다.

그런데, 아이디에 따옴표(')를 같이 입력하는 순간,
에러 메세지가 바뀌게 된다.

왜 이런 오류가 뜨냐면

우리가 로그인을 하려면 서버 컴퓨터의 DB에서
입력한 유저의 ID와 비번을 조회하게 된다.

그럴 때, 관계형 DB(RDB)를 쓰는 경우라면
개발자들은 이런 SQL 코드를 작성할 것이다

이 코드가 뭐냐면
id와 pw가 일치하는 모든 것을 찾아와라!
라는 명령을 수행하게 하는 코드다.

자 그런데 유저가 id 입력란에 이렇게 따옴표를 입력하게 된다면

'는 SQL 문법의 일부이기 때문에 심각한 문법 오류가 발생하게 된다.
그래서 에러 메세지도 달라지게 된다.

앞으로 서버를 만들 때 이렇게 에러 메세지도 너무 자세하게 작성하면
해커에게 도움이 되니까 주의하자!

아무튼 원래로 돌아와서
이러한 에러 메세지를 발견하면
입력에 SQL 문법을 집어넣을 수 있다는 뜻이다

그래서 우리는 이것을 이용해서
강제 로그인도 가능하고,
DB 테이블 전체를 출력할 수도 있다.

과거 SSAFY 강사님은 교내 DB를 털어서
수강 신청을 강제로 해버린 적이 있다고 하셨는데,
아마 이런 방식을 사용하지 않았을까..

심지어는 DB 삭제와 같은 테러 행위도 가능하다..!

강제 로그인

먼저 강제 로그인이 되는지 한 번 해보자

우선 등록돼 있는 아이디 하나를 먼저 찾아볼 것이다

보통 서버를 만들어서 테스트할 때,
tuser와 같은 아이디를 많이 사용하기 때문에
우리도 tuser로 해킹해볼 것이다

입력을 이렇게 해보자
그러면 어떻게 될까?

이렇게 따옴표 뒷 부분은 모두 주석 처리가 된다

그래서 우리는 실제로 이러한 SQL 문을 날린 것과 같다

그래서 우리는 id만 일치한다면,
로그인을 시켜주는 코드가 완성된 것이다

그 결과!

이러한 화면을 마주할 수 있다

admin 권한 탈취

이렇게도 할 수 있다

이게 뭐냐면

우리는 이러한 코드를 작성한 것과 같다

이게 무슨 뜻이냐면

user_info 테이블에서
id가 일치하거나 아니면
1=1을 만족하는 모든 행을 출력해주세요
라는 의미다

당연하게도 1=1은 항상 True이기 때문에
user_info 테이블의 모든 행이 출력될 것이다

아마 그렇다면 서버는 그 중에서 제일 위에 있는 행을 사용하게 될 것이다

db에서 맨 위에 있는 행이라면 아마 admin 계정일 가능성이 높다

짜잔!

실제로 admin user로 로그인된 화면을 마주할 수 있다

관리 계정을 털었으니 이제 내 계정으로 천만 달러 정도 보내주면 되겠다💰

테이블 출력

이번엔 UNION SELECT문법을 사용해서 다른 테이블의 내용을 출력해보자

이 사이트는 URL 뒤에다가 작가 번호를 입력하면 작가의 소개글을 DB에서 꺼내서 보여준다

자 그런데,
URL에 정상적인 작가 번호가 아닌
SQL 문법을 입력한다면 어떻게 될까

이렇게 UNION SELECT문을 입력해보자

이게 뭐냐면 SQL문을 두 개를 이어붙여서 출력해달라는 SQL 문이다

그리고 SELECT 절에는 컬럼 개수를 맞춰주기위해 노가다를 해야한다

그 결과 이렇게 유저 설명이 적혀있어야 할 위치에
유저 아이디와 비번이 이렇게 잘 나오게 된다

실제로 로그인을 해보면

잘 나오는 것을 확인할 수 있다

예방법

SQL Injection을 막을 수 있는 가장 간단한 방법이 있는데

테토남처럼 DB를 쓰지 않고, URL에 모든 정보를 때려 박아서 투명하게 공개하면 된다

물론 실제로 그런 사람은 없고💦

가장 쉬운 해결책은 parameterized query를 쓰는 건데,
유저가 입력한 값을 sql 쿼리문에 집어넣어야 할 경우
이런 식으로 안전하게 변환하기 때문에
Injection 공격에 노출될 위험이 거의 없다

procedure문법을 쓰는 경우도 있는데
이건 코드가 길어지기 때문에 조금 귀찮고

ORM을 쓰는 사람도 있다
ORM은 SQL을 대신 짜주는 라이브러리 같은 건데
ORM 문법에 맞춰서 잘 갖다 쓴다면
충분히 Injection 공격을 예방할 수 있다

아니면 Injection에 자주 쓰이는 특수 문자들이 있는데,
그것들을 미리 걸러주도록 필터를 설정한다면 충분히 예방할 수 있다

결론

간혹가다 이렇게 해킹 사건이 보도 되는 경우가 있는데

진짜로 하다가는 경찰한테 쫓기게 된다

해킹을 배워 본 이유는
어떻게 뚫리는지 알아야 방어가 가능하기 때문이다!
고생하셨습니다!

profile
🫠

0개의 댓글