Webhacking Writeup 50번 문제입니다.
문제사이트에 접속해보면 45번 문제와 같은 페이지로 보입니다.
소스코드를 제공해주니 먼저 살펴보겠습니다.
이번에는 id=admin 일때 문제가 해결되는 것이 아닌 lv=3 일때 해결된다고 합니다.
이전 45번에서 사용했던 mb_convert_encoding을 똑같이 사용하고 있으니
%aa를 이용한다면 싱글쿼터 우회가 가능할 것으로 보입니다.
먼저 필터링을 살펴보면 GET방식으로 입력시
from, pw, (, ), , %, =, <, > 를 필터링 하고 있습니다.
일단 lv이 어떻게 해야 출력되는지 부터 보겠습니다.
guest를 그대로 입력하니 lv=1 이 출력됩니다.
그럼 싱글쿼터를 우회하는 방식을 이용해 2를 출력해보겠습니다.
이전 45번 문제와 비슷하게 %aa를 사용해서 식을 구성해보면
id=' or lv=2#&pw=guest
id=%aa%27||lv%0blike%0b2%23&pw=guest
첫번째 줄이 실제로 입력하고자 하는 식이고
두번째 코드가 URL인코딩과 공백,= 등의 필터링을 우회하여 작성한 코드입니다.
위 코드를 입력했을때 lv=2가 그대로 출력되는 것이 확인됬으니
목표인 lv=3을 출력하기위해 2를 3으로 바꿔봤는데
Wrong가 출력됩니다.
코드를 다시 자세히 살펴보면
$result lv=="3" 즉 result의 lv이 3과 같아야한다 인데
result가 없다면 Wrong를 출력합니다.
즉 우리가 조회하는 DB에는 lv=3이 존재하지 않는다는 것을 알 수 있습니다.
그러면 강제로 3을 만들어야 한다는 건데 이럴경우
union select 3 을 이용할 수 있습니다.
비슷한 구성인 45번과 50번코드 필터링을 비교해 살펴보면
45번은 select 를 막고있고 50번의 필터링은 union을 id에서 막고 있습니다.
즉 select 3을 이용하는 방법이 가능하다는 것을 알 수 있습니다.
다시 50번 문제로 돌아와서
필터링이 union을 id에서 막고 있다면 반대로 pw부분에서는 가능하다고 볼 수 있습니다.
그런데 코드를 잘 살펴보면
$result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
id=' ' and pw=' '형태로 id와 pw값
즉 출력결과가 2개 이기에
union을 사용하여 나온 출력결과가 2개가 되지 않으면 정상적인 SQL구문이 아니라 실행되지 않습니다.
작성자는 여기서 많은 시간 삽집을 했습니다.
그러다 Los 사이트의 succubus 문제를 풀다가
id='\'&pw='union select 3# 형식으로 식을 구성하면
id='\'&pw='union select 3# 줄친 부분이 id에 입력되는 하나의 문자열로 인식되어
Union구문이 정상적인 실행이 되고 result의 lv이 강제로 3이 되는것으로
if구문에 성공하게 됩니다.
id='\'&pw='union select 3#
id=%aa\&pw=%0bunion%0bselect%0b3%23
해서 위와같이 식을 정리하고 정리한 식을 필터링과 URL인코딩을 거친
두번째 코드로 문제사이트 제출해보면
문제가 해결되었습니다.
Los의 succubus문제가 아니였다면 어떻게 id와 pw두개의 값을 결과로 가지는 쿼리에서
union을 써야할지 막막했을겁니다.
가끔은 못풀때는 다른 문제로 도망치는 것도 괜찮은것 같습니다.
'Wargame(Web) > Webhacking.kr Writeup' 카테고리의 다른 글
Webhacking Writeup 8번 문제 (0) | 2022.09.26 |
---|---|
Webhacking Writeup CHILD 문제 (0) | 2022.09.04 |
Webhacking Writeup 45번 문제 (0) | 2022.08.31 |
Webhacking Writeup 51번 문제 (0) | 2022.08.20 |
Webhacking Writeup 34번 문제 (0) | 2022.08.19 |