▼ Challenge 5는 다음과 같습니다.
Login을 누르면 로그인 폼이 있는 login.php가 나옵니다.
id를 "admin"으로 하면, "Wrong password"가 뜨고, id를 다른 것으로 하면 "id is not admin"이라고 뜹니다.
Join에 들어가서 "admin"을 새로 만들어서 로그인하면 문제가 풀릴 것이라는 추측을 해 봅니다.
그러나 Join을 누르면 Access Denied 경고 창이 뜹니다.
Burp Suite로 잡혀지지 않으므로, Script 구문에서 경고 창을 뜨우는 것 같습니다.
▼ 해당 Script 구문은 다음과 같습니다.
Login을 클릭하면 "mem/login.php"로 이동하고
Join을 클릭하면 묻지도 따지지도 않고 Access_Denied 경고 창을 띄우고 있습니다.
"mem/login.php"라는 주소에서 힌트를 얻어 "mem/join.php"로 들어가면 페이지가 존재하지만
Access Denied 경고 창이 뜹니다.
하지만 Burp Suite로 Response Body를 잡아본 결과
▼ 다음과 같은 Script 구문이 존재합니다.
▼ 대충 요약해 보면 다음과 같습니다.
if(eval("document.cookie").indexOf("oldzombie") == -1) {bye;}
if(eval("document.URL").indexOf("mode=1") == -1) { alert('access_denied'); history.go(-1); }
else{ Join Form 출력; }
그러므로, Cookie에 "oldzombie"를 입력하고, URL 뒤에 ?mode=1을 추가하면
▼ 다음과 같이 Join Form을 확인 할 수 있습니다.
여기에서 "admin"이라는 id를 만들면 "admin is already exists"가 출력됩니다.
처음에는 SQL에서 id의 속성이 Primary key 또는 Unique로 지정되어 있어 중복으로 만들지 못하는지 알고
이것을 위해 on duplicate key update 구문을 이용하려고 했지만, 계속 실패하였습니다.
INSERT INTO ~ ON DUPLICATE KEY UPDATE : Column의 속성이 Primary key 또는 Unique일 때, 해당 데이터가 존재하면 INSERT가 되지 않으므로, 사용자가 지정한 데이터로 UPDATE하기 위한 구문
admin 이외의 다른 계정을 중복으로 만들어도 계속 생성이 되는 것으로 보아,
INSERT 중복이 허용되는 것 같습니다.
그렇다면, SQL에서 중복을 확인하는 것이 아니라,
PHP 구문에서 입력 받은 ID가 "admin"이면 "admin이 존재합니다."라는 메시지를 띄우는 것 같습니다.
그러면, 무조건 "admin" 이외에 단어를 입력하되 SQL에서는 "admin"이라고 인식하게 만들어야 합니다.
▼ 저는 다음과 같은 방법을 사용하였습니다.
위 id 칼럼의 속성은 char(10)이므로 이에 초과하는 범위를 입력하면 뒷부분이 제거됨으로,
PHP 구문에서는 "admin 1" 이지만 실제 SQL에 입력되는 값은 "admin"이 됩니다.
이로써, "admin"이라는 ID로 Join을 할 수 있고 해당 계정으로 Login하면 Success!
'WarGame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] Challenge 11 :: Regular Expression (정규표현식) (0) | 2015.12.03 |
---|---|
[webhacking.kr] Challenge 07 :: SQL Injection (union) (0) | 2015.12.03 |
[webhacking.kr] Challenge 56 :: SQL (와일드카드) (0) | 2015.12.01 |
[webhacking.kr] Challenge 41 :: Error Functions (0) | 2015.11.30 |
[webhacking.kr] Challenge 37 :: 포트 포워딩 2 (1) | 2015.11.27 |