본문 바로가기
Web/Webhacking.kr

Webhacking.kr Challenge old-61 문제 풀이

by jh117jh 2023. 7. 1.
728x90

이번에 풀 문제는 61번!

 

이번 문제의 조건들은

 

1. 만약 id 파라미터 값이 없으면 guest로 지정된다.

2. id 파라미터 값을 addslashes함수로 필터링한다.(addslashes함수는 Lord of sql에서 다뤘듯이 DB오류를 방지하기 위해 싱글쿼터('), 더블쿼터("), 슬래쉬(/), Null 앞에 \를 넣어 문자열로 취급하게 해주는 함수)

3. select, from, by, 점(.), 쉼표(,), \) 등 필터링

4. id 파라미터 값의 길이를 15미만으로 제한

 

 

sql문은 id 파라미터를 컬럼값으로 받아 chall61 테이블에서 id 컬럼을 내림차순으로 정렬한 값들 중 1개 (위에 있는)를 출력한다.

 

그리고 출력된 id값을 화면에 나타나게 해 주고 admin이라는 id값이 출력되면 문제가 풀린다.

 

테스트로 id 파라미터에 id를 입력해 보면

test라는 id값이 출력되는 걸 볼 수 있다.

 

이로써 chall61이라는 테이블이 

 

No id password
1 test 123
... ... ...
10 admin 123

이러한 형태로 정렬되는 것을 짐작할 수 있다. (제가 임의로 만든 테이블입니다.)

 

그러면 admin의 값을 어떻게 위로 올려서 출력되게 할 것인지가 문제인데

from 필터링과 길이제한으로 주석을 이용하여 sql문을 변경하는 것은 불가능해 보인다.

 

또한 union을 이용하여 컬럼을 추가해 볼까 했는데 그것도 길이제한으로 막혔다.

 

고민 끝에 구글에 찾아본 결과

 

사람들은 sql의 기능 중 하나인 ALIAS를 썼다는 것을 알 수 있었다.

 

ALIAS란

ALIAS는 값에 별칭을 주어 접근을 별칭형태로 할 수 있도록 하는 역할을 하는데, 데이터값, 컬럼, 테이블, 서브쿼리등에 사용할 수 있다.

 

사용 예로는 select [대상] AS [별칭명] from [테이블]  형태이다. (여기서 AS는 생략 가능하다. select [대상]  [별칭명] from [테이블])

 

예를 들어 

이 테이블에

 select id AS user_id from chall61이라는 sql문을 작성하면

이러한 형태로 출력된다.


그렇지만 컬럼명을 변경하여 출력하는 것으로 어떻게 admin을 위로 정렬하는지 도무지 이해가 되지 않았다...

 

다들 ALIAS를 사용한다고만 했지 어떠한 방식으로 동작하여 문제가 풀리는지 설명하는 글은 찾지 못했기 때문이다.

그래서 저와 같은 분들을 위해 제가 찾아낸 방식에 대해 공유하려 한다.

 

우선, ALIAS가 사용되긴 하지만 그전에 알아야 될 sql의 특징이 있다.

 

테스트를 하기 위해 간단하게 member라는 테이블을 만들어봤다.

 

우리는 항상 존재하는 컬럼 (No, id, password)만을 사용하여 출력을 하는게 일반적이었을 것이다.

 

하지만 "임의 값"을 넣으면 컬럼 명과 값들이 전부 임의 값으로 가상의 컬럼이 출력된다. (여기서 핵심은 컬럼명이 아니라 값 즉, 문자열로 넣어야 된다.)

 

예를 들어

"안녕하세요"라는 임의 값을 넣어 sql문을 작성해 보겠다.

 

일반적으로 sql문을 작성해 본 사람들이라면 당연하게 ' 컬럼명도 아니고 값을 넣었는데 에러 뜨는 거 아냐? '라고 생각하실 수 있다.

 

하지만 

실행 결과 컬럼명과 값이 "안녕하세요"라는 값의 가상의 컬럼이 출력되는 것 을 볼 수 있다.

이는 실제 존재하지는 않지만 출력만 되는 것이다.

 

여기서 ALIAS를 통해 컬럼명을 변경하면

 

id라는 컬럼명에 값이 "안녕하세요"라는 형태의 테이블이 출력되는 것을 볼 수 있다.

 

바로 이러한 특징을 이용하여 가상의 컬럼을 출력해 id값을 admin으로 출력하는게 이 문제의 풀이 방식이다.

 

그러면 바로 적용하여

 

id 파라미터값에 "admin" AS id를 넣으면 문제가 풀릴 것이다.

 

하지만 addslashes함수로 더블쿼터(")가 필터링되므로

"admin"값을 다르게 넣어줘야 한다.

 

Lord of SQL을 풀면서 다양한 우회방법을 봤었는데 (char함수, hex)

 

길이제한이 있으므로 hex방법을 사용한다.

 

"admin"을 hex값으로 나타나면 0x61646d696e로 나타낼수 있고 AS는 생략이 가능하므로

 

0x61646d696e id를 넣어주면 문제가 풀리게 된다.

728x90