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

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

? 보니까 46번 문제랑 똑같이 생겼습니다. 일단 제출을 해봅시다.

zzibong가 뜨는군요. 소스를 한 번 봅시다.

주석처리 되있는 index.phps가 보입니다. 주소창 뒤쪽에 붙여서 들어갑시다.

solve부분부터 봅시다. q[0]이 admin이면 해결이 된다는군요. 46번 소스랑 비슷하네요.

q부분을 봅시다. sql문을 실행시키네요. 입력한 lv에 맞는 id를 nembers에서 검색시켜서 반환한다는군요.

즉 이부분을 보시면 level이 1인 q값이 echo에 의해 출력되었습니다. level1의 q는 zzibong이군요. 그런데 칸에 다른 수를 입력해보시면 1을 제외한 다른 숫자는 출력이 되지 않습니다. 즉 lv1에 맞는 아이디는 하나밖에 없다는 것입니다. 하지만 우리는 id가 admin인 것을 뽑아내야 합니다. 그런데 lv에 맞는 admin이 없으므로 lv의 조건을 무력화 시켜줄 필요가 있습니다.

select id from members where lv=$_GET[lv] 라고 되어있는 문구에 lv값을 넣어 lv값의 조건을 무효화시키고 id가 admin인 것을 빼올려면 어떻게 해야할까요? 간단합니다.

select id from members where lv=1 or id='admin' 이 되게 하면 됩니다.

lv이 1값이거나 또는 id가 admin인 id를 검색한다. 즉 앞의 lv값이 1이든 2이든 3이든 100이든 앞의 조건을 무시할 수 있습니다. or이기 때문에 앞의 조건이 맞지 않아도 뒤쪽의 조건 id가 admin인 id를 검색하게 됩니다. 그런데 or이기 때문에 앞의 조건은 무조건 틀려야 하니까 lv의 값은 1을 제외한 값을 넣어서 앞의 lv조건이 무조건 틀리도록 해주셔야 합니다.

1만 아니면 되니까 아무값이나 넣어줍시다. 저는 2를 넣겠습니다.

select id from members where lv=2 or id='admin' 이렇게 해주시면 됩니다.

그런데 말입니다. 소스의 윗부분을 보시면 eregi가 있습니다. 해당문자열을 찾을 경우 그다음 명령어를 실행하는 함수입니다. exit()가 있는걸로 보아 문자열을 찾았을 경우 종료된다고 되어있네요. 즉 쉽게 말하면 금지어입니다. " "(뛰어쓰기)가 금지어고 or도 금지어네요. 그렇다면 or을 대신할 만한 것 중에서 띄어쓰기가 필요없는 것을 쓸 필요가 있습니다. 간단하죠.

||입니다. ||는 키보드 \위쪽에 있습니다. ||을 넣어주시면 2||id='admin'이 됩니다. 넣어줍시다.

lv칸에 입력하면 안되는 것이 보입니다. 아무래도 magic_quotes_gpc에 의해 '가 막힌 것 같습니다. 그래서 char을 이용하여 입력해보겠습니다.

2||id=char(97,100,109,105,110)가 되겠네요. 한번 입력해봅시다.

제출을 해봅시다. 안되네요...

문법으론 틀리지 않았습니다. 혹시 필터링을 잘못보았나 싶어 필터링을 쭉 자세히 살펴보았습니다.

if(eregi("\(",$_GET[lv])) exit();
if(
eregi("\)",$_GET[lv])) exit();

가로도 필터링이 되있었네요... 즉 char은 사용할 수가 없습니다. 그런데 admin을 '없이 char 사용 없이 표현할 수 있을까요? 굳이 char이 아니더라도 (가 금지되있기 때문에 다른 함수를 쓸 수도 없습니다. 그런데? 다른 함수를 쓰지 않고도 그 것의 고유한 값을 표현할 수 있는 방법이 있지요. 바로 hex값입니다. 

hex값이라 하여 사람들이 어려워 하는데 어려워 할거 하나 없습니다.

그냥 admin을 16진수로 바꿔주시면 됩니다. 프로그램이 구글에 널려있으므로 하나하나 바꿔 보시면 됩니다.

61646D696E이네요. 이 숫자가 admin을 16진수로 바꾼 값입니다.

그런데 그냥 입력하면 16진수인지 그냥 숫자인지 컴퓨터가 판별을 못합니다. 그래서 앞에 0x를 붙여 16진수임을 알립시다.

네 이것으로 문제풀이를 마치겠습니다. 참고로 굳이 16진수값이 아니고 2진수로 admin을 표현하셔도 됩니다. 다만 2진수로 하면 너무 길어지기 때문에 여기선 16진수로 했습니다.



'Webhacking' 카테고리의 다른 글

webhacking - 58번 문제  (0) 2015.09.18
webhacking - 61번 문제  (0) 2015.08.07
webhacking - 21번 문제  (0) 2015.08.02
webhacking - 46번 문제  (0) 2015.08.01
webhacking - 36번 문제  (0) 2015.07.30
Posted by englishmath
,