일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 포렌식 #사이버포렌식 #Forensic #정보보안 #IT
- c언어문자열처리방법 #c언어문자열
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #SQLi #sqlinjectioon
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #commandinjection
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #IT #PUT메소드 #PUT #HTTP메소드 #취약점
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #로또번호생성 #로또번호만들기 #중복제거 #중복제거알고리즘
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #선택정렬 #선택정렬알고리즘
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #IT #CSRF #
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #c배열포인터 #c언어포인터 #c언어배열포인터 #배열포인터
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #phpcodeinjection #injection
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #IT
- 파일시스템과파티션 #포렌식 #사이버포렌식 #Encase #Forensic #파티션 #파일시스템 #정보보안
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #Call by value #Call by reference
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #BrokenAuthentication
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #c2차원배열동적할당 #c언어동적할당 #c동적할당 #c언어동적할당2차원배열
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #C동적메모리할당 #malloc #메모리
- #FAT파일시스템 #파일시스템구조 #파일시스템 #Forensic #정보보안 #IT
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #c언어포인터의포인터 #c언어2중포인터
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #c언어포인터 #c언어포인터연산
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #IT #SQLi #TimeBaseSQLi #sqlinjection
- C언어 #C #C프로그래밍 #프로그래밍 #언어
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #IT #robots.txt #검색엔진노출
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #c언어포인터와문자열 #c언어문자열
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #xss #storedxss #CrossSiteScripting
- XSS #ReflectedXSS
- c언어malloc #동적할당 #c언어동적할당 #c언어malloc사용하기
- 사이버포렌식 #포렌식 #FAT
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #c언어포인터배열 #c언어포인터 #포인터 #c포인터
- C언어 #C #C프로그래밍 #프로그래밍 #언어 #포인터 #포인터변수 #c언어주소 #주소
- beebox #bWAPP #webhacking #web #웹해킹 #정보보안 #bruteFource #무차별공격
- Today
- Total
Hello Security World
[Web Hacking] Bee - Box -Blind SQL Injection- 본문
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쿼리로 인식하지 않는다.
'정보보안 > BWAPP Bee-box' 카테고리의 다른 글
[Web Hacking] Bee - Box -PHP Code Injection- (0) | 2020.05.03 |
---|---|
[Web Hacking] Bee - Box -OS Command Injection- (0) | 2020.05.03 |
[Web Hacking] Bee - Box -Union Base SQL Injection(POST)- (0) | 2020.05.03 |
[Web Hacking] Bee - Box -Union Base SQL Injection(GET)- (0) | 2020.05.03 |
[Web Hacking] Bee - Box -HTML Injection- (0) | 2020.05.03 |