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 -Blind SQL Injection- 본문

정보보안/BWAPP Bee-box

[Web Hacking] Bee - Box -Blind SQL Injection-

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

Blind SQL Injection

 

 

Blind SQL INJECTION 쿼리의 결과를거짓으로만 출력하는 페이지에서 사용하는

공격이다. 출력 내용이거짓밖에 없어서 데이터베이스의 내용을 추측하여 쿼리를

조작한다

SQL Injection 을 할때 우리가 알아 내야 할것이 있다.

먼저, 1) 해당 데이터베이스 명 을 알아야 한다 -> 2) 민감한 정보가 있는 테이블 명을 알아야 한다 -> 3) 해당 테이블의 칼럼 명을 알아야한다.

위와 같은 개요도로 하나씩 차근차근 정보를 유추하면서 공격을 임할수 있다. 다만 오랜 노력 끝에 얻어낸 정보가 일방향 해쉬(Hash) 함수로 해쉬화

되어 있다면 모든 노력은 물거품으로 돌아갈수 있다, 하지만 md5 , sha-1 과 같은 출력 bit 가 낮은 경우 Brute Force Attack , Dictunary Attack , 약한 충돌,강한충돌

등으로 해시값을 찾아낼수 있다.

 

 

Blind SQL INJECTION 쿼리에 사용하는 함수는 ‘substr’ , ‘ascii’ , ‘limit’ 함수가 있다. substr 함수

번째 인자로 받은 문자열을 지정한 길이만큼 출력하는데, 주로 문자 하나씩 출력하여

이름을 알아내는데 사용한다. asci 함수는 문자를 아스키코드로 변환하는데, 작음따옴표(‘)

우회하는 변수일 문자를 입력하기 위하여 사용한다. limit함수는 문자열의 길이를 반환한다.

 

문자열의 길이를 알아내면 substr함수로 문자열을 추측하기 쉬워진다. 함수를 통하여 임의

값을 입력하며 데이터베이스 내용을 알아낼 때까지 계속 비교한다.

Boolean Based injection 참과 거짓만 출력하는 페이지에 공격자가 조작한 쿼리로 인해 데이

터베이스 내용을 노출하는 취약점이다. 쿼리는 데이터베이스 내용이 일치하여 페이지에

참을 출력할 때까지 임의의 값을 대입한다.

sqli_4.php 페이지는 사용자가 입력한 검색어와 일치하는 영화가 데이터베이스에 있는지를

력한다.

3-1 SQL INJECTION 공격 Blind – Boolien-Based (난이도 하)

 

 

검색란에 작은따옴표를 입력하여 SQL 인젝션이 가능한지 알아본다. SQL 인젝션 취약점이

경우 SQL 오류 메시지를 출력한다. [그림5-2]처럼 문법 오류가 탐지되었다는 메시지는 SQ

L인젝션 공격이 가능하다는 뜻이다.

 

 

Boolean Base SQL 인젝션 취약점을 알아보기 위하여 검색란에 결과를 항상 참으로 만드는

리를 입력한다.

SQL 인젝션 결과 해당 영화가 존재한다는 메시지를 출력하는데, 이는 결과가 참일 웹페

이지에서 출력하는 메시지다. 이때 검색란을 통하여 Boolean Based SQL Injection 가능하다.

 

 

[Search]버튼을 클릭하면 참일 때와는 다르게 ‘The movie does not exitst in our database!’ 라는

자열을 출력한다 메시지를 통하여 쿼리의 참과 거짓을 판별할 있다.

 

 

UNION SELECT구문을 입력하면 SQL 문법이 틀리다는 메시지를 출력한다. SQL문법 오류

시지가 아닌 참인 메시지를 출력할 때까지 칼럼 수를 늘려 입력한다.

 

 

sqli_4.php 페이지의 정상 쿼리는 7개의 칼럼을 호출한다. 따라서 UNION SELECT 구문으

칼럼 수를 7개로 입력하면 메시지를 출력한다.

그러나 검색한 영화가 데이터베이스에 있는지만 체크하기 때문에 기존 UNION BASED SQL

인젝션 공격으로도 쿼리의 결과를 출력하지 않는다. 따라서 ‘substring’ 함수를 사용하여 데이

터베이스 내용을 추측하는 인젝션을 시도한다.

 

Bliend SQL 인젝션에 사용할 쿼리는 항상 참이 되는 쿼리와 정보를 추출할 쿼리를 조합하여

입력한다.

 

비박스는 users 테이블에 계정 정보를 저장하고 있고, users 테이블 안에 있는 login 칼럼에

아이디를 저장한다. 따라서 users테이블에서 회원 아이디가 bee 회원의 비밀번호를 추측

한다.

1. 데이터베이스 명 의 문자열 갯수 알아내기

 

 

‘ or 1=1’ 쿼리로 서버의 정상 쿼리와 연결한 length함수와 substring함수를 사용하여 데이

터베이스 내용을 추측한다. 다르 쿼리를 사용하여도 Blind SQL Injection 가능하다.

인젝션할 때는 추측할 대상의 길이 값부터 파악한 글자 하나씩 추측한다.

 

 

다음은 length 함수로 데이터베이스 이름의 길이를 추측하는 쿼리다.

database()’ 서버의 데이터베이스 명을 반환하는 시스템 함수로, 1부터 대입하면 5

메시지를 출력한다. 데이터베이스 명은 다섯 자리이다

2. 데이터베이스 명 알아내기

 

 

substring함수 문자열 m위치에서 n개에 해당하는 문자를 돌려준다 SUBSTR/SUBSTRING(문자열,m,n) 따라서 a~z까지의 문자를 입력하여 database 테이블 명의번째 문자를 추측한다.

 

 

substring 함수를 이용하여 데이터베이스의번째 문자가 ‘b’라는 것을 알게 되었다.

 

 

substring 함수를 이용하여 데이터베이스의번째 문자가 ‘W’ 라는것을 알게 되었다.

 

 

substring 함수를 이용하여 데이터베이스의번째 문자가 ‘A’ 라는것을 알게 되었다.

 

 

substring 함수를 이용하여 데이터베이스의번째 문자가 ‘P’ 라는것을 알게 되었다.

 

 

substring함수와 ascii함수를 함께 사용하여도 데이터베이스 명을 추측할 있는데, 이경우는 작은 따옴표가 필터링으로 막힌 경우에 유용하다. 참인 메시지를 출력할 때까지 글자에 해당하하는 아스키 값을 입력하여 번재 문자가 ‘P’ 라는 것을 유추하게 되었다.

 

이로서 데이터베이스명이 ‘bWAPP' 라는것을 알게 되었다.

 

다음은 테이블 명의 길이를 알아내는 쿼리다. MySQL 버전이 5 이상이므로 MySQL 메타

이터 information_schema 사용한다. where 조건으로 테이블의 타입을 지정하면 information

_schema 있는 메타데이터 저장용 테이블을 제외하게 된다. 또한, 테이블 스키마를 서버의

데이터베이스인 bWAPP으로 지정하면 bWAPP데이터베이스의 테이블만 출력한다.

3. 테이블 명 의 문자열 갯수 구하기

 

 

limit연산자로는 조건에 맞는 테이블 위에서부터 선택할 있다. , 다음 쿼리에서는 bW

APP 데이터베이스에 저장된 테이블 번째 테이블 하나를 출력한다. 1부터 대입하였을

4 입력하면 메시지를 출력한다.

4. 테이블 명 의 문자열 구하기

 

 

다음은 length 함수로 알아낸 테이블 명을 추측하는 쿼리문이다. substring함수로 테이블 명의

번째 자리부터 하나씩 글자를 구분한다 substring함수보다는 asci 함수로 범위를 한정하여

알아내는 방법이 빠르다.

 

 

ascii함수와 substring함수로 확인한 테이블 명은 ‘b 0 0 0’ 이다.

 

Blind SQL Injection 계속 진행하면 번째 테이블이 users라는 정보를 알게된다. 따라서

용자의 계정 정보가 있는 users 테이블의 칼럼을 추측할 있다.

5. 테이블 내 의 칼럼 문자열 갯수 구하기

 

 

users테이블 칼럼 명의 길이를 파악하기 위하여 다시 length함수를 사용하고 limit연산자로

번째 칼럼으로 지정한다. length함수의 반환 값에 1부터 대입하면 2 참인 메시지를 출력

한다.

6. 테이블 내 의 칼럼 문자열 구하기

 

 

다음은 length함수로 알아낸 칼럼 명을 추측하는 쿼리다. limi함수로 최상위 칼럼의 위치를

환하고 , substring함수로 칼럼 명의 번째 자리부터 하나씩 글자를 구분한다. 알파벳 a부터

대입하면 ‘i’ 참인 메시지를 출력하므로 칼럼명은 ‘i’라는 것을 알게 된다.

 

 

substring 함수를 이용하여 ‘users’ 테이블에 있는번째 컬럼명이 ‘id’ 라는 것을 알수 있다.

 

 

그다음 컬럼 명을 추측하기 위하여 limit 1,1 지정하고 칼럼 명의 길이를 파악한다. 1부터

입하면 5 메시지를 출력한다 이로서 ‘users’테이블에 있는번째 컬럼명이 ‘5’

글자 라는 것을 알게되었다.

 

 

앞의 length 함수로 알아낸 칼럼 명을 다음 쿼리로 추측한다. substring함수로 칼럼 명의

자리부터 하나씩 글자를 구분한다. 알파벳 a부터 대입하면 1 참인 메시지를 출력하

므로 칼럼 명은 ‘l O O O O’ 인것을 알수있다.

 

 

칼럼 명을 추측하다 보면 번째 컬럼은 login이라는 사실을 있으므로 login 칼럼의

내용을 파악하기 위한 쿼리를 입력한다. 번째 값을 추측하기 위하여 limit 1,1 지정하고

1부터 대입하면 3 참일 메시지를 출력한다.

 

 

다음은 length함수로 길이를 알아낸 컬럼의 내용을 추측하는 쿼리다. 알파벳 a 부터 대입하면

b 참인 메시지를 출력하므로 칼럼의 내용이 ‘b o o ‘ 이라는 알수 있다.

 

 

login칼럼의 내용을 알아내면 다음 컬럼 명을 추측하기 위하여 limit 2,1 지정하고

럼명의 길이를 파악한다. 1부터 대입하면 8 메시지를 출력한다.

 

 

칼럼명의 길이를 알았으니 다음 쿼리로 칼럼 명을 추측한다. substring함수는 칼럼 명의

자리부터 하나씩 글자를 구분한다. 알파벳 a부터 대입하면 p 메시지를 출력

한다. 같은 구문을 반복하여 ‘passsword’ 라는 컬럼 이라는 것을 알게 되었다.

 

그렇다면 이제부터 ‘password’ 칼럼에 있는 내용의 길이 패스워드의 길이를 파악해보겠다.

 

 

‘password’칼럼에 있는 내용의 길이를 파악하기 위해서 구문을 삽입하였더니 40 이라는 값이

값을 가지게 되었다 따라서 원문이 아닌 해시 값이라는 추측이 가능하다. 해시

또한 Bliend SQL Injection 통해 확인할수 있지만. 40개를 일일이 하기에는 시간이 많이 소요

된다. 따라서 비밀번호에 어떤 해시함수를 사용하는지 알아본다.

 

 

인젝션 결과로 참일 출력하는 메시지가 나온다. 따라서 비박스에서는 비밀번호 해시 함수

sha-1함수를 사용함을 있다.

Blind SQL Injection 대응방안

 

 

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

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

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

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

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