본문 바로가기
모의해킹

Error를 이용해서 데이터 탈취! Error Based SQL Injection

by 러브러브뿅뿅 2023. 12. 8.
728x90

이 블로그는 개인적인 공부 목적으로 정리한 내용입니다.

설명에 틀린 부분이 있을 수 있으며 잘못된 부분에 대한 지적은 언제나 환영입니다.


이번엔 UNION SQLi에 이어서 에러를 기반으로 공격하는

Error Based SQL Injection에 대해서 알아보겠습니다.

 

Error Based SQL Injection

 

말 그대로 오류를 기반으로 SQL Injection 공격을 하는 해킹기법입니다.

그렇다면 Error Based SQL Injection은 어떨 때 사용할 수 있을까요?

 

SQL 질의 결과가 우리가 보는 화면에 출력이 된다. -> UNION SQL Injection

Error가 출력된다. -> Error Based SQL Injection

이렇게 생각하시면 될거같습니다.

 

쉽게 말해 웹개발을 하는 과정에서 개발자가 디버깅을 하기 위한 목적으로

또는 운영 중 오류가 났을 때 어떤 오류인지 확인하고 대응하기 위한 목적으로

개발자가 에러메시지가 표시되게 만드는 경우가 있는데요.

 

이럴 때 그 에러메시지에 SQL 질의를 넣어서 원하는 데이터를 추출하는 방법입니다.

Error Based SQL Injection을 하기 위해서는 일부러 오류가 나게 해야 하기 때문에

데이터베이스 종류마다 하는 방법이 다릅니다.

 

이번 포스팅에서는 MySQL 기준으로 다뤄보고 MSSQL과 오라클에 대해서는 차차 다뤄보도록 하겠습니다.

노말틱님께서 감사하게 Error Based SQLi를 실습해 볼 수 있는 사이트를 제공해 주셨기에

직접 한번 해보겠습니다.

 

ID 중복 검사가 가능한 사이트입니다.

UNION SQLi를 할 때와 달리 데이터가 존재하지 않고

이렇게 아이디가 존재합니다. 존재하지 않습니다.라는 문구만 나옵니다.

 

작은따옴표를 써보니 "SQL 문구에 에러가 있습니다" 하고 에러 메시지가 뜨는 걸 확인할 수 있습니다.

저는 EXTRACTVALUE라는 함수를 사용해서 일부러 오류를 내고 그 안에 SQL 질의문을 넣서 데이터를 추출해 보겠습니다.

 

EXTRACTVALUE함수는 XML 문서에서 XPath 쿼리를 사용하여 데이터를 추출하는 데에 쓰입니다.

좀 더 쉽게 얘기하면 특정 XML문서 전체가 XML문서 중 원하는 위치에 특정 데이터만 가져오고 싶을 때 사용할 수 있습니다.

EXTRACTVALUE(xml_frag, xpath_expr) 이렇게 두 가지 인수가 들어가는데

두 번째 인수에 올바르지 않은 표현식을 넣으면 오류가 발생합니다. 대표적으로 콜론(:)이 있습니다.

 

이렇게 직접 extractvalue를 넣고 두 번째 인수에 콜론과 함께 test를 넣어보니

그대로 test는 올바른 표현식이 아니다 라는 문구가 나오게 됩니다.

 

여기서 중요한 건 저렇게 전체적인 문법에 맞지만 extractvalue안에 두 번째 인수부분 그러니깐 Xpath부분만

오류가 나야 합니다. 저상태에서 :select ~ 이런 식으로 바로 SQL 질의문을 넣게 되면 :select이란건 없으니깐

문법오류가 나겠죠? 그래서 concat이라는 함수를 사용할 거예요

 

concat(hello, world) 이렇게 사용하면 출력값이 helloworld가 되는 함수입니다.

두 개를 합쳐줘요 그래서 첫 번째 인수에는 콜론(:)의 16진수인 0x3a를 넣을 거고요(직접 콜론(:)을 넣으면 문법 오류가 생깁니다.)

두 번째 인수에는 sql 질의문을 넣어서 원하는 데이터를 출력해 보겠습니다.

 

normaltic' and extractvalue(1, concat(0x3a,(select pass from member where id = 'normaltic'))) and '1'='1

 

위와 같이 normaltic아이디의 비밀번호를 출력해 달라는 쿼리를 입력했고요 결과는

이렇게 비밀번호가 출력되었습니다. 

 


이번엔 SQLi공격 기법 중 하나인 Error Based SQL Injection에 대해서 알아봤는데요

저도 공부하면서 많이 헷갈리더라고요 concat은 왜 써야 하고 콜론이 아니고 0x3a를 넣어야 하며 등등

이해 안 되는 부분이 많았는데 직접 concat을 쓰지 않고 해보기도 하고 0x3a대신 콜론도 넣어보고 하니

어디서 문법오류가 생기는지 어느 정도는 이해가 가더라고요 공부하면 할수록 어려운 거 같습니다.

다음에는 Blind SQL Injection에 대해서 알아보겠습니다.

728x90