티스토리 뷰
Admin page 라는 표시와 함께 ID, PW를 입력해서 로그인을 할 수 있고, Source 가 있는 것을 볼 수 있다.
먼저, 소스를 보면 id, pw를 입력받아서 pw는 md5() 함수를 거친 다음 비교를 통해서 id가 admin 일 경우 문제를 풀 수 있다.
간단하게 id 부분에 admin'-- - 을 넣고 pw 부분에는 임의의 값을 집어넣어서 인증 우회를 시도하였으나 실패하였다.
소스 코드 상에는 나와있지 않지만 '(single quote)를 입력할 경우 \(backslash)가 붙어서 우회가 정상적으로 되지 않는 것 같다.
다른 방법을 찾아보기 위해서 소스를 다시 보면 md5() 함수에 true 라는 옵션이 추가되어 있는 것을 볼 수 있다.
string md5 ( string $str
[, bool $raw_output
= false ] )
raw_output
If the optional raw_output
is set to TRUE
, then the md5 digest is instead returned in raw binary format with a length of 16.
http://php.net/manual/en/function.md5.php
true로 설정되어 있기 때문에 pw로 입력한 값이 바이너리 형태로 출력이 되는 것을 알 수 있다.
MySQL에서 WHERE 조건절에 pw='ABCD'='EFGH' 이와 같이 비교를 두 번하면 마지막에 있는 값은 앞에 있는 값이 참이냐 거짓이냐를 비교한다.
select id from challenge_51_admin where id='$input_id' and pw='$input_pw'
id는 admin을 입력하고 pw에는 ABCD'='EFGH 를 입력하면 결과는 다음과 같다.
select id from challenge_51_admin where id='admin' and pw='ABCD'='EFGH'
select id from challenge_51_admin where id='admin' and pw='ABCD'='EFGH'
pw가 ABCD는 거짓이다.
select id from challenge_51_admin where id='admin' and 거짓='EFGH'
EFGH는 문자이기 때문에 거짓과 같은 의미를 가진다.
select id from challenge_51_admin where id='admin' and 거짓=거짓
따라서, 거짓=거짓은 참이기 때문에 참인 조건이 된다.
select id from challenge_51_admin where id='admin' and 참
이 점을 이용해서 출력되는 값 중에서 '=' 가 있는 값을 찾아보았다.
md5(1839431,true)를 하면 '=' 를 포함한 값이 되는 것을 알 수 있다.
값을 알아내는 데 사용한 코드는 다음과 같다.
id는 admin, pw는 1839431를 입력해주면 앞에서 설명한 것과 같이 문제를 우회해서 풀 수 있다.
'Wargame > Webhacking.kr' 카테고리의 다른 글
Challenge 56 (0) | 2015.09.07 |
---|---|
Challenge 55 (0) | 2015.09.06 |
Challenge 54 (0) | 2015.09.06 |
Challenge 53 (0) | 2015.09.06 |
Challenge 52 (0) | 2015.09.06 |
Challenge 50 (0) | 2015.09.05 |
Challenge 49 (0) | 2015.09.03 |
Challenge 48 (0) | 2015.08.31 |
Challenge 47 (0) | 2015.08.31 |
Challenge 46 (0) | 2015.08.29 |