Hacking_study/해킹과제

UNION SQL injection

jin_li 2023. 4. 21. 00:20
SQLi 데이터 추출

sql 질의문의 결과가 화면 상에 출력되는 경우와,
화면 상에 출력되지 않는 경우는 다른 방식으로 SQLi 공격을 해야한다.

 

 

 

 

sql 질의문 결과가 화면에 출력 되는 경우 : UNION sqli 공격

 

 

step 1. 공격 서버의 쿼리문 추리

 

select ???? from ???? where ???? 까지 추리하는 건 어렵지 않다.

 

 

 

step 2. 취약점 확인

 

간단한 and 문 (ex) and '1'='1  을 넣어서, sqli 공격을 가늠한다.

 

 

 

 

step 3. 컬럼(column)개수 확인

 

union문을 쓰려면 union문 양 옆의 select문의 컬럼 개수가 같아야 한다.

 

이를 위해 order by 구문을 활용한다.

만약 order by 1, order by 2 입력했을 때는 정상 출력되고, order by 3을 입력했을 때 에러 뜬다면 해당 데이터가 속한 컬럼은 2개라는 뜻이다. 

 

오른쪽은 watch%' order by 5 # 를 입력했을 때. 컬럼 개수가 4라는 걸 알 수 있다.

 

 

 

 

step 4. data 출력 위치 파악하기

 

화면에 출력되는 데이터가 몇 번째인지 파악한다.

위에서 컬럼 개수를 알았으니 union select '1', '2', (...컬럼 개수만큼) 넣으면 쉽게 알 수 있다.

2, 3, 4 위치의 데이터가 출력되고 있다.

 

 

 

 

step 5. 데이터베이스 이름 확인

 

select database() 를 이용한다. 이때 위에서 알게 된 데이터 출력 위치에 맞게 넣으면 된다.

현재 사용중인 db는 segfault_sql

 

 

 

 

 

step 6. 테이블 이름 확인

 

다음 구문을 이용한다.

select table_name from information_schema.tables where table_schema = '데이터베이스 이름'

 

따라서 아래의 예시는 

watch%' union select '1',table_name,'3','4' from information_schema.tables where table_schema = 'segfault_sql' #

을 입력했을 때 화면이다.

 

game, member, secret 세 개의 테이블이 있다.

 

 

 

 

 

step 7. 컬럼 이름 확인

 

다음 구문을 이용한다.

select column_name from information_schema.columns where table_name='테이블 이름'

 

아래의 예시는

watch%' union select '1',column_name,'3','4' from information_schema.columns where table_name='secret' #

을 입력해서 secret 테이블의 컬럼을 출력한 화면이다.

 

 

 

 

step 8. data 추출

 

이제 원하는 데이터를 select를 이용하여 추출하면 된다.