61번 문제의 화면이다. 소스코드를 확인해보자
get 메소드 방식으로 요청한 id의 값이 없으면 기본 값으로 "guest"를 지정한다.
id의 값은 addslashes 함수로 ' " 쿼터가 있으면 쿼터앞에 \ 백슬래쉬가 붙는다. 특수문자를 인식하기 위해 사용하기도 하며 sql injection 공격을 필터하기 위해도 사용한다. 마찬가지로 preg_match 함수로 특정 문자를 필터링한다.
id의 값은 16글자 이상이면 안되며 result변수에 데이터를 가져와 배열화 시킨다. id의 값이 admin이면 문제가 해결된다.
get 요청으로 id값을 요청해보면
위와 같이 $result['id'] 값이 test가 된다. 즉 테이블에 id컬럼에 test값이 있는 것이다.
문제를 해결할려면 id컬럼에 test가 아닌 admin이 있어야한다. 첫번째 줄에 말이다.
여기서 쓰일 개념이 mysql의 as( 컬럼 별칭) 과 16진수 변환이다.
mysql에서는 as로 컬럼의 별칭을 줄 수 있으며 text를 16진수로 변환해도 text로 출력해준다.
select "a"; 를 통해 테이블을 생성하고 as로 컬럼의 명칭을 바꿀 수 있다. 이때 as는 생략가능하다.
문제의 url에 "admin" as id 를 입력하면 아무런 변화가 없다. " 가 addslashes함수로 인해 필터링 되서 그런것이다.
따라서 "admin" 텍스트를 16진수로 변환한다. admin => 0x61646d696e
16진수로 변환한 값을 select 0x61646d696e; 하면 컬럼은 16진수 그대로 출력이 된다.
여기서 as 를 이용하여 컬럼 명을 바꿔준다. 이때 as는 위와 같이 생략가능하다.
url 부분에 0x61646d696e id를 입력하면 문제가 해결된다.
문제 핵심
1. 필터링 함수
2. mysql as 기능
3. mysql 16진수 변환
'웹 > 웹 해킹 문제 풀이' 카테고리의 다른 글
webhacking.kr 12번 문제풀이 (0) | 2023.01.02 |
---|---|
webhacking.kr 6번 write up (0) | 2023.01.01 |
webhacking.kr 59번 write up (0) | 2022.12.29 |
webhacking.kr 42번 write up (0) | 2022.12.29 |
webhacking.kr 36번 write-up (0) | 2022.12.24 |