One_Blog

SQL Injection - Error Based SQL Injection 본문

웹해킹

SQL Injection - Error Based SQL Injection

0xOne 2022. 10. 30. 20:57
728x90

오늘 알아볼 SQLI는 뭘까용~?

아하! Error Based SQLi로구나!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ㅈㅅ

 

오늘 알아볼 SQL Injection 기법은 Error Based SQL Injecetion(이하 EB SQLI로 칭함) 이다.

 

해당 기법은 직접 DB로부터 데이터를 추출한다기보단,

서버에서 사용하는 DB에 대한 정보를 얻기 위해 사용하는 기법이다.

 

서버 SQL 쿼리문을 문법적으로는 오류가 없지만,

논리적으로 오류가 발생하는 쿼리문으로 만들어

서버에서 사용하는 DB에 관한 정보를 뱉어내도록 만드는 거다.

 

EB SQLI는 다음과 같은 순서로 이루어진다.

1. Error 메시지 확인

2. Error 출력 활용 함수 선정

3. DB이름 확인

4. 테이블 이름 확인

5. 칼럼 이름 확인

6. 데이터 추출

 

사실상 EB SQLI는 5번까지고, 6번은 모아놓은 DB에 대한 정보를 토대로

서버에 SQL Injection을 하면 된다.

 

자 그럼 EB SQLI에 대해 알아보도록 하자.

 

 

1. Error 메시지 확인

사용자 입력란에 '나 "같은 따옴표를 입력해준다.

해당 입력에 대해 DB가 

이러한 오류나 이러한 오류와 비슷한 오류를 뱉어낸다면, SQL Injection이 가능한 

취약점이 존재한다는 뜻이다.

저런 오류를 뱉어내지 않는다면, 서버 자체에서 '나 "를 필터링 했다는 뜻이니

다른 방법을 찾아보길 바란다.

 

아니면 서버에서 DB에 대한 정보를 수집하지 못하도록

SQL 에러가 서버에 출력되지 않도록 설계된 것일 수도 있다.

 

어찌됐건, 저런 오류가 출력되어야 앞으로의 과정을 실행할 수 있다.

 

2번. Error 출력 활용 함수 선정

SQL Injection이 가능한 것을 확인했다면,

DB에 대한 정보를 탈취하기 위해 사용할 함수를 선정해줘야 한다.

필자의 경우에는 UPDATEXML 구문을 활용하였다.

 

 

3번. DB이름 확인하기

서버에서 사용되는 DB의 이름을 알아내는 과정이다.

필자가 사용한 함수는 UPDATEXML으로,

사용자의 입력란에

' and updatexml(null,concat(0x3a,(select database())),null) and '1'='1

와 같은 구문을 넣어줌으로써, DB에 대한 정보를 출력받을 수 있었다.

DB이름 : sqli_2

 

4번. Table 이름 확인하기

서버에서 사용하는 Table의 이름을 알아내는 과정이다.

사용자의 입력란에

1' and updatexml(null,concat(0x3a(select table_name from information_schema.tables WHERE table_schema = 'sqli_2' limit 1, 1)),null) and '1'='1

와 같은 구문을 넣어줌으로써, Table에 대한 정보를 출력받을 수 있었다.

테이블 이름 : member

5. 칼럼 이름 확인하기

서버에서 사용하는 칼럼의 이름을 알아내는 과정이다.

사용자의 입력란에 

' and updatexml(null,concat(0x3a(select column_name from information_schema.columns WHERE table_schema = 'sqli_2' limit 1, 1)),null) and '1'='1

와 같은 구문을 넣어줌으로써 칼럼 이름인 id를 확인할 수 있다.

 

6. 데이터 추출

지금까지 우리가 수집한 정보를 바탕으로 SQL Injection을 하면 된다.

 

틀린 정보가 있다면 댓글로 알려주세요.

글 읽어주셔서 감사합니다 :)