728x90
728x90
728x90
 

itsecgames.com

 

www.itsecgames.com

[사진 1]

SQL Injection 문제이다. GET Method로 파라미터를 전달한다. 이전 문제와 다른 점은 Title로 search하는 것이 아니라 movie라는 파라미터에 숫자(아마도 id 값)를 전달하는데, 이에 해당되는 데이터를 가져오는 것 같다.

 

low

[사진 2]

low 레벨이다. 먼저, 조회 가능한 영화는 10개인데, movie 파라미터에 11을 전달하면 위와 같이 영화를 찾을 수 없다고 한다.

 

[사진 3]

single quote를 입력하면 SQL 에러가 발생하는 것을 확인할 수 있다. SQL Injection이 가능하다는 것이다.

 

[사진 4]

이전 문제와 마찬가지로 UNION SELECT ALL 명령어를 통해 SELECT 하는 칼럼의 개수를 확인할 수 있다. movie의 값으로 0을 주는 것은 영화 정보를 출력하지 않기 위함이다.

query : movie=0 UNION SELECT ALL 1, 2, 3, 4, 5, 6, 7

 

[사진 5]

이전 문제에서 확인했던 information_schema 스키마의 "TABLES" 테이블의 table_name 컬럼을 확인할 수 있다. 이전 문제와 다르게 1개 행만 출력되는 것은 html을 출력하는 php가 1개 행만 출력하는 것 같다.

query : movie=0 UNION SELECT ALL 1, table_name, 3, 4, 5, 6, 7 from information_schema.tables

 

[사진 6]

limit 명령어를 통해 SELECT할 데이터(DB에 존재하는 테이블의 이름)를 조작할 수 있다.

query : movie=0 UNION SELECT ALL 1, table_name, 3, 4, 5, 6, 7 from information_schema.tables limit 1,1

 

* MySQL limit

 

MySQL LIMIT

In this tutorial, you will learn how to use MySQL LIMIT clause to constrain the number of rows returned by the SELECT statement.

www.mysqltutorial.org

 

[사진 7]

information_schema.tables 테이블의 table_schema 칼럼을 통해 'user' 테이블이 존재하는 스키마를 알아낼 수 있다.

query : movie=0 UNION SELECT ALL 1, table_schema, 3, 4, 5, 6, 7 from information_schema.tables where table_name='user'

 

[사진 8]

또한, information_schema.columns 테이블의 column_name 칼럼을 통해 'user' 테이블의 칼럼 이름을 알아낼 수 있으며 limit 명령어를 사용하여 모든 칼럼 이름을 알아낼 수 있다.

query : movie=0 UNION SELECT ALL 1, column_name, 3, 4 ,5, 6, 7 from information_schema.columns

 

[사진 9]

확인할 테이블의 스키마, 칼럼 이름을 입력하여 데이터를 출력할 수 있다. 마찬가지로 limit 명령어로 모든 row를 확인할 수 있다.

query : movie=0 UNION SELECT ALL 1, Host, User, 4, Password, 6, 7 from mysql.user

 

medium

[사진 10]

medium 레벨이다. single quote를 입력하면 앞에 backslash가 붙는 것을 확인할 수 있다. 필터링되고 있는 것 같다.

 

[사진 11]
[사진 12]

medium 레벨에서 사용하는 php 코드(sqli_2.php, functions_external.php)를 보면 mysql_real_escape_string() 함수엥 의해 쿼리문이 변환된다.

 

* PHP mysql_real_escape_string() function

 

PHP: mysql_real_escape_string - Manual

Just a little function which mimics the original mysql_real_escape_string but which doesn't need an active mysql connection. Could be implemented as a static function in a database class. Hope it helps someone.

 

[사진 13]

쿼리문을 만드는 코드를 보면 id 칼럼에 movies 파라미터 값을 대입하여 SELECT한다.

 

[사진 14]

bWAPP 스키마의 movies 테이블을 보면 id 칼럼이 정수형인 것을 확인할 수 있다.

 

[사진 15]

위 사진은 movies 테이블에 저장되어 있는 데이터이다.

 

[사진 16]

mysql_real_escape_string() 함수에 의해 single quote 앞에 backslash가 붙게 되고 위와 같이 에러가 발생하는 것을 웹페이지에서 확인했었다.

 

[사진 17]

backslash를 무력화시키기 위해 "%a1" 문자를 입력하면 두 번째 빨간색 박스처럼 "%a1" 문자와 backslash 문자가 결합되어 임의의 일반 문자로 변환된다(첫 번째 박스와 두 번째 박스의 임의의 문자 "a"는 이해를 돕기 위해 임의로 설정한 쿼리문과 문자이다.).

backslash는 일반 문자로 변환되어 쿼리문(select * from movies where id=a)은 거짓이 되버리지만, 맨 끝의 single quote가 남아 있어 쿼리문이 종료되지 않고 추가 입력을 해야 하는 것을 확인할 수 있다(맨 마지막의 커서).

쿼리문을 끝내려면 임의의 문자 "a"("%a1" + backslash)와  single quote 사이에 OR, UNION 등의 명령어를 삽입해야 하는데 mysql_real_escape_string() 함수에 의해 single quote 앞에 backslash가 붙게 되고 일반 문자로 변환되기 때문에 삽입이 어렵다.

 

high

[사진 18]

high 레벨이다. high 레벨의 경우 single quote를 전달하면 에러가 출력되지 않고 영화 정보를 select하지도 않는다.

 

[사진 19]

소스코드(sqli_2-ps.php)를 보면 이전 문제들과 다르게 쿼리문을 실행하고 있다. php 언어를 잘 모르다 보니 정확한 이해가 되지는 않았지만, 다음 블로그에 따르면 각 변수들을 각각 불러와 실행한다고 한다. 따라서 SQL Injection이 어렵다.

 

* 참고 블로그

 

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

안녕하세요! 이번 시간엔 sqli_2.php 페이지를 sql injection 해보겠습니다! 먼저 SQL 인젝션은 사용자가 입력한 값을 서버에서 제대로 검증을 하지 않아 서버에서 DB의 쿼리문으로 인식하여 DB안의 정�

nevertrustbrutus.tistory.com

728x90
728x90

'Wargame > bWAPP' 카테고리의 다른 글

bWAPP A1 SQL Injection (POST/Select)  (0) 2020.10.28
bWAPP A1 SQL Injection (POST/Search)  (0) 2020.10.28
bWAPP A1 SQL Injection (GET/Search)  (0) 2020.10.28
bWAPP A1 Server Side Includes (SSI) Injection  (0) 2020.10.28
bWAPP A1 PHP Code Injection  (0) 2020.10.28

+ Recent posts