본문 바로가기

웹 해킹

웹 해킹 공부 일기장 2 - 과제

1. doldol 계정의 데이터만 가져오기 (하나의 계정 데이터만 출력)

내 정보 출력

 

나의 password를 적으면 정보를 출력해주는 사이트가 있습니다. 이 사이트는 비밀번호가 맞는 지 검사하기 때문에 사진처럼 우리가 입력한 패스워드로 쿼리문을 만들어 아이디와 비밀번호가 둘 다 맞는 정보를 가져옵니다.

 

쿼리 확인

 

일단 SQL Injection을 통해 전체 계정의 정보를 출력해볼 수 있습니다.

// 입력: 'or '1'='1

select * from memeber where id='normaltic' and pass='' or '1'='1';

 

이렇게 입력하면 where 조건을 검사하여 조건에 맞는 데이터를 select하여 우리에게 보여줍니다.

우리는 논리 연산인 and, or 에도 우선순위가 있어 and가 먼저 계산되는 것을 압니다.

 

그렇기 때문에 id가 normaltic이고 비밀번호는 비어있는 데이터는 없으므로 해당 부분이 거짓이 됩니다.

그리고 where false or '1'='1'을 검사하는 것이되어 '1'='1'은 참으로 전체 결과는 참이되어 where true의 데이터를 가져옵니다.

 

만약 코딩 시 if (true)를 하면 조건이 참이되어 무조건 if문이 실행되는 것처럼

select * from member where true 를 하게 되면 조건이 그냥 참이 되어 member테이블의 전체 데이터를 select 하게 됩니다.

member table 데이터

 

member 테이블의 전체 데이터를 가져와보았습니다. doldol계정이 있습니다. 우리는 이 doldol계정하나만 출력하기 위해서 어떻게 해야할까요? 

 

서버측에 저장되어있는 쿼리는 아래와 같고 이 부분은 우리가 변경할 수 없습니다.

select * from member id='normaltic' and pass='입력한 값';

 

1. doldol의 아이디 사용하기

' or id='doldol

 

and 부분은 거짓으로 만들고 or 을 사용하여 id가 doldol인 데이터를 가져오라고 조건을 주어 doldol 계정의 데이터만 출력했습니다. 

 

2. doldol의 비밀번호를 사용하기

1번과 마찬가지로 비밀번호가 aaaa 인 데이터를 가져오라고하면 doldol 계정의 데이터만를 출력할 수 있습니다.

비밀번호 사용하여 출력하기

 

3. doldol계정의 나머지 데이터 사용하기

doldol 계정의 아이디와 비밀번호 말고 다른 데이터도 있습니다. 이것을 사용하여 1, 2번과 마찬가지로 doldol계정만 가져올 수 있을 것입니다. 하지만, 우리는 다른 데이터들의 컬럼은 모릅니다. (물론 하나는 딱봐도 이메일인것 같긴 하지만요....)

 

이번주차 정리에서 우리는 컬럼을 저장하고 있는 데이터베이스가 있다는 것을 알고있죠!! 이것을 사용하여 컬럼을 알아봅시다.

' union select 1,column_name,3,4 from information_schema.columns where table_name = 'member

컬럼 이름 출력

 

음... 보니까 email 과 info 인 것 같습니다. info가 information의 앞 부분으로 보통 추가 정보를 저장하기 때문입니다.

email 사용
info 사용

 

이렇게 doldol 계정 하나만 출력해보았습니다. 이것 말고도 또 있을까요?

테이블의 전체 데이터를 출력할 때 doldol계정은 첫번째에 출력됐습니다. 테이블에서 첫번째 행만 가져오라고하면 doldol계정 하나만 가져올 수 있지 않을까요?

 

4. limit 사용하기

' or 1 limit 0,1 #

 

우리가 '1'='1을 적는 이유는 서버측에 이미 있는 쿼리가 '로 끝나기 때문에 해당 부분을 참으로 만들기 위해서 사용합니다.

결국!!! 우리는 이 부분을 참으로 만들기 만하면 되기때문에 1을 사용하여도 참이 됩니다. (true를 사용해도 되고요... 방법은 많습니다.) 

그래서 결론은 전체 데이터에서 limit를 사용하여 인덱스 0부터 한행만 가져와라가 되기때문에 첫번째인 doldol계정을 가져오게 됩니다.

order by는 1이 첫번째 컬럼이었는데 이것은 0이 첫번째 행입니다.

 

이것 말고도 엄청많을 겁니다. 어떻게든 doldol계정만 출력할 수 있으면 되니까요.

normaltic의 비밀번호를 아니까 or 말고 and를 사용하여도 되고 union select를 사용하여도 될 것입니다.

 

하지만, limit를 사용하여 SQL Injection을 해보라고 이 과제를 주신것 같아 1번 과제는 여기까지 하겠습니다.