안녕하세요. 오늘은 webhacking 61번 문제를 풀어보겠습니다.

홈페이지로 들어가 webhacking 61번 문제를 눌러주세요.


정말 쿨하게 나와있네요. source를 눌러줍시다.

여기선 solve 대신 clear가 나와있네요. q[id]=admin이면 해결된다네요. q부분을 한번 봅시다. mysql_query를 통해 query문을 실행하는군요. 

select $_GET[id] : 입력받은 id를 검색한다는 뜻입니다.

from c_61 : c_61 테이블에서 라는 뜻입니다.

order by id desc : order by는 정렬하는 함수이구요. desc는 내림차순을 의미합니다. 즉 id칼럼을 내림차순으로 정렬하라라는 뜻입니다.

limit 1 : 데이터를 가져올 갯수를 뜻합니다. 여기선 id의 맨 첫번째 줄에서 1개를 가져온다는군요. 

limit 1때문에 id를 전부가져오란 명령어를 꺼내도 내림차순 된 id 하나밖에 나오지 않습니다.

내림차순으로 정렬되었으니 가장 으뜸인 z가 맨위에 있는 것이지요.

그렇다면 우리는 어떻게 해야할까요? 

주석문을 넣어 뒤쪽의 조건을 전부 무력화시키면 어떨까요? 쿼리문은

'admin' from c_61--가 되겠죠. 이렇게 되면 참 좋겠습니다만 소스에 보시면

if(eregi("\(|\)|union|select|challenge|from|,|by|\.",$_GET[id])) exit("Access Denied");

가 있습니다. 해당문자열이 들어갈 경우 접근금지 라는 메세지를 출력한답니다.

from이 금지어로 되어있기 때문에 주석문은 의미가 없어졌습니다. 그렇다면 우리는 select문의 비밀을 이용해 풀어보겠습니다.

select id 는 id칼럼에서 검색하라라는 소리입니다. 이건 다들 아시는겁니다만

select 1 id 는 무슨 뜻일까요? 

1이란 값의 별명을 id로 주어 이 id를 칼럼명으로 쓰겠다는 뜻입니다.  그렇게 되면 결국 id칼럼안에 1값이 들어가지게 됩니다. 이것을 칼럼별칭(column alias)이라고 합니다.

그렇다면? select admin a는 무슨 뜻일까요?

admin이란 값의 별명을 a로 주어 이 a를 칼럼명으로 쓴다는 뜻입니다. 그렇게 되면 a칼럼안에 admin 값이 들어가지게 됩니다. 이방법을 사용하면 됩니다. 다만

위와 같이 q[id]가 admin이 되어야 하므로 쿼리는 select admin id 이렇게 써줘야 합니다. 이렇게 해야 id칼럼안에 admin값이 들어가지게 됩니다.  그렇게 되면 뒤쪽의 문구는 쓸모가 없어집니다. 이미 q[id]안에 admin이 들어가졌으니 뭘 어떻게 해도 admin을 뽑게 되어있습니다.

다만 문자열 admin을 입력하기 위해선 '를 입해야 하는데 이 '가 magic_quotes_gpc에 의해막혀있습니다. 게다가 ()도 필터링이 되있기 때문에 char 함수도 사용할 수 없습니다. 그래서 저번에 한 것 처럼 hex값을 줘서 풀이합시다.

admin의 헥스값은 0x61646d696e입니다. 입력칸이 따로 없으니까 주소창에 적어줍시다.

변수를 입력하기전에 ?를 붙여주셔야 합니다.

네 이것으로 문제풀이를 마치겠습니다.

'Webhacking' 카테고리의 다른 글

webhacking - 42번 문제  (0) 2015.09.18
webhacking - 58번 문제  (0) 2015.09.18
webhacking - 49번 문제  (0) 2015.08.07
webhacking - 21번 문제  (0) 2015.08.02
webhacking - 46번 문제  (0) 2015.08.01
Posted by englishmath
,