Code::Security/비박스(BWAPP)

비박스(bWAPP) SQL Injection (POST/Search)

태군 코드 2019. 7. 10. 17:32
반응형

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

 

A1 - SQL Injection (POST/Search)

 

SQL Injection은 사용자가 입력한 값을 서버에서 검증하지 않고 데이터베이스 쿼리 일부분으로 인식하여 데이터베이스의 정보가 노출되거나 인증이 우회되는 취약점 입니다. SQL Injection은 사용자가 데이터를 입력할 수 있는 곳 어디에서든 발생할 수 있습니다.

 

참고 사이트 - https://sql--injection.blogspot.com/

 

SQL Injection (POST/Search) 항목의 모습입니다. 해당 페이지는 POST 메소드로 HTTP 연결 요청을 보내고 있어 SQL Injection (GET/Search) 페이지와는 다르게 URL에 파라미터 값이 나타나지 않는것을 확인할수 있습니다.

 

이번에는 웹프록시 도구를 이용하여 변수를 확인하고 SQL Injection을 시도를 해보도록 하겠습니다. 

 

웹프록시 도구는 버프스위트를 사용하도록 하겠습니다. 사용법을 모르신다면

 

BURP SUITE(버프스위트) 설치 방법을 참고하시기 바랍니다.

https://securitycode.tistory.com/7?category=753968

 

 

버프스위트를 이용하여 확인하였더니 'title'과 'action' 변수가 있는것을 확인하였습니다. 여기서는 title 변수에 ' 작은따옴표를 입력하고 [Forward] 버튼을 클릭하도록 하겠습니다.

 

[Forward] 버튼을 누르면 위와 같은 SQL 구문 오류 메시지가 출력되는 것을 확인할수 있습니다. 이 오류 메시지는 SQL Injection이 가능하다는 의미 입니다. 또 action 변수에 ' 작은따옴표를 입력하면 오류 메시지가 나오지 않기때문에 SQL Injection 취약한 변수는 'title' 변수라는 것을 알수 있습니다.

 

SQL Injection (GET/Search) 항목에서 변수를 항상 참으로 만든것과 같이 버프스위트를 이용하여 title 변수에 값을 참으로 만들어 보시기 바랍니다. SQL 구문이 정상적으로 입력되었다면, 모든 영화를 출력하는 것을 확인할수 있습니다. 여기서 또 한가지 확인할 것은 어떠한 주석처리 값을 입력하였을때 Injection 공격이 성공 하였는지도 함께 확인해 보시면 좋을 것 같습니다.

 

 

title 변수에 결과를 항상 참으로 만드는 SQL 구문을 입력하면 위와 같이 모든 영화가 출력이 되는것을 확인할 수 있습니다.

 

그럼 여기까지 취약한 변수와 주석 처리문을 확인하였으니 해당 페이지의 컬럼 수를 알아 보도록 하겠습니다.

 

버프스위트를 이용하여 title 변수에 컬럼수를 알아내기 위하여 값을 입력후 [Forward] 버튼을눌러 값을 전달해 주시기 바랍니다.

 

' UNION SELECT ALL 1#

 

값을 입력하면 SQL 구문 오류가 아닌 컬럼 수가 맞지 않는 다는 오류 메시지를 확인 할수 있습니다. 여기서 오류 메시지가 나오지 않을 때까지 컬럼 수를 하나씩 늘려 웹페이지에 호출하도록 하겠습니다.

 

컬럼수를 조금더 편하게 확인을 하기 위하여 마우스 오른쪽 버튼을 눌러 버프스위트 기능중 하나인 [Send to Repeater] 기능을 사용하도록 하겠습니다.

 

[Send to Repeater] 버튼을 누르게 되면 다음과 같은 화면이 보이고 좌측 화면에서 title 변수에 컬럼수를 늘려가면서 [GO] 버튼을 눌러 우측 화면에서 결과 값을 확인을 합니다.

 

' UNION SELECT ALL 1# [GO] 우측 결과값 확인

' UNION SELECT ALL 1,2# [GO] 우측 결과값 확인

 

에러 문구가 안날때 까지 확인을 해보니 컬럼수는 총 7개라는 것을 확인할수 있습니다. 이제 컬럼수를 확인했으니 페이지를 확인해 보도록 하겠습니다.

 

 

페이지를 확인해보면 2, 3, 4, 5 컬럼을 확인할수 있습니다. 이제 데이터 베이스 버전을 알아내기 위하여 페이지에 노출되는 컬럼에 시스템 변수를 입력해 보도록 하겠습니다.

 

 

노출되는 컬럼중 2번 컬럼에 버전을 알아 내기 위하여 시스템 변수를 입력 하였습니다.

 

' UNION SELECT ALL 1, @@version,3,4,5,6,7#

 

 

웹페이지를 확인해보면 동일하게 2번 컬럼에 데이터 베이스 버전이 나오는것을 확인할수 있습니다. 데이터베이스 버전을 확인하였으니 데이터베이스에서 사용하는 테이블 명을 확인해 보도록 하겠습니다.

 

 

' UNION SELECT ALL 1, table_name,3,4,5,6,7 from information_schema.tables# 

 

동일하게 버프스위트에서 title 변수에 값을 입력후 [Forward] 버튼을 클릭하면 다음과 같이 데이터베이스에서 사용 중인 모든 테이블 명을 확인 할수 있습니다. 'users'라는 테이블에 사용자 정보가 있다고 예상하고 'users'테이블의 컬럼 명을 확인하도록 하겠습니다.

 

 

' UNION SELECT ALL 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#

 

해당 값을 입력하면 'users'에서 사용중인 컬럼명이 나옵니다. 여기서 확인하고 싶은 컬럼을 선택하여 더 정확한 정보를 확인해 보도록 하겠습니다.

 

 

' UNION SELECT ALL 1, id, login, password, email,6,7 from users#

 

결과를 출력하면 id는 사용자의 가입 순서, login은 아이디, email, password는 해시 값으로 저장된 비밀번호가 나오는것을 볼수 있습니다.

 

난이도 상에서는 sqli_check_2 함수로 SQL Injection을 우회하고 있습니다. sqli_check_2 함수는 functions_external.php에 정의 되어 있습니다.
PHP 기본 제공 함수인 mysql_real_escape_string 함수를 사용하여 입력한 데이터를 우회 합니다. mysql_real_escape_string 함수는 사용자 입력 값에 SQL 문법에서 사용하는 특수 문자가 있을 경우 다음의 문자에 백슬래시를 붙여 SQL 문법으로 인식하지 않게 방어 합니다. 우회 문자: \x00, \n, \r, \, ', ", \x1a

반응형