@23번문제
블라인드 인젝션으로 Suninatas에 있는 웹카테고리의 마지막 문제이다.
난이도가 있었지만, 보통의 블라인드 인젝션이었다.
MsSQL DB라는 것을 감안해야하고 곳곳의 어려운부분이 있기는 하다.




(23번 문제)



(문제 화면)



문제화면을 보니 필터링하고 있는 키워드 중에 admin 단어가 보인다.

블라인드 인젝션으로 이번 문제는 admin의 비밀번호를 찾는 것이 목적인데,
admin을 필터링 했다니.

일단 사용할 수 있는 키워드와 주석, numeric/string인지 여부를 확인하기 위해
인젝션을 시도하였다.
그 중 성공한 쿼리를 통해서 알 수 있는 내용은 다음과 같았다.



(성공 쿼리)



id 부분은 string으로 들어가고 있고 or, =, -- 기호를 사용할 수 있다.

또 이 문제에서 조금 힘들었던 부분이 길이제한인데..
예를들어 다음과 같이 길이가 조금 길다 싶으면 No hack이라고 떴다.
처음에는 어떤 단어를 필터링 하고 있는 줄 알았는데
키워드가 아닌 길이에서 필터링을 하고 있었다.



(필터링 된 모습)



최대 몇글자까지인지 확인해볼 필요가 있다.




(길이 확인)



최대 길이를 확인해보니 30 글자였고
30글자를 넘어가면 No hack이라고 떴다.

우리는 30글자 이내의 쿼리문을 만들어야한다.

그리고 또 우리가 해야할 일 중 하나는
admin의 행을 select할 수 있도록 해야하는데
처음에는 id에서 guest가 아닌 행을 찾도록해서 admin 계정의 행을 select 하는데 성공했다.




(admin select 성공)



하지만 이렇게 할 경우 블라인드 인젝션을 하려면 뒤에 긴 쿼리가 붙어야하는데
한계가 있었다..
즉, admin을 우회해서 입력할 수 있어야했다.

구글에 문자열 필터링을 치니 가장 먼저 나온것이
쿼터로 끊어주는 것이었다.
ex 'admin = 'adm'+'in'

이런 방법이 적용되는지 확인해 보았다.



(인젝션)



admin 행을 select 하는데 성공했다. :)
이제 블라인드 인젝션을 해야하는데 평소와 같이 나는 이렇게 입력했다.



(인젝션)



결과는 당연히 False였다. MsSQL에서는 mid함수를 지원하지 않는다...
그렇기에 내게 남은건 left 함수밖에 없었는데(substring을 필터링하고있어서...)
left를 쓰면 비밀번호 길이가 12글자인데(비밀번호 길이를 구하는 과정은 사진찍지 못했다.!)
30글자의 쿼리를 넘지않을까 걱정이 들었다.
하지만 우리에겐 right함수도 있으므로 막히면 right로 교체해서 반씩 알아내도 되겠다는 생각이 들었다.
첫글자는 파이썬으로 V였다.



(인젝션)



이런식으로 파이썬 코드를 작성하여 한글자씩 찾았다.
(12글자라서 금방 끝났다.)




(작성 코드)





(결과)



첫번째 글자는 V였고
두번째 쿼리는 admin'+'n'and left(pw,2)='V + chr(i)'-- 을 이용하여 찾았다.




(2번째 글자)




(결과)



결과는 3이었고
이제부터 No hack이 뜨기 시작했다.
그리하여 쿼리문을
'or left(pw,3)='V3 + chr(i)'-- 로 바꾸어서 찾았다.



(3번째 글자)




(결과)



이런 식으로 한글자씩 찾을 수 있었고

마지막에 admin으로 로그인해본 결과 비밀번호가 일치했다.



(문제 해결)



이제 이 비밀번호를 인증키에 입력해주면 끝이다. :)


'WarGame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS : Challenge WEB 22  (0) 2017.03.29
SuNiNaTaS : Challenge WEB 8  (0) 2017.03.29
SuNiNaTaS : Challenge WEB 6  (0) 2017.03.28
SuNiNaTaS : Challenge WEB 5  (0) 2017.03.27
SuNiNaTaS : Challenge WEB 4  (2) 2017.03.23

지금까지 배운 내용들로

다양한 클래스들을 이해해보겠다.

자바에는 다양한 클래스들을 지원해주는데
오늘 알아볼 클래스는
 Wrapper, BIgInteger, BigDecimal, 난수 생성 함수, 문자열 토큰 이다.

1. Wrapper 클래스

Wrapper 클래스는 기본 자료형의 데이터를 인스턴스화 시키는 클래스이다.
Wrapper란 말 그대로 감싸고 있다는 것이다.

데이터 클래스를 의미한다.

이런걸 Boxing 이라고 하고 반대는 Unboxing이라고한다.
자바5.0부터는

Auto Boxing, Auto Unboxing이 지원 되서
클래스 생성선언 없이도 바로 생성되어 지원된다.

ex)


Integer iValue = 10; // auto boxing
Double dValue = 3.14;
int num1 = iValue; // auto unboxing
double num2 = dValue;


문제 20-1
static 메소드를 이용하여  Boxing 해보아라.

(valueOf(); 메소드 사용)





(실행 화면)



이러한 Wrapper 클래스안에 valueOf 의 메소드가 있다. 이 값을 이용하면 Wrapper 클래스의 인스턴스를 생성할 수 있다.

그런데 결과 화면을 보면 동일한 인스턴스라고 나온다.

저장되는 데이터는 문자열과 같이 수정이 불가능하다. 그렇기 때문에 메모리 효율 상 같은 인스턴스를 여러개 만들 필요가 없는것이다.
값을 변경하려면 새로운 인스턴스를 만들어 참조값을 변경해주면 된다.

현재 iValue1 과 iValue2는 같은 인스턴스를 참조하고 있다.


2. BigInteger, BigDecimal 클래스
매우 큰 수( BigInteger)
가장 표현범위가 넓은 long형으로도 표현이 불가능한 수를 표현할때 사용한다.
ex)

BigInteger bigValue1 = new BigInteger("10000000000000000000000000000");


왜 입력을 문자열로 넣을까?
그 이유는 정수로 넣게되면 그 정수를 옯겨줄 매개변수가 필요한데
가장큰 long형으로도 커버가 안되기 때문에
문자열로 입력해야하는 것이다.

BigDecimal
-> 정확한 소수점 표현

처음 자료형을 배울때 float나 double의 소수점 표현에
오차가 있다고 말했다.
하지만 오차가 없게 표현하려면
BigDecimal 함수를 사용하면 된다.
BigInteger와 같이 문자열로 입력된다.

문제 20-2
두 개의 실수를 입력받아 두 실수의 차를 절대값으로 계산하시오.




(BigDeciaml 이용 코드)




(실행화면)



결과를 보면 오차없이 계산된 것을 확인 할 수 있다.

3. 난수 생성

JAVA에는 java.util 패키지로 Random 클래스를 제공한다.
- boolean nextBoolean()   : boolean형 난수 반환
- int nextInt() : int형 난수 반환
- long nextLong() : long형 난수 반환
- int nextInt(int n) : 0이상 n미만의 범위 내에있는 int형 난수 반환
- float nextFloat() : 0.0 이상 1.0 미만의 float형 난수 반환
- double nextDouble() : 0.0 이상 1.0 미만의 double형 난수 반환

괄호() 안에는 seed 값이 들어간다.
default 값은 System.currentTimeMillis() 이다.
시간에 관련한 seed 값이 들어간다.

4. 문자열 토큰

- 문자열에서 구분자를 이용해 문자열을 구분하는 방법이다.
ex)
14:99 
위 글자에서 ' : ' 를 구분자로 하여 14와 99를 구분할 수 있다.


StringTokenizer st = new StringTokenizer("14:99", ":");

public String nextToken() // 다음 토큰 반환 메서드




(*참조 - 난 정말 JAVA를 공부한 적이 없다구요, 윤성우)





오늘의 주제는

* 실수는 어떻게 구분할까?
 1.4, 10.2, .... 
* 음수는 어떻게 구분할까?
 -2, -4

에서 부터 시작된다.

성적처리프로그램을 만들 던 중
입력으로 들어오는 값 중
음수, 실수(소수점자리수)를 어떻게 구분할까? 라는 문제제기가 되었다.

먼저 음수와 실수의 특징들을보면

음수일 경우
 
 -10, -2, ......  ( 맨 앞에 대쉬(-)로 시작하고 이어서 숫자가 나오는 경우 )
  
실수일 경우
 23.2    ( 숫자나오고 .(점) 문자 후 바로 숫자 )

이러한 문자열들을 구분할 수 없을까?

먼저, str.isdigit() 함수에서는 정수인지만 판별 할 수 있다.

먼저 자료 타입을 더 공부해본다.

파이썬에서 제공하는 자료 타입
 - list, tuple, set, dictionary

리스트
 - 데이터들의 순서열(sequence)
 - 리스트내의 원소들의 값을 변경 할 수 있다. *
 - 인덱스 : 0부터 시작한다.
-  표현 : [ ] 이 기호 안에 입력한다.


(리스트 예시, 값을 변경하는 모습)


튜플
 - 리스트와 거의 동일 (차이점 : 투플내 원소들을 변경할 수 없다.)
 - 문자열은 튜플이다. (문자열은 변경되지 않는다.) *
 - () 소괄호로 표시한다.
 - 문자열도 튜플이기 때문에 변경할 수 없다.


(튜플을 정의하고 출력하는 모습, 값을 변경하는 경우 에러가 발생한다.)


* 리스트나 튜플의 특징을 이용하면 음수나 실수를 구분 할 수 있다.

이러한 특징 중 내장함수들을 잘 이용해야한다.
https://docs.python.org/3/library/index.html


위의 홈페이지에 들어가보면
파이썬에 관련된 문서들을 찾아볼 수 있다.


(파이썬 공식홈페이지 참조)


순서열에서 사용가능한 연산자들
순서열 -> 문자열, 리스트, 튜플 등등
x in s  -> 순서열 검색  s 문자열 내에 x순서열이 존재하는지 체크하는 연산자
s * n   -> s 순서열을 n번 반복 (n은 숫자)
s[i]    -> s 순서열 내 i번째 원소 가리키는 표시.

s[i:j]   -> i번째에서 j번까지 잘라냄  j번을 포함하지 않는다. j번전까지 해서 잘라짐.
len(s)   -> s의 길이를 표현 
s.index   -> 순서열이 시작하는 위치
s.count   -> 얼마나 있는지 카운팅함   (안되는 경우도 있다.)


(연산자 사용 예시)


- 슬라이스 가능 -> 슬라이스는 원 자료를 변형시키는 것이 아니라
                              잘라진 새로운 자료을 만드는 것이다.

* sample = [1, 2, 3, 4, 5]
sample은 위 리스트의 주소를 가지고 있는 참조 변수이다.
그런데 슬라이스는 새로운 자료를 만드는 것이므로
슬라이스해서 입력하면 기존 자료가 변하지 않는다.  -> 그래서 튜플도 슬라이스가능한 것이다.


(참조변수로 사용되는 리스트 변수이름)


* partition을 이용해 실수를 체크해보겠다.
  -> 파티션은 기준으로 부터 3개의 튜플로 반환한다.


(str.partition(x) 사용 예시)


* 동시지정문 이용
(n, x, m) = '1.4'.partition('.')


(동시지정문으로 .partition 된 결과를 입력받는 모습)


* partition 은 문자열에서만 제공하는 메소드이다.
   다른 리스트나 이런데서 사용할 수 없다.

모듈 -> 함수를 모아둔 파일을 모듈이라고 한다.
* 파이썬에서의 함수 작성
입력에 대해 출력이 없으면 프로시져라고 부르고
            있으면 함수라고 부른다.

1. 함수(function)
 - 출력을 나타내면 함수라고한다.

2. 프로시져(procedure)
 - 입력에 대해 출력이 없으면 프로시져라고한다.

3. 메서드(method)
 - class 내에 선언된 함수를 정의하면 메서드라고 한다.

-> 결국 세개가 다 같은 맥락이다. 만드는 방법도 같다.

파이썬에서의 함수 정의
ex)
 f(x) = 2x + 10      정의
 이 함수를 파이썬에서 그대로 표현한다면
 def f(x):
  return 2* x + 10


(함수 표현)


여러개의 값을 동시에 return도 가능하다. -> 파이썬에서는 동시지정이 가능하기 때문이다.


(동시지정문으로 하나의 함수에서 여러값을 return받는 모습)


위의 기능들을가지고
isneg()  -> 음수판별
isfloat()  -> 실수판별
함수를 만들 수 있을 것이다.

다음시간에 만들어 보겠다 :)









+ Recent posts