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(GET)- 본문

정보보안/BWAPP Bee-box

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

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

Union Base SQL Injection

 

 

SQL INJECTIONN

SQL INJECTION은사용자가 입력한 값을 서버에서 검증하지 않고 데이터베이스 쿼리 일부분

으로 인식하여 데이터베이스의 정보가 노출되거나 인증이 우회되는 취약점이다.

 

SQL INECTION은 사용자가 데이터를 입력할 수 있는 곳 어디에서든 발생할수 있고, 이를 통

하여 공격자는 SQL 쿼리를 변수에 입력하여 데이터베이스 정보를 획득하거나 시스템 내부를

파악한다.

Union Base SQL Injection 은 SQL Injection의 여러 종류 중 한 가지이다.

Union Base SQL Injection 은 Union 구문을 적극 활용하여 쿼리문을 삽입하는 공격이다.

Union 은 두개의 select 문을 사용하여 검색하고 하나의 결과로 출력하는 함수이다

이 Union 함수의 특성을 이용하여 공격을 진행해보곘다.

 

 

SQLI_1.php 페이지는 영화 제목을 검색하고 데이터베이스에서 조회한 결과를 보여준다.

검색란에 작은따옴표(‘)를 입력하여 SQL INJECTION이 가능한지 알아본다 변수에 SQL인젝

션 취약점이 존재하는 경우 SQL오류 메시지를 출력한다.

 

작은따옴표를 입력하는 이유는 데이터베이스에서 작은따옴표로 문자 데이터를 구분하기 때

문이다. 따라서 취약점이 존재할 때 작은따옴표를 입력하면 웹 서버에서 데이터베이스 서버

에 질의하는 쿼리에 문법 오류가 발생한다.

 

 

오류 메시지에는 데이터베이스 서버 정보가 포함되는데, 데이터베이스 서버의 종류에 따라

SQL 구문이 다르므로 가장 먼저 서버 정보를 확인한다. Sqli_1.php페이지의 검색란에 작은 따

옴표를 검색하면 다음과 같이 사용중인 데이터베이스 서버가 ‘My SQL’이라는 정보를 출력한

다.

 

쿼리를 입력하여 어떤 주석 문자를 사용하는지 알아본다. ‘ or 1=1’ 이라는 쿼리

는 앞 쿼리의 내용과는 상관없이 ‘1=1’이 참이므로 결과를 항상 참으로 만드는 쿼리이다.

따라서 데이터베이스에서 사용하는 주석 문자가 일치하면 웹 페이지에서 요청하는 기존 쿼

리를 주석 처리하고 주입한 쿼리가 항상 참이기 때문에 정상 쿼리로 인식한다.

 

 

첫번째 쿼리를 입력하면 SQL 구문 오류 메시지가 나타나고 두 번째 쿼리를 입력하면 검색 내

용과는 상관없이 쿼리가 항상 참이므로 모든 영화 자료가 출력된다 따라서 주석 문자는 #을

사용한다.

더 자세한 정보를 알아내기 위하여 “UNION SELECT” 구문을 사용한다 ‘UNION’은 SELECT문

이 둘 이상일 때 이를 결합하여 두 질의의 결과를 하나로 변환한다. Sql_1.php페이지에는 데이

터베이스의 내용을 파악하려면 둘 이상의 SELECT문을 결합하는 ‘UNION‘ 구문이 필요하다.

 

이런 “UNION SELECT” 구문을 사용하여 SQL인젝션을 시도하는 공격 유형을 ‘‘UNION Based S

QL인젝션‘‘ 이라고 한다.

 

 

UNION 구문을 사용하려면 이전 쿼리에서 사용하는 SELECT 문의 칼럼 수가 일치해야 한다.

이는 두 질의의 결과를 하나의 테이블로 합치기 때문이다. 칼럼을 하나만 추가할 경우 칼럼

수가 일치하지 않는다는 오류 메시지가 나타나고, 오류 메시지가 나오지 않을때까지 칼럼 수

를 늘려 페이지의 결과가 참이 되는지 확인한다.

 

 

이전의 SELECT쿼리문의 칼럼 수가 맞지 않아 Syntax Error가 난것이다 이 정

보를 이용하여 현재 테이블의 칼럼 개수를 알아낼것이다.

 

 

기존 쿼리에서 사용하는 칼럼 수와 일치하므로 해당 쿼리가 참이 되어 검색 가능한 모든

영화 제목을 테이블에 출력한다.

 

 

현재 데이터베이스가 출력한 내용이다 입력한 임의의 정수 1,2,3,4,5,6,7 순서로 삽입하였을

때 사용자에게 출력되는 부분이 2,3,5,4 번임을 확인할수 있다. 이부분의 칼럼명이 무었인지

는 모르지만 이것을 이용하여 2,3,54,번 컬럼에 원하는 내장함수,컬럼명을 입력하여 정보를

알아낸다.

 

 

MySQL버전이 5.0 이상일 경우 이전 버전과 쿼리가 달라지므로 MySQL 버전을 확인하기 위

하여 시스템 변수나 시스템 함수를 활용하여 퀄를 입력한다.

 

 

MySQL 이름 테이블 정보에 데이터베이스 정보 노출

이 외에도 사용할 수 있는 시스템 변수는 다양하다. 그중에서 SQL INJECTION으로 데이터베

이스의 정보를 파악할 수 있는 변수와 함수는 다음과 같다.

 

1. database() : 데이터베이스 명을 알려주는 함수

2. user() : 현재 사용자의 아이디

3. system_user() : 최고 권한 사용자 아이디

4. @@version() : 데이터베이스 서버의 버전

5.@@datadir() : 데이터베이스 서버거 존재하는 디렉터리

 

비박스에서 사용 중인 MySQL 버전이 5.0이상이므로 테이블 명을 확인하려면 Information_sch

Ma를 사용하여 쿼리를 입력해야 한다.

 

 

SQL INJECTION 결과 데이터베이스 서버에 존재하는 모든 테이블 명을 출력한다.

출력된 테이블 명 중 USERS 테이블이 있다 따라서 USERS 테이블에 사용자 계정 정보가

들어있다고 추측할수 있다. 따라서 USERS 테이블의 칼럼명을 알아내기 위해 WHERE절로

USERS 테이블 정보만 출력하게 조건을 지정한 다음 쿼리를 입력한다

 

 

SQL INJECTION 결과 USERS 테이블의 칼럼 명을 출력한다. 컬럼명으로 id와 login , password

등이 있는데, 칼럼 명은 계정 정보와 관련 있으므로 users 테이블에 사용자 계정 정보가 있

을 가능성이 높다.

 

 

칼럼 내용을 확인하려면 페이지에 노출되는 칼럼 순서에 맞춰 확인하고 싶ㅍ은 칼럼명을 입

력한다. 페이지에 노출된 칼럼 수보다 확인하려는 칼럼 수가 많을때는 concat 함수를 사용하

여 칼럼 명을 인자로 입력하면 여러 칼럼의 내용을 볼 수 있다.

 

 

SQL INJECTION 후 웹 브라우저에서 데이터베이스에 저장된 users칼럼의 내용을 출력한다.

id칼럼에는 회원 순서,login칼럼에는 아이디, password 칼럼에는 비밀번호의 해시값을 각각

저장한다.

 

여기까지 알아낸 사용자의 계정정보로 2차 공격을 시도할 수 있다. 해시 값으로 변환된 비

밀번호를 평문으로 변환하여 사용자 계정을 탈취한다. 현재 bee-box는 SHA-1해시 알고리즘

을 사용하고 있다.

 

 

해시함수(hash function) 는 임의의 길이의 데이터를 고정된 길의의 데이터로 매핑하는 함수

이다. 해시의 용도중 하나는 해시 테이블이라는 자료구조에서 사용되며, 매우 빠른 데이터

검색을 위한 컴퓨터 소프트웨어에 널리 사용된다. 또 다른 용도중 하나는 암호용 해시 함

수로 사용된다 또한 암호학에서도 사용될수 있다. 암호용 해시 함수는 매핑된 해싱 값만을

알아가지고는 원래 입력 값을 알아내기가 힘들다는 사실에 의해 사용된다 또한 무결성 검

사 에도 사용이 되고있다.

Bee-box는 SHA-1해시 알고리즘을 사용하고 있으므로 존 더 리퍼를 이용하여 평문으로 복

호화를 함으로써 2차 공격을 시도 하겠다.

존 더 리퍼를 사용하기 전 다음과 같이 비밀번호 해시값이 저장될 텍스트 파일을 만든다.

 

 

만들어 놓은 텍스트 파일에 SQL INJECTION 결과로 얻은 비밀번호 해시 값을 텍스트로 저

장한다.

 

 

존 더 리퍼는 초당 100만번 이상의 해시 크랙을 할수 있고 , 레인보우 테이블

사전 공격을 이용하는 Bruet Force Attack 자동화 툴이다, 존 더 리퍼로 해시값을 평문으로

복호화 하였다 평문은 ‘bug’ 인 것을 알수 있다.

 

이렇게 Eroor Base SQL INJECTION 을 통해 테이블명,칼럼명,VALUE(사용자의 패스워드) 까

지 모두 추출하였다.

1-1 SQL INJECTION 공격 (난이도 중)

중으로 단계를 올리고 페이지의 SQL 인젝션 취약점 여부를 확인한다.

 

 

싱글쿼터(‘)를 입력하여도 오류 메시지가 나오지 않으면 Eroor Base SQL INJECTION 이 불가

능 하다. Sqli_1.php페이지의 소스 코드로 보면 ‘난이도 하’ 와는 달리 입력 데이터를 sqli_ch

eck_2 함수로 우회하고 있다.

 

 

Sqli_check_2함수는 function_externnal.php에 정의되어 있고, PHP 기본 제공 함수인 mysql_real_

escape_string함수를 사용하여 입력한 mysql_real_escape_string함수는 사용자 입력 값에 SQL문

법에서 사용하는 특수 문자가 있을 경우 백슬래시를 붙여 입력 데이터를 SQL문법으로 인식

하지 않게 방어한다. 여기서 우회하는 문자는 ‘NULL,\n,\r,\,’,”,이므로 싱글쿼터(‘)를 입력하면

백슬래시가 붙어 SQL쿼리로 인식하지 않는다.