18번 문제를 보면
다음과 같이 no라는 input 창을 볼 수 있다.
이 때, form의 method가 get이고, action이 index.php임을 알게 된다.
따라서 index.phps를 보면 다음과 같다.
우선 입력 받은 값에서 스페이스나 select, union 등을 필터링하는 것을 알 수 있다. 또한 mysql_qurery()의 결과를 배열 형태로 저장하는 것을 볼 수 있다. 여기서 첫 번째 행, 즉 $q[0]이 admin인 경우 solve()를 호출한다.
따라서 “select id from challenge18_table where id=’guest’ and no=$_GET[no]”에서 첫 번째 결과 행이 admin이 되도록 해야한다.
where의 조건이
id = ‘guest’ and no = $_GET[no]이기 때문에
$_GET[no]가 {num} or no = {admin_no}이 되면,
( id = ‘guest’ and no = {num} ) or no = {admin_no}
와 같이 동작한다. 단, 이 때 {num}의 값이 guest의 no 값이 아니어야한다. 만약 guest의 no일 경우에는 첫 번째 결과 행($q[0])이 guest가 되기 때문이다.
no에 대한 정보를 알아보기 위해 0, 1, 2 등을 입력해보면
1을 입력했을 때 “hi guest”가 출력되는 것을 볼 수 있다.
따라서 guest의 no가 1임을 알게 된다. 이 때 admin의 no는 0 또는 2일 것이라는 추측을 할 수 있다.
이제 해야할 일은
0 or no = 2를 필터링 된 문자를 이용하지 않고 입력하는 것이다.
스페이스를 이용하지 않고 입력하는 방법에는 여러가지가 있는데 지금 사용할 것은 \n에 해당하는 %0a이다.
따라서 0%0aor%0ano=2를 입력하면 된다.
그런데 입력 창에 해당 값을 입력할 경우, url 인코딩으로 인해
0%0aor%0ano=2 이
0%250aor%250ano%3D2 으로 변환된 것을 알 수 있다.
따라서 input 창이 아닌 url에 직접
?no=0%0aor%0ano=2 으로 입력해야 한다.
위와 같이 입력하면 clear할 수 있다.
'Wargame > webhacking.kr' 카테고리의 다른 글
webhacking.kr 26번 (0) | 2019.01.29 |
---|---|
webhacking.kr 39번 (0) | 2019.01.29 |
webhacking.kr 16번 (0) | 2019.01.29 |
webhacking.kr 17번 (0) | 2019.01.29 |
webhacking.kr 14번 (0) | 2019.01.29 |
댓글