본문 바로가기
작업/Webhacking.kr

webhacking.kr old-39 이해하기

 

 

 

 

old-39 페이지는 입력이 가능한 텍스트 상자와 view-source가 제공되어 있습니다.

view-source를 확인해 보았습니다.

 


소스 코드 분석

 

 

 

사용자에 의해 입력되는 값 id에 대하여 여러 작업을 거치는 것을 알 수 있습니다.

 

 

str_replace() 함수에 의해 \\이나 작은따옴표(')가 값으로 들어온다면

각각 공란과 작은따옴표 2개 ''가 됩니다.

 

 

substr() 함수는 문자열의 일부분을 추출하는 역할을 합니다.

substr($_POST['id'], 0, 15);는 $_POST['id']에 저장된 문자열에서 인덱스 0부터 15자리를 추출합니다.

 

 

 

데이터베이스에서 값을 가져오는 조건을 보겠습니다.

 

 

length(id) < 14  and  id = ' {$_POST['id' ]}

 

 

사용자가 입력한 값의 길이가 14자리 미만이고,

데이터베이스에 등록된 id가 '{$_POST['id']}와 일치해야만 값을 가져올 수 있습니다.

 

 

중요한 것은 사용자 입력 값 앞에 '(작은따옴표)가 붙어있기 때문에

데이터베이스 id에 요청되는 값의 형태는 '값'처럼 작은따옴표에 갇혀있어야 하는 것입니다.

그렇지 않다면 문법 오류로 제대로 작동하지 않을 것입니다.

 


문제 해결

 

이번 문제 해결의 열쇠는 데이터베이스인 mysql에서 문자열을 취하는 방법과

substr() 함수로 값이 변경되는 것을 활용하는 것에 있습니다.

 

 

먼저, substr()에 의해 값이 변경되는 것을 활용하는 것입니다.

 

 

\\는 중요하지 않지만, 작은따옴표(')는 주의해서 보아야 합니다.

겉보기에는 큰따옴표(") 같지만 작은따옴표 2개가 연달아 붙은 형태입니다.

 

 

데이터베이스 질의에 id 값 형태는 작은따옴표에 갇힌 '값' 형태이기 때문에 마지막에 작은따옴표가 필요합니다. 하지만 작은따옴표를 그대로 입력하면 작은따옴표 2개로 부풀려지는 현상이 발생합니다.

 

 

그렇다면 작은따옴표를 입력의 가장 끝에다가 두면 어떻게 될까요?

 

old-39 HTML코드

 

 

페이지에서 주어진 텍스트 상자에서 입력의 최대는 15자리로 명시되어 있습니다.

즉, 입력은 최대 15자리까지만 가능하다는 것입니다.

 

 

그리고 php코드의 substr($_POST['id'], 0, 15); 문장에 의해 $_POST['id']값을 15자리까지만 받습니다.

이 말은 15자리 이후에 있는 문자들은 잘려나간다는 것입니다.

 

 

그렇다면 작은따옴표(')를 15번째 자리에 입력한다면?

2개가 형성되는 작은따옴표는 15번째 자리, 16번째 자리에 생깁니다.

하지만 필터링에 의해 16번째 자리 작은따옴표는 구실을 못합니다.

 

 

결국 작은따옴표 1개만 인식한다는 의미입니다.

 


 

두 번째로는 mysql의 문자열 취급 방법입니다. 

 

 

사용자가 입력한 값에서 공백 문자(space bar)가 존재한다면 데이터를 취급하는 과정에서 무시됩니다.

즉, 사용자 입력 값이 a인 경우와 a_ ( _기호는 공백 문자 대체)인 경우는 둘이 같다고 취급하는 것입니다.

 

 

 

 

해당 내용에 대한 자세한 설명은 아래 링크로 달았습니다.

 

woowabros.github.io/study/2018/02/26/mysql-char-comparison.html

 

MySQL에서 'a' = 'a '가 true로 평가된다? - 우아한형제들 기술 블로그

DB 알못의 어떤 리서치

woowabros.github.io

 

 

그렇게 되면 작은따옴표를 끝에 입력 자리까지 옮길 수 있으며,

데이터베이스에도 정확이 인식시킬 수 있게 됩니다.

 

 

admin_________'( _기호는 공백 문자)를 입력하게 된다면 데이터베이스가 인식하기에 admin'으로 인식하며, 데이터베이스의 length()에서도 admin'인 6자리로 인식하게 되는 것입니다.

 

 

값을 적용해 보겠습니다.

 

 

 

 

 

해결되었습니다!

 

 

 

-끝-

 

 

 

 

'작업 > Webhacking.kr' 카테고리의 다른 글

webhacking.kr old-31 이해하기  (0) 2020.09.06
webhacking.kr old-20 이해하기  (0) 2020.09.06
webhacking.kr old-26 이해하기  (0) 2020.09.06
webhacking.kr old-27 이해하기  (0) 2020.09.05
webhacking.kr old-38 이해하기  (0) 2020.09.03