안녕하세요??
자운대 고라니입니다.
오늘은 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우회도 보여주고 싶었지만 솔직히 별 의미는 없는 것 같아서 궁금하다면 직접 해보는 것을 추천한다.
'category > 웹해킹(webhacking.kr)' 카테고리의 다른 글
웹해킹(webhacking.kr) - 48번 (0) | 2020.11.20 |
---|---|
웹해킹(webhacking.kr) - 44번 (0) | 2020.11.20 |
웹해킹(webhacking.kr) - 36번 (0) | 2020.11.18 |
웹해킹(webhacking.kr) - 22번 (0) | 2020.11.18 |
웹해킹(webhacking.kr) - 20번 (0) | 2020.11.17 |
웹해킹(webhacking.kr) - 19번 (0) | 2020.11.17 |
웹해킹(webhacking.kr) - 14번 (0) | 2020.11.16 |
웹해킹(webhacking.kr) - 17번 (0) | 2020.11.16 |
댓글