Webhacking Writeup 27번 문제입니다
사이트에 접속하니 소스코드를 줍니다.
소스코드를 열어보겠습니다.
봐야할 부분만 캡쳐해봤습니다.
해석해보면 일단 no라는 값을 GET방식으로 전달받되
#, select, ( , 공백, limit, =, 0x 를 필터링한다고 합니다.
다음구문을 보면 chall27 이라는 테이블에서 id를 조회하되
조건은 id=guest로 고정되어있고 우리가 입력한 no를 전달받는 구문입니다.
guest로 로그인하면 guest를 출력하고
admin으로 로그인하면 문제가 해결된다고 합니다.
주석으로 admin의 no=2라고 힌트를 제공해줍니다.
즉 admin으로 값을 도출하는 방식도 가능하지만
여기서는 no=2라는 방식을 이용해 해결해보라는 것으로 알 수 있습니다.
일단 1을 입력해보면
guest로 로그인이 됩니다.
no=2 라고했으니 2를 입력해보면
네 쿼리 에러가 출력됩니다.
당연합니다 id=guest로 고정되어 있기에 이부분을 무시해야만
우리는 admin으로 로그인이 가능해집니다.
그러면 or를 사용해 구문을 False로 만든다음
입력한 구문을 실행하고 뒤의 구문은 주석처리해야합니다.
왜냐하면 우리는 필터링으로 괄호를 여는건 안되지만
닫는건 되게 필터링이 되어있습니다.
현재 아래와 같은 구문 일경우
no=({$_GET['no']})
중간에 괄호를 삽입해 닫은다음
or 를 이용해 no=2 라는 값을 출력후
주석처리로 뒤의 괄호를 무시해야 쿼리에러가 발생하지 않습니다.
해서 작성된 식은
no의 값을 False로 만들면서 구문을 한번 닫기 위해 no=4)로
공백이 필터링되어 있어 공백발생을 막기위해 or을 || 로 치환,
'=' 의 필터링으로 3>no&&no>1 을 사용했습니다.
이러면 no가 가능한 값은 2뿐이므로 no=2와 같게 됩니다.
마지막으로 맨뒤의 공백우회를 위해 ;%00을 사용
(공백우회에는 %23도 있지만 '#' 필터링으로 사용불가)
이를 정리하면
no=4)||3>no&&no>1;%00 가 되는데
이 식을 URL에 삽입해보면 실패합니다.
논리 연산이 아닌 비교연산으로 사용시 URL인코딩이 필요하더라구요
or은 논리연산을 위해서이니 그대로 두고
and는 숫자 비교를 위한 비교연산이라 URL인코딩으로 바꿔줍니다.
그럼 최종 삽입식은
no=4)||3>no%26%26no>1;%00
으로 정리가 됩니다.
SQL 인젝션 공격을 시도해보면
문제가 해결되었습니다!
'Wargame(Web) > Webhacking.kr Writeup' 카테고리의 다른 글
Webhacking Writeup 42번 문제 (0) | 2022.08.15 |
---|---|
Webhacking Writeup 4번 문제 (0) | 2022.08.15 |
Webhacking Writeup 39번 문제 (0) | 2022.08.15 |
Webhacking Writeup 9번 문제 (0) | 2022.08.13 |
Webhacking Writeup 20번 문제 (0) | 2022.08.13 |