Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Hello Security World

[Web Hacking] Bee - Box -Union Base SQL Injection(POST)- 본문

정보보안/BWAPP Bee-box

[Web Hacking] Bee - Box -Union Base SQL Injection(POST)-

프로앱등이 2020. 5. 3. 18:10

Union Base SQL Injection

1-2 SQL INJECTION 공격 POST (난이도 하)

‘Sqli_6.php’ 페이지는 POST 메서드로 HTTP 연결 요청을 보내고 있어서 sqli_1.php 페이지와

는 다르게 URL에 변수가 나타나지 않는다. 그러나 sqli_1.php와 마찬가지로 검색란에 사용

되는 movie 변수가 취약하므로 검색란에 SQL쿼리를 입력하면 취약점 여부를 확인할수 있다.

 

이번에는 프락시 도구로 변수를 확인하고 SQL 인젝션을 시도한다. 프록시 도구로는 버프스

위트를 사용한다. 버프스위트에서 [intercept is on]이 활성화되어 있으면 Raw 탭 내용에서 공

격을 시도할 변수를 찾거나 HTTP요청 헤더 밑에 실리는 body에서 변수를 찾는다. Body에

실린 ‘title’과 ‘action’변수 둘 다에 SQL인젝션 공격을 시도해 보자.

 

 

작음따옴표를 입력하면 결과를 항상 참으로 만드는 쿼리를 입력하여도 SQL구문 오류가 발

생하기 때문에 작은따옴표를 사용하지 않고 SQL 인젝션 공격을 위하여 기존 쿼리와 결합하

여 결과를 출력하는 UNION SELECT 구문을 사용한다. 따라서 기존 쿼리에서 사용하는 칼럼

수를 찾아 movie 변수에 주입할 쿼리의 칼럼 수와 맞춘다.

 

 

버프스위트로 movie변수에 조작한 SQL인젝션 구문을 입력한다. 이때 실제 사용하는 변수를

넣으면 표에는 그 값에 해당하는 데이터가 나오기 때문에 사용하지 않는 숫자 값을 넣어야

한다.

Movie 변수는 숫자형으로 선언되어 있는 칼럼이다 따라서 문자를 입력할경우 오류를 발생시

킨다.

 

 

조작한 SQL구문을 버프위트로 잡아서 movie변수에 삽입한다.

 

 

조작한 SQL구문의 결과로 웹 어플리케이션의 데이터베이스 명과 데이터베이스 서버 버전,서

버에서 MySQL 이 위치한 경로를 출력한다.

 

 

사용자의 호스트 이름,사용자 이름과 비밀번호를 출력하는 SQL구문을 입력한다.

 

 

인젝션 결과가 페이지에 보인다. ‘mysql’ 테이블의 호스트 이름과 사용자 이름,비밀번호의 해

시 값을 출력한다. 원래는 모든 사용자의 정보가 보이지만 sqli_13.php페이지는 결과값을 하

나만 출력하기 때문에 처음에 저장된 정보만 보인다.

 

 

테이블 명을 파악하기 위하여 다음과 같은 SQL구문을 movie변수에 삽입한다. 현재 데이터베

이스 서버 버전이 5.0 이상이기 때문에 다음과 같이 information_schema로 데이터베이스에 저

장된 테이블을 파악한다. Where 절로 기본 제공되는 information_schema와 mysql을 제외하고

사용자가 지정한 스키마만 출력하도록 조건을 넣는다.

 

 

SQL 인젝션 결과 , 데이터베이스의 테이블 스키마와 테이블 명 , 칼럼 명이 출력된다.

SQL map

 

 

수동으로 확인할 수 있는 정보가 적기 때문에 SQL인젝션 자동화 도구인 sqlmap 을 사용하

여 데이터베이스와 테이블 명을 알아본다. 위와 같이 칼리 리눅스에서 콘솔에서 sqlm

ap 명령어를 실행하면 된다.

 

 

-u 옵션에 자동화 공격을 시도할 페이지의 주소를 입력하고, POST 메소드를 이용 하고 있기

때문에 –data 옵션을 사용하여 SQL 인젝션 을 시도할 변수를 명시한다. 또한, bwapp는 로그인

후 사용이 가능하기 때문에 –cookie 옵션으로 쿠키 값을 입력해야 변수에 대한 자동 인젝션

기능이 수행된다. 쿠키 값은 버프스위트로 알 수 있으며 HTTP연결 요청 헤더 중 ‘cookie’

변수의 내용이다.

데이터베이스를 알아낼 때 취약한 파라미터가 movie뿐이므로 –p 옵션에서 SQL인젝션을 시도

할 변수를 movie로 지정한다. 또한, 테이블명을 알아보기 위하여 --DBs옵션 대신 –tables 옵션

을 넣어 다음과 같이 sqlmap사용 명령어를 입력한다.

 

 

sqlmap 사용 결과로 모든 데이터베이스의 테이블 명을 출력하지만, sqli_13.php페이지의 데이

터베이스는 bWAPP이므로 bWAPP 데이터베이스의 테이블 명만 확인한다. movie 변수에는 현

재 페이지에서 사용하는 정보, users 테이블에는 사용자 정보가 저장되어 있다고 추측된다.

 

 

이번에는 users 테이블의 칼럼을 확인하기 위해 sqlmap 사용 명령어를 입력한다. 테이블 명

을 알기 위하여 사용한 –tables 옵션 대신 --columns옵션을 사용한다.

 

 

sqlmap 결과로 현재 데이터베이스의 테이블에 있는 칼럼 명을 출력한다. 사용자의 계정 정보

가 있다고 추측한 users테이블의 칼럼 명을 확인한다. 칼럼 명은 사용자의 계정 정보와 관련

있는 ‘id , login , password’이다.

 

sqlmap에서 알아낸 정보를 조합하여 수동으로 UNION SELECT 구문을 입력한다. 테이블은 us

ers로 지정하고 노출되는 칼럼 순서에 내용을 알고 싶은 칼럼 명을 입력한다.

 

 

movie 변수에 쿼리를 입력하고 버프스위트에서 [Forward] 버튼을 클릭한다.

 

 

union 쿼리문을 이용하여 노출된 데이터베이스의 내용이다. 관리자의 이메일과 해시화된 비

밀번호가 노출되었다.

1-2 SQL INJECTION 공격 POST (난이도 상)

 

 

(난이도 상) 에서 제시한 대응방안을 살펴보자. movie변수에 UNION SELECT구문을 입력하여

도 SQL구문 오류 메시지가 아닌 영화를 찾을 수 없다는 메시지를 출력하고, 난이도 하와는

다르게sqli_13.php페이지가아닌‘sqli_13-ps.php’페이지다.

 

 

movie 변수에 입력한 숫자 값이 id 변수에 들어가는데, id변수는 recordset에 저장된 데이터베

이스 내용의 순서 번호를 뜻한다. bind_param함수를 사용하여 데이터베이스에서 사용하는 변

수들을 불러오고 execute 함수로 쿼리를 실행한다. 그다음 bine_result함수로 각 변수를 연결하

고 sotre_result 함수로 쿼리 결과를 저장한다.