bWAPP A1 SQL injection (GET/Select)
itsecgames.com
www.itsecgames.com
SQL Injection 문제이다. GET Method로 파라미터를 전달한다. 이전 문제와 다른 점은 Title로 search하는 것이 아니라 movie라는 파라미터에 숫자(아마도 id 값)를 전달하는데, 이에 해당되는 데이터를 가져오는 것 같다.
low
low 레벨이다. 먼저, 조회 가능한 영화는 10개인데, movie 파라미터에 11을 전달하면 위와 같이 영화를 찾을 수 없다고 한다.
single quote를 입력하면 SQL 에러가 발생하는 것을 확인할 수 있다. SQL Injection이 가능하다는 것이다.
이전 문제와 마찬가지로 UNION SELECT ALL 명령어를 통해 SELECT 하는 칼럼의 개수를 확인할 수 있다. movie의 값으로 0을 주는 것은 영화 정보를 출력하지 않기 위함이다.
query : movie=0 UNION SELECT ALL 1, 2, 3, 4, 5, 6, 7
이전 문제에서 확인했던 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
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
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'
또한, 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
확인할 테이블의 스키마, 칼럼 이름을 입력하여 데이터를 출력할 수 있다. 마찬가지로 limit 명령어로 모든 row를 확인할 수 있다.
query : movie=0 UNION SELECT ALL 1, Host, User, 4, Password, 6, 7 from mysql.user
medium
medium 레벨이다. single quote를 입력하면 앞에 backslash가 붙는 것을 확인할 수 있다. 필터링되고 있는 것 같다.
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.
쿼리문을 만드는 코드를 보면 id 칼럼에 movies 파라미터 값을 대입하여 SELECT한다.
bWAPP 스키마의 movies 테이블을 보면 id 칼럼이 정수형인 것을 확인할 수 있다.
위 사진은 movies 테이블에 저장되어 있는 데이터이다.
mysql_real_escape_string() 함수에 의해 single quote 앞에 backslash가 붙게 되고 위와 같이 에러가 발생하는 것을 웹페이지에서 확인했었다.
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
high 레벨이다. high 레벨의 경우 single quote를 전달하면 에러가 출력되지 않고 영화 정보를 select하지도 않는다.
소스코드(sqli_2-ps.php)를 보면 이전 문제들과 다르게 쿼리문을 실행하고 있다. php 언어를 잘 모르다 보니 정확한 이해가 되지는 않았지만, 다음 블로그에 따르면 각 변수들을 각각 불러와 실행한다고 한다. 따라서 SQL Injection이 어렵다.
* 참고 블로그
7-3. bee-box 를 사용하여 SQL injection 알아보기!
안녕하세요! 이번 시간엔 sqli_2.php 페이지를 sql injection 해보겠습니다! 먼저 SQL 인젝션은 사용자가 입력한 값을 서버에서 제대로 검증을 하지 않아 서버에서 DB의 쿼리문으로 인식하여 DB안의 정�
nevertrustbrutus.tistory.com
'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 |