관리 메뉴

FU11M00N

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

Web Hacking/bee-box

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

호IT 2020. 3. 23. 18:19

안녕하세요! 이번 시간엔 sqli_10-1 페이지를 SQL Injection 해보겠습니다!

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

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

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

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

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

 

사진 1-1

1. 레벨 low

사진 1-2

사진 1-2의 홈페이지 모습입니다 sqli_10.php URL을 가지고 있네요!

AJAX 은 Asynchronous JavaScript and XML의 약어이고, HTML, 자바스크립트, JSON을 혼합하여 사용하는 기술입니다!!

JSON 은 Javascript Object Notation의 약어이고, 웹 서버와 클라이언트가 데이터를 주고받는 표현 방법입니다!!

JQuery 은 자바스크립트 라이브러리 중 하나이고, 클라이언트에서 스크립트 언어를 사용할 때 이를 단순화하고, AJAX 기능을 제공합니다!!

 

그래서 이 홈페이지는 AJAX 기술을 사용해 submit 버튼이 없어도 검색어가 바로 출력이 되네요!

사진1-3

음.. 그러면 ' or 1=1# 을해서 SQL Injection 공격이 가능한지 확인해보니 되는 것 같습니다!!

 

' or 1=1#은 결과를 항상 참으로 만드는 쿼리문입니다!!

 

사진 1-4

'Search for a moive'의 필드 안에  ' union select 1, table_name,3,4,5,6,7 from information_schema.tables# 

DB의 테이블 이름을 확인할 수 있는 쿼리문을 작성하여 주입해보니, 

데이터베이스에 존재하는 모든 테이블들이 출력되었습니다! (참고로 1~7까지 하는 이유는 호출되는 칼럼수와 쿼리문이 칼럼수가 일치해야 하는데 sqli_10-1.php 홈페이지에선 칼럼이 7개 이기 때문이다.)

 

 

사진 1-5

' union select 1, database(),3,4,5,6,7#' 쿼리문을 삽입하여 해당 페이지의 데이터베이스를 확인했습니다!

사진 1-6

' union select 1, table_name,3,4,5,6,7 from information_schema.tables where table_schema="bWAPP"# 

의 쿼리문을 삽입해 데이터베이스 이름이 bWAPP인 db안에 있는 테이블들의 이름을 알아냈습니다!!

그중 중요해 보이는 테이블 이름인'users'의 테이블 안에 들어있는 칼럼들을 출력하기 위한 쿼리를 작성하자!

 

사진 1-7

id와 login, password, secret 등 중요한 정보가 담겨있을 거 같은 칼럼들이 출력되었습니다!!

 

그럼 칼럼들의 값을 보기 위한 쿼리를 짜 봅시다!! (이제 하도 많이 해봐서 다들 감이 오시죠??!!)

 

사진 1-8

A, I, M과 bee의 id의 순서 번호 login, password가 출력되었습니다.

password 해쉬값으로 되어있기 때문에 이를 풀기 위한 레인보 테이블을 사용해보겠습니다!

사진 1-9

A.I.M의 해쉬 함수는 sha1을 사용하고 결과 값은bug입니다!!

 

2. 레벨 High(대응방안)

사진 1-10

난이도'상'에서는 항상 참이 되는 쿼리문을 넣어도 공격이 안됩니다! 이를 파악하기 위해 소스코드를 확인해봅시다!!

사진 1-11

sqli_10-1.php 에서 AJAX를 호출할 시에 sqli_10-2.php를 호출하는 코드를 발견했습니다!!

 

그럼 sqli_10-2.php 코드도 확인해보겠습니다!!

 

사진 1-12

sqli_10-2.php 소스코드를 확인해보니 case: 2 즉 난이도 상은 sqli_check_2으로 우회를 하고 있었다

그럼 functions_external.php 소스코드를 확인하여 제대로 확인해보자!

 

사진 1-13

sqli_check_2mysql_real_escape_string 함수를 사용하고 있었고 이 함수는 PHP에서 제공하는 기본적인 함수이다.

 

SQL 문법에서 사용하는 특수 문자가 있을 경우 백 슬래시를 붙여 입력 데이터를 SQL문법으로 인식하지 않게 방어하는 기법입니다. 우회할 수 있는 문자는 'NULL , \n , \r , \ , '등입니다.' 가 안 먹히는 이유는 '를 삽입하면 실제 서버에서는

'\으로 우회되어 SQL 쿼리문으로 인식되지 않는 것입니다!

 

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


Comments