○ 예선전 12번 문제
이번 문제는 SQL Injection관련 문제였다. 개발자 출신이 아니여서 그런지 소스를 조금 오해했지만 몇가지 점검 하고 20~30분만에 해결했던 문제였다. 의도가 참 좋은 문제라고 생각한다.
■ 예선전 12번 문제 화면
■ 소스 보기에 주석 힌트 화면
■ Index.php.bak의 소스
→ 필터링 키워드가 나열된 화면
→ SQL Query 실행 화면
→ Answer 값 출력 로직 화면
■ 문제 풀이 화면
해당 문제는 RS의 값의 첫번째가 2가 되어야만 답이 출력되는 구조라는 것을 위의 소스에서 확인 할수 있다. 먼저 DB의 데이터에 뭐가 있는 확인해 보면 다음과 같은 결과를 얻을 수 있다.
lv 컬럼에는 1이라는 데이터 하나만 존재한다. RS의 값을 2로 변경하려면 union연산자를 사용해서 2의 값이 반환되도록 변경해야한다. 하지만 위의 Keyword Filtering 규칙을 보면 공백(space)이 필터링되어 사용 할 수 없다. 또한 숫자 2도 차단되어 있어 '-' 연산자 등을 사용해서 우회를 해야 하며 또한 1이 아닌 값을 사용해서 union 앞의 구문을 null 상태로 만들어 줘야 우리가 입력한 데이터가 첫번째로 반환된다.
rand==1의 질의어 : select lv from web01 where lv=($go)
완성된 질의어 : index.php?lv=0)union(select(5-3)
rand==1일 경우 질의어 구문
select lv from web01 where lv=(0)union(select(5-3))
완성된 질의어 : index.php?lv=0)union(select(5-3)
rand==1일 경우 질의어 구문
select lv from web01 where lv=(0)union(select(5-3))
rand 값의 의해 20% 확률로 5번 중의 한번 꼴로 해답이 출력된다.