인프런 커뮤니티 질문&답변

고광우님의 프로필 이미지
고광우

작성한 질문수

모의해킹 실무자가 알려주는, SQL Injection 공격 기법과 시큐어 코딩 : PART 1

외부 자료 학습중 질문사항-메타데이터 추출 불가한 상황

해결된 질문

작성

·

309

·

수정됨

1

안녕하세요. 강사님 제가 다른 자료를 통해서 학습을 하다가 질문 사항이 발생했습니다.

질문 내용은 진행사항 아래에 질문사항으로 정리한 부분에 있습니다.

 

해당 자료는 vulnhub에서 제공하는 모의해킹 연습용 이미지이므로 실제 사이트를 대상으로 하는 공격은 진행한 것이 아닙니다.

그리고 공격은 제가 개인PC에 구성한 가상 환경내에서만 안전하게 진행하였습니다.

 

[정보 수집 활동으로 알아낸 정보]

  • 목적지 IP : 10.0.2.15

  • DBMS : MySQL

  • version : 4.1.22(Blind SQL Injection 으로 찾아냈습니다.)

  • Database name : webapp(Blind SQL Injection 으로 찾아냈습니다.)

[진행사항]

-> 해당 Username 입력 받는 곳은 SQL Injectino 취약점이 존재합니다.

-> 그래서 SQL Injection 공격이 성공하여 administrator 계정으로 접속하면 위와 같은 화면을 보여 줍니다.

-> ping을 쏘아보내는 화면을 보여 줍니다.

 

이걸 burp suite로 캡처하면 아래와 같습니다.

[request 화면]

-> burp suite에서 캡처한 request 화면이고

[response화면]

-> 쿼리 입력이 True(참)일 경우 ping을 보내는 화면 결과를 return하고

 

[false한 결과를 유도하는 request]

-> request를 false를 유도하면

[false한 결과를 받은 response]

-> ping 관련 응답이 없습니다.

-> 11번째 줄을 보면 index.php 로 나옵니다.

 

이런 상황에서 저는 아래와 같이 SQL Injection 공격 법을 결정하였습니다.

  1. Error Based SQL Injection(불가) : ID/PW 입력 창에 싱글쿼터만 입력하면서 Error 발생을 시켜서 DBMS 에러 메시지가 나오는지 확인했으나 나오지 않으므로 Error Based Injection은 불가

  2. Union Based SQL Injection(불가) : 입력에 대한 DB의 응답 값이 표현 된 부분이 없는 것 같아서 Union Based SQL Injection 도 사용 불가

  3. Blind SQL Injection(사용) : 입력 SQL Injection 구문이 False인 경우 ID/PW 입력 창(index.php), 입력 SQL Injection 구문이 True 일 경우 pingit.php 가 나오므로 Blind SQL Injection으로 MySQL 버전 정보를 얻기로 결정

    --> 정확히는 Response based Blind SQL Injection (참일 때 pingit.php가 response로 나오고 거짓을 경우에는 index.php가 response에 나오는 걸 이용)

 

이전에 uname=%27+or+6=length(version())%23 이 response에 pingit.php가 return 되는 걸 보면서 mysql 버전 길이가 6이라는 것을 확인했습니다.

[Blind SQL로 MySQL 버전 정보 습득]

-> 위의 정보를 intruder를 이용해서 MySQL 버전 정보를 습득 했습니다.

(예시-1 : version의 세번째 글자 구하기)

-> ascii값 49로 '1'

 

(예시-2: version의 네번째 글자 구하기)

-> ascii값 46, '.'(온점)

 

[질문사항]

--> table 개수를 검색해보려고 하면 Response는 잘 못된 입력 값을 send했을 때 돌려주는 index.php 화면을 response합니다.

--> 제가 request에 넣은 쿼리는 아래와 같습니다.

select count(*) from information_schema.tables where table_schema='webapp'

(querybox에서 실행한 예시)

-> 정상적으로 숫자 비교가 되어서 pingit.it로 response가 돌아올 것이라고 생각 했습니다.

-> 테이블이 1개라도 있으면 '0'보다는 크므로 response에 pingit.php가 속한 응답이 올 것으로 생각 했습니다.

-> 이런경우는 웹페이지에서 select나 메타데이터 정보를 조회하는 information_schema.tables 같은 것들을 필터링하고 있다고 생각해야 하는지 궁금합니다.

-> 그리고 위와 같은 명령어 들을 대체할 수 있는 것들을 검색해 봤는데 찾기가 어려웠습니다.

좀 더, 대체 명령어를 잘 찾을 수 있는 Tip 같은게 있는지 궁금합니다.

 

답변 1

1

크리핵티브님의 프로필 이미지
크리핵티브
지식공유자

안녕하세요.

MySQL 버전이 오래된 4버전대이군요...ㅎㅎ

4버전 대의 경우 information_schema 테이블이 존재하지 않아서 메타 정보를 얻어 올 수 없는 걸로 알고 있습니다.

따라서, 테이블/컬럼명을 추론해야 하는데, 기능을 통해 테이블명 추론 그리고 파라미터명을 통해 컬럼명 추론할 수 있는 방법이 있고,

만약 파일 다운로드 취약점이 존재한다면 소스코드 열람하여 SQL 구문을 참조를 통한 테이블, 컬럼을 알아낼 수 있고,

into outfile을 활용하여 웹쉘 생성을 할수도 있습니다.

이외에도 다른 우회적인 방법들은 환경에 따라 많이 달라질 수 있겠죠.ㅎㅎ

고광우님의 프로필 이미지
고광우
질문자

빠른 답변 감사합니다. crehacktive 님.
추가적으로 간단한 질문 하나 더 하자면 테이블/컬럼명 추론이라는 것은 우리가 학습 중에 비순차적 데이터베이스, 테이블, 칼럼 추출할 때 하는 것 처럼 그냥 제가 데이터베이스, 테이블, 칼럼 이름을 추측해야 하나요?

아니면 다른 방법이 있는 건가요?

크리핵티브님의 프로필 이미지
크리핵티브
지식공유자

비순차적 방법은 메타 데이터 정보가 있는 상태에서 특정 단어를 기반으로 찾는 방법이고, 4버전대에서는 추론 이란 단어보단 게싱이 맞겟네요. 4버전에는 메타 데이터를 가지고 있는 데이터 사전이 없습니다. 그래서 게싱을 해야 하지만, 다른 취약점들의 도움을 받아서 테이블 컬럼을 참조하거나, 기능+파라미터명을 통해 유추도 가능하구요.

고광우님의 프로필 이미지
고광우
질문자

빠르고 정확한 답변 감사합니다.
그리고 앞으로는 XSS 공격 강의나 파일Download/Upload 강의에서 뵙도록 하겠습니다.
좋은 강의를 제공해 주셔서 감사합니다.

크리핵티브님의 프로필 이미지
크리핵티브
지식공유자

감사합니다 ㅎㅎ 열공하세요!

고광우님의 프로필 이미지
고광우

작성한 질문수

질문하기