webhacking.kr 46번 문제를 보면 다음과 같다.
우선 SQL INJECTION이라고 출력되어 있으니 SQL INJECTION 문제인 것 같다.
일단 페이지 소스를 보자.
index.phps가 힌트로 주어졌으니 일단 들어가 소스를 보도록 하자.
소스코드를 분석해보자.
GET 방식으로 lv 값을 전달받으며, lv 값에 공백, /, *, % 가 있으면 없앤다.
그리고 union, select, from, challenge, 0x, limit, cash 가 있으면 종료한다.
select문을 이용해 가져온 데이터 값을 변수 q에 저장한다.
q 값이 있고, lv 값이 있으며 q[0]의 값이 admin이면 문제가 풀린다.
일단 1을 입력해 보면 다음과 같은 화면을 볼 수 있다.
lv 값을 1로 넘겼을 때 변수 q의 값은 "zzibong"인 것을 알 수 있다.
다른 값을 넘기면 아무것도 출력이 되지 않는다.
우선 query문을 다시 보자
select id,cash from members where lv=$_GET[lv]
이를 우회하기 위해 다음과 같은 쿼리문을 만들면 될 것 같다.
select id,cash from members where lv=x or id='admin'
x는 1이 아닌 임의의 값이면 된다.
이유는 lv=1은 zzibong의 값이기 때문이다.
위에서 처럼 쿼리문을 만들 때 공백을 넣으면 안된다. 입력된 값에서 공백을 없애버리는 필터링이 걸려있기 때문이다. 이를 우회하기 위해서는 %0A나 %0D를 이용하면 된다.
또한 입력창에 입력을 하면 안된다. 그 이유는 입력창에 입력된 값은 GET 요청을 할 때 URL 인코딩이 되어 전달되기 때문이다. 따라서 URL에 직접 입력을 해야 한다.
아래와 같은 공격구문을 URL에 넣으면 다음과 같은 화면을 볼 수 있다.
3%0Aor%0Aid='admin'
처음 화면이 나타난다.
" ' "를 없애는 기능이 켜져있는 것 같다.
이를 우회하기 위해 char() 함수를 이용한다.
다음과 같이 입력을 하면 문제가 풀린다.
3%0Aor%0Aid=char(97,100,109,105,110)
'Wargame > webhacking' 카테고리의 다른 글
[webhacking.kr] 53번 문제 (0) | 2017.06.18 |
---|---|
[webhacking.kr] 49번 문제 (0) | 2017.06.18 |
[webhacking.kr] 39번 문제 (0) | 2017.06.18 |
[webhacking.kr] 38번 문제 (0) | 2017.06.18 |
[webhacking.kr] 35번 문제 (0) | 2017.06.18 |