본문 바로가기
2. Information Security/3. War Game

웹해킹 13번 (webhacking.kr old 13)

by H232C 2020. 1. 30.

1. 공격유형 : Blind Sql Injection

2. Write Up

No 파라메터에 1 입력시 Rsult를 보여주지만 그 외의 값은 아무런 반응이 없고 (0)or(1) 구문이 동작하므로 파라메터의 DB 저장값 형태는 Int형으로 확인됨

 

알려진 파라메터 값인 No에 대해 Blind Injection 수행시 No 컬럼의 1번째 값의 길이와 값이 각각 1자리와 1이라는 것을 확인할 수 있음 하지만 우리가 알아내야 하는 flag 값이 어떤 테이블 및 컬럼에 저장되어 있는지에 대한 정보(힌트)가 없으므로 이것을 알아내야 함 (MySQL은 information_schema 테이블에서 DB의 모든 정보를 확인할 수 있으므로 Blind Injection을 통해 Flag값이 저장되어 있는 DB 정보를 알아내야 함)
Limit, Ascii 등의 문구가 필터링돼 있어 format(str(i),chr(j)) 구문으로 Information_schema.columns의 table_name 등을 Blind Injection 하였을때 화면에는 0000000000 등의 숫자만 보이는데 여기서 Ascii의 대안으로 chr("문자열")로 바로 비교한 것이 문제였다.
Ascii의 대안으로 ord 문자를 써주고 다시 공격 구문을 수행했을 때 Information_schema.columns의 정보가 제대로 나오는 것을 확인할 수 있다.
Limit 구문을 막았다는 것은 바로 Min, Max 기능을 이용하라는 의미로 받아들이고 Information_schema.table, columns의 min, max 값의 정보를 가저오도록 하고 concat 기능을 이용하여 table_schema를 기준으로 정렬을 시킨다.
* 참고로 Table Schema의 값을 이전에 Database()를 Blind Inejction 공격하여 알아내었다. 화면에서 처럼 chall13은 Table_schema의 정보이고 그 뒤의 flag ~~ 값이 각각의 테이블과 컬럼 정보이다.
알아낸 컬럼 및 테이블 정보를 기반으로 Blind Injection 공격 수행시 Flag 문자 표출 Solved()

 

이 문제는 이번에 old 버전으로 리뉴얼 되었는데 공격 포인트를 정리해보자면 Ascii, Limit, having, group by, union, +, group_concat 등의 구문이 차단되어 있고 컬럼, 테이블 정보를 모르는 환경에서 "Blind Sql Injection"을 기반으로하는 "ord, concat" 구문을 조합 공격으로 해결 가능한 문제였다.

기존에는 Ascii 문자가 필터링되었을때 chr("문자") 등의 방식으로 바로 비교했었던 경험으로 동일하게 시도했지만 000000000 등의 숫자만 결과로 보여주어 이부분을 찾는데 조금 애를 먹었다. Ascii의 대안인 ord 기능이 있다는 것을 알고 적용했을때 문제를 해결할 수 있었다. 

댓글