3번째 라인으로 넘어가서 문제 13번을 풀어보겠다.
해당 문제의 배점은 1000point이며
지금까지 나온 문제 중 제일 높은 배점을 갖고있다.
클릭해보자.
SQL INJECTION기법으로 푸는 것으로 예상되며
힌트로 select flag from prob13password라고 주어져 있다.
그렇다면 시험삼아 인젝션을 시도해보자.
몇가지 문자들이 필터링 되어있는 것 같다.
다사다난한 삽질(?)이 예상된다.
임의로 여러가지를 테스트해보자.
1) 0을 입력시
아무런 반응이없다.
2) 1을 입력시
3) 2를 입력시
4) 2이상을 입력시
해당 결과를 토대로 예상해보면
result가 1일때는 참 0일때는 거짓으로 나온다고 생각된다.
해당 가설을 검증해보자.
no=2 or 1 (참)
이라는 쿼리를 보내서 해당 결과를 확인해보자.
결과값 result=1로써 참일 경우 1이 출력됨을 확인하였다.
이러한 결과를 토대로
해당 문제는 blind sql injection을 이용하여 풀면 될 것으로 생각된다.
관건은
어떤 문자가 필터링 되어있으며 어떻게 우회할수 있는가
해당 13번 문제의 의도인 것 같다.
여러가지 문자열을 대입한 결과
어떤 문자열이 필터링 되어있고, 어떤 문자열이 필터링 되어있지 않은 것인지 확인할 수 있었다.
그렇다면 필터링 되지 않는
문자열로 해당 비밀번호를 알아낼 쿼리를 작성해보자.
먼저 해당 flag칼럼에 몇 개의 데이터가 있는 지 알아내야 한다.
no=if((select(count(flag))from(prob13password)in(2),1,2)
해당 쿼리문은
prob13password라는 데이터베이스에서 flag컬럼의 데이터가 2개일때
참이면
no=1을 대입하고,
거짓일 경우
no=2를 대입한다.
해당 쿼리의 출력결과가 1일 경우
해당 flag컬럼에 데이터가 2개있는 것으로 확인할 수 있다.
해당 flag컬럼에 2개의 데이터가 있는 것으로 확인 되었으며,
이제 해당 데이터들의 길이를 확인한후 이전에
풀이했던 blind sql injection처럼 한문자 한문자 알아내면 되는 것이다.
해당 데이터들의 길이를 확인해보자.
max와 min구문을 사용해서
해당 데이터들의 길이를 확인할 수 있는데,
다음과 같은 쿼리를 날리게되면
모두 참이 출력된다.
하나의 데이터의 길이가 20이라고 하면 다른 하나는 4인것이다.
이제 실제로 파이썬 코드를 이용하여 알아내보자.
해당 파이썬 코드 작성하기가 귀찮아 블로그를 열심히 뒤져보았지만,
제데로 작성된 것들이 없었다.
파이썬 2버전이나 반복문의 횟수 그리고 제데로 돌아가지 않는 경우도 있었기에,
웹해킹 9번문제를 수정하여 파이썬 3버전을 기반으로 본인이 재작성하였다.
해당 프로그램의 출력값이다.
이것을 토대로 입력해보면
풀이 완료
이전에 풀어봤던 풀이와 동일하여 그렇게 어려운 문제는 아니였다.
'IT > 웹 해킹(Web Hacking)' 카테고리의 다른 글
webhacking.kr [문제 15번] (0) | 2018.03.10 |
---|---|
webhacking.kr [문제 14번] (0) | 2018.03.09 |
webhacking.kr [문제 12번] (0) | 2018.03.07 |
webhacking.kr [문제 11번] (0) | 2018.03.07 |
webhacking.kr [문제 10번] (0) | 2018.03.06 |