old-29_풀이

2021. 12. 25. 00:45문제연습/webhacking.kr

반응형

본 티스토리 블로그는 PC 환경에 최적화되어 있습니다.

모바일 유저분들은 아래 네이버 블로그를 이용해 주세요.

 

 

old-29_풀이

본 네이버 블로그는 모바일 환경에 최적화되어 있습니다. PC 유저분들은 아래 티스토리 블로그를 이용해 ...

blog.naver.com

 

Webhacking.kr

old-29번 문제풀이

 

번 문제는 Bind SQL injection 취약점을 아용하여 테이블 정보를 유출하는 문제입니다.

기존 bind 문제와는 다르게 직접 python script를 짜지 않아도 되니 머리 식히는 용도로 푸시면 좋을 것 같습니다.

 

 

1. 접속 화면

 

2. Exploit!!!

파일 업로드를 이용하여 플래그를 추출해야 하는 문제인 것으로 확인됩니다.

몇 번 테스트를 진행해 본 결과 php와 같은 확장자 파일은 모두 필터링 되어 있어 웹쉘을 실행하기는 힘들어 보이는 듯합니다.

 

burp suite로 통신내역을 확인해 보니 다음과 같은 부분이 걸렸습니다.

즉, 파일 이름과 업로드 시간(time), 주소(ip)를 통해 insert ~ into ~ 구문을 이용하여 서버 테이블에 정보를 저장하고 select를 통해 해당 정보를 불러올 것으로 예상됩니다.

그럼 우리가 확인해야 할 정보 우선순위는 아래와 같습니다.

 

1. 쿼리문에 들어가는 value의 개수
(insert 구문을 사용한다고 가정할 때.)

2. 각각의 insert 되는 value의 타입

3. 테이블 및 칼럼 정보를 검색하기 위한 서브 쿼리 작성

 

1) value의 개수와 타입

- insert 구문 : INSERT INTO 테이블 이름 VALUES (데이터 값 1, 데이터 값 2, 데이터 값 3, ...)

문제에서 나온 정보와 burp suite로 잡은 통신내역에서도 보면 파일 이름 부분에 인젝션 취약점이 있을 것 같습니다.

 

하지만...

 

union 구문을 통한 select 쿼리문 인젝션을 진행할 경우 null과 같은 값을 이용하여 칼럼의 형식과 상관없이 개수를 유추해낼 수 있었지만 insert의 경우에는 특별한 해결법이 존재하지 않아 상황에 맞게 Guessing을 진행하는 것이 현재로서는 최선인 것 같습니다.

 

파일 업로드 시 출력되는 정보를 통해 다음과 같이 입력할 경우 정상적인 인젝션이 발생한 것으로 확인되었습니다.

 

file_name', time_information, 'Authorized_IP_addr')#

정말로 많은 노가다 했다는....

 

우선 insert 구문을 활용하여 인젝션을 진행할 경우 대표적으로 아래의 경우가 존재합니다.

 

1. insert into table_name(a, b, c) values ('d','사용자 입력값','f')

- 사용자 입력값 : a’,‘b’)#

- 결과 : insert into table_name(a, b, c) values ('d','a’,‘b’)#','f')

 

이 경우에는 입력값을 ‘, 조작된 쿼리문)#을 넣어서 인젝션 수행이 가능하나, 문제는 입력값의 위치가 애매할 경우입니다.

 

 

2. insert into table(a, b, c) values ('사용자 입력값','d',‘e’)'

- 사용자 입력값 : 1‘,’2‘,’3’),(‘1

- 결과 : insert into table(a, b, c) values ('1‘,’2‘,’3’),(‘1','d',‘e’)

 

위와 같은 경우거나 여러 칼럼이 insert 되지만 일부 정보만 select 구문을 통해 화면에 표시되면 기존 방식은 제한이 걸립니다.

이를 해결하기 위해 values 뒤에 여러 개의 값이 와도 된다는 조건을 활용하여 공격을 진행할 수 있습니다.

(여기에 서브 쿼리까지 넣는다면 여러모로 활용이 가능하겠죠?)

 

 

다시 본론으로 돌아오도록 하겠습니다.

 

인젝션에 필요한 값의 개수와 타입을 사전에 알아냈으므로 서브 쿼리를 통한 DB 정보를 추출해 보도록 하겠습니다.

 

DataBase 이름

- 삽입 쿼리 : file_name', time, 'my_ipaddr'), (database(), time, 'my_ipaddr')#

확인 결과 DB 이름은 'chall29'로 확인되었습니다.

 

Table 이름

- 삽입 쿼리 : file_name', time, 'my_ipaddr'), ((SELECT group_concat(table_name) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='chall29'), time, 'my_ipaddr')#

DB 이름이 chall29임을 이용하여 내부 테이블 이름을 추출하도록 해당 서브 쿼리를 넣어 주면 됩니다.

단, 출력되는 정보는 1개의 열이고 여러 개의 이름이 있을 수 있으니 group_concat을 이용해 묶어서 하나로 출력할 수 있도록 해야 합니다.

 

 

내부 칼럼 정보

- 삽입 쿼리 : file_name', time, 'my_ipaddr'), SELECT COLUMN_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='chall29', time, 'my_ipaddr')#

 

위에서 얻어진 정보를 활용하여 다음과 같은 서브 쿼리를 작성하면 원하는 플래그를 추출할 수 있습니다.

 

- 서브 쿼리 : file_name', time, 'ip_addr'), ((select group_concat(flag) from),123, 'ip_addr')

웹을 풀면서 느끼지만 정말로 게싱이 많은 듯합니다...

그래도 많이 접하다 보면 감각적으로 찾아내는 능력이 조금은 올라가겠죠???

 

반응형

'문제연습 > webhacking.kr' 카테고리의 다른 글

old-2_풀이  (0) 2021.06.23
old-47_풀이(보류)  (0) 2021.06.23
old-19_풀이  (0) 2021.06.22
old-21_풀이  (0) 2021.06.12
old-12_풀이  (0) 2021.06.10