이번에 풀 문제는 59번!
들어가면 회원가입과 로그인 칸이 있고 id와 phone을 입력하게 되어 있다.
소스코드는 꽤 길긴 하지만 정리하면
POST[lid] = 로그인 id, POST[lphone]= 로그인 phone
- addslashes함수로 각각 싱글쿼터, 더블쿼터, \, Null 필터링
POST[id] = 회원가입 id, POST[phone]= 회원가입 phone
- addslashes함수로 각각 싱글쿼터, 더블쿼터, \, Null 필터링
- phone 입력 길이 20미만으로 제한
- 각각 admin 필터링
- phone에서 0x, #, hex, char, ascii, ord, select 필터링
마지막으로 lv값이 admin이면 문제가 풀린다.
우선 lv가 무엇인지 모르기 때문에 회원가입 후 로그인을 해보자
임의로 값을 넣고 회원가입후 로그인을 해봤더니
lv가 guest로 출력되었다.
여기서 유추해볼수 있는 게 회원가입 쿼리문에 마지막 추가 값에 guest라고 들어가 있는 게 보일 것이다.
( insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest') )
아마 이게 lv값인 것 같다.
또한, 회원가입에만 admin의 필터링이 되어 있고 필터링이 집중적으로 되어 있는 것을 보아
우리는 admin으로 회원가입을 한 후 로그인을 진행해야 된다.
우선 회원가입 insert문의 3번째 인자가 lv인걸 알고 있으므로 우리는 주석 처리를 이용해 lv값을 바꿀 수 있다.
insert into chall59 values('12',1,123)-- ,'guest')
이런 식으로 뒤에 guest가 주석처리된다.
addslashes 함수 때문에 lv에 정수값을 넣어봤는데 출력되는 걸로 보아 문자열이 아니어도 되는 것 같다.
그럼 123 부분을 admin으로 바꿔야 되는데 말했듯이 addslashes함수와 hex,0x 등 필터링으로 쉽지 않다.
여기서 sql함수를 이용해야 되는데reverse라는 함수를 이용할 것이다.
reverse함수는 문자의 배열 순서를 거꾸로 만들어주는데 reverse(abc)를 하면 cba로 바꿔준다.
즉, admin은 필터링되어 있지만 nimda는 필터링 되어 있지 않다.
이를 이용하여 id에는 nimda를 phone에는 1,reverse(id))-- 를 넣어주고 로그인을 하면
문제가 풀리는 걸 볼 수 있다.
'Web > Webhacking.kr' 카테고리의 다른 글
Webhacking.kr Challenge old-49 문제 풀이 (0) | 2024.02.02 |
---|---|
Webhacking.kr Challenge old-51 문제 풀이 (0) | 2024.01.31 |
Webhacking.kr Challenge old-7 문제 풀이 (0) | 2023.07.10 |
Webhacking.kr Challenge old-21 문제 풀이 (0) | 2023.07.07 |
Webhacking.kr Challenge old-23 문제 풀이 (0) | 2023.07.05 |