본문 바로가기
category/웹해킹(webhacking.kr)

웹해킹(webhacking.kr) - 49번

by 자운대고라니 2020. 11. 17.
반응형

안녕하세요??

자운대 고라니입니다.

오늘은 wargame.kr old-49번 문제를 풀어보겠습니다.


 

첫 화면을 보면 text박스에 1이라는 값이 고정돼 있고, 제출이란 버튼이 있다.

문구로 나와있듯  SQL INJECTION문제임을 알 수 있다.

일단 제출 버튼을 눌러봤다.

 

udnrg라는 값이 나왔다.

2,3,4라는 값을 넣으면 이상한 5자리 문자열이 출력되는데, 그 문자열에 뭔가 있을 줄 알고 분석해봤지만 아무런 단서도 안 나왔다.

일단 view-source 로 php소스코드를 확인해보았다.

해당 소스코드는 문제를 푸는데 주요 코드이다.

preg_match함수를 활용하여 sql injection에 필요한 문자열 대부분을 막아놨다. (',",or,and 등)

or = ||

and = &&으로 우회할 수 있고, 문자열 입력하는 부분은  ASCII, HEX(16진수), BIN(2진수)로 우회할 수 있다.


1. ASCII

select id from chall49 where lv={$_GET['lv']} 빨간색으로 표시된 부분에 injection 구문을 넣어야 한다.

나는 10||id=char(97,100,109,105,110) 라는 값을 넣어보려 했다.

select id from chall49 where lv=10||id=char(97,100,109,105,110)

이렇게 대입한다면 앞의 lv=10 은 거짓이 되고 || 뒷부분의 id=char(97,100,109,105,110) - (admin의 ASCII값)

은 참이 되므로 쿼리문을 줄여본다면

select id from chall49 where id=char(97,100,109,105,110)라고 나온다.

해석하자면 "chall49 테이블의 id='admin'인 부분의 id데이터를 가져온다." 이므로 문제가 풀린다.....라고 생각했으나,

preg_match부분에 [,]도 필터링된다는 것을 이제 알았다....

 

그러므로 나는 HEX값을 대입하여 문제를 풀었다.


2. HEX

ASCII파트에서 상세한 설명을 했으므로 어떤 쿼리문만 넣었는지 설명하겠다.

HEX값을 쿼리문에서 처리할 때 0x[16진수]를 넣으면 된다.

예를 들어서 admin이라는 값을 넣으려면, 0x0x61646D696E 라는 값을 넣으면 된다.

그러므로 5||id=0x61646D696E 를 text에 넣어봤다.

문제가 풀렸다.

처음 푸는 사람이라면 score가 올라갈 것이다.

BIN우회도 보여주고 싶었지만 솔직히 별 의미는 없는 것 같아서 궁금하다면 직접 해보는 것을 추천한다.

 

반응형

댓글