관리 메뉴

FU11M00N

7-1. bee-box 를 사용하여 SQL injection 알아보기! 본문

Web Hacking/bee-box

7-1. bee-box 를 사용하여 SQL injection 알아보기!

호IT 2020. 3. 19. 15:15

먼저 SQL 인젝션은 사용자가 입력한 값을 서버에서 제대로 검증을 하지 않아 

서버에서 DB의 쿼리문으로 인식하여 DB안의 정보가 노출되거나 인증이 우회되는 취약점이다.

SQL 인젝션은 사용자가 데이터를 입력할 수 있는 곳 어디에서든 발생할 수 있고 이것을 이용해

SQL 쿼리를 변수에 입력을 하여 DB안의 정보를 탈취당 할 수가 있다.

SQL injection은 인젝션 부분에서도 가장 중요한 부분이고 잘 알아야 할 부분이다!

 

사진 1-1

사진 1-1은 SQL 인젝션의 동작원리입니다!

 

1. 레벨 low

 

사진 1-2

그럼 가장 먼저 sqli_1.php 페이지로 SQL Injection을 시도해보겠습니다.

먼저'를 입력해 SQL 인젝션 공격이 가능한지 확인해봅니다!

 

사진1-3

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%'' at line 1 

 

SQL문이 에러가 났다고 합니다. 이 의미는 SQL 인젝션이 가능하다는 뜻입니다.

서버에서 쿼리문을 인식하였고 ' 만 입력했기 때문에 문장이 에러가 났다고 표시해주는 것입니다!

또한 MYSQL인 것을 확인할 수 있습니다! 참고로 mysql은 주석이 #이고 mssql은 --입니다!

 

그럼 제대로 쿼리문을 작성하여 내부 파일을 봐보도록 하겠습니다!

 

우선 UNION을 사용하여 sql 쿼리문을 작성할 것인데 UNION은 데이터베이스 쿼리문에서 

select 문이 둘 이상일 때 두 개를 결합하여 하나의 결과로 반환해줍니다.

 

우선 select문을 하기 위해 해당 데이터베이스 칼럼 수를 알아야 합니다.

사진 1-4

' union select 1,2,3,4,5,6,7# 이런 형태로 칼럼수가 몇 개인지 알아야 하는데 7개인 것으로 판별되었습니다!

그리고 2 , 3 ,5, 4 숫자는 두 번째 세 번째 네 번째 다섯 번째가 취약한 칼럼 이기 때문에 공격할 시스템 변수는 

저곳에 넣어야 합니다!

 

그럼 해당 MySQL 버전을 확인하는 명령어인 

사진 1-5

' union select 1,@@version,3,4,5,6,7# 를 입력해 5.0.96 우분투 인 것을 확인했습니다!

 

사진 1-6

 

' union select 1,2,3, table_name,5,6,7 from information_schema.tables# 쿼리문을 날려

인포메이션 스키마 테이블의 테이블명을 확인할 수 있습니다.

테이블을 살펴보던 중 users라는 중요해 보이는 테이블 이름이 보입니다!

 

그럼 where 절로 users 테이블 정보 안에 칼럼들을 알아내기 위한 쿼리문을 작성해보면,

사진 1-7

' union select 1, column_name,3,4,5,6,7 from information_schema.columns where table_name='uesrs'# 

을 입력하였더니 중요해 보이는 칼럼이 몇 개보입니다.

login와 password의 칼럼이 보입니다 뭔가 유저의 아이디와 비밀번호가 담겨있을 거 같은 칼럼들입니다.

 

그럼 칼럼을 확인하는 쿼리문을 작성해보자면,

 

 

사진 1-8

' union select 1, login, password,4,5,6,7 from users#으로

 

회원들의 아이디와 비밀번호를 알아냈습니다! 

하지만 비밀번호가 다소 이상한 숫자로 이루어져 있는데요,

이는 원래의 비밀번호가해쉬 함수를 거쳐 알 수 없는 숫자가 된 것입니다.

 

 

2. 레벨 High(대응방안)

사진 1-9

'를 정삭적인 것으로 해석하여 해당하는 영화가 없다고 뜨네요..

항상 그랬듯 페이지 소스코드를 확인해보겠습니다!

 

 

사진 1-10

난이도 상은 sqli_check_2 함수로 우회되고 있습니다.

 

사진 1-11

sqli_check_2 함수는 mysql_real_escape_string 함수를 사용하여 입력되는 데이터를 우회하고 있습니다. 

여기서  mysql_real_escape_string는 SQL 문법에서 사용하는 특수 문자가 있을 경우 백 슬래시를 붙여 

입력 데이터를 SQL 문법으로 인식하지 않게 방어합니다. 

여기서 우회되고 있는 문자들은 NULL,\n,\r,\,', " 그러므로 '를 입력하면 \(백슬래사)가 붙어 

SQL 쿼리문으로 인식하지 않는 것입니다!

 

mysql_rela_escape_string 함수는 PHP에서 기본으로 제공해주는 함수이며 SQL Injection을 대응하기 위해선 mysql_rela_escape_string 함수를 사용해야 합니다.

 

 

Reference by 비박스 환경을 활용한 웹 모의해킹 완벽실습


Comments