old 3번 문제의 경우 무슨 퍼즐같은 미니게임으로 시작한다.
규칙은 간단하다.
- 가로 세로에 적혀있는 숫자의 합은 그 행 또는 열에 색이 칠해진 칸의 갯수이다.
- 숫자가 합쳐져 있으면 색칠된 칸이 연속되어 있다는 의미이다.
- 숫자가 각각 따로 써져있으면 색칠된 칸이 다 따로 있다는 의미이다.
(ex. 3 이라고 써져있다면 색칠된 칸 3개가 붙어있고, 1 1 1 이렇게 써져있다면 색칠된 칸 3개가 다 떨어져 있다)
위에 작성한 규칙에 의거하여 문제를 풀면 요런형태가 나오고, solved 버튼을 누르게 되면....끝...?
(해치웠나..?)
은 기대도 안했다. 여기가 메인이구만...
성공한 사람의 기록을 남기기 위해 이름을 남겨달라고 한다.
우선 tomato로 남겨보았다.
이름을 남기면 내가 적은 이름, 그리고 미니게임의 답, 내가 접속한 IP가 기록으로 남게됨을 알 수 있다.
테스트를 위해 tomato2로 하나를 더 남겨보았다.
아까 테스트한 tomato와 지금 테스트한 tomato2가 둘다 노출됨을 알 수 있다.
여기서 한가지 의문이 생기게 된다.
지금까지 푼 사람들의 모든 기록을 보여주는걸까 아니면, 특정 조건에 맞는 기록만 보여주는걸까?
의문을 해결하기 위에 burpsuite를 이용해 넘어가는 request 패킷을 열어보았다.
정답과 내가 입력한 이름이 서버로 전달됨을 알 수 있었고, 이것을 통해 IP주소는 내가 조작할 수 없음을 알아냈다.
이어 아까 생긴 의문을 해결하고자 우선 answer파라미터를 1234로 임의로 변조하여 패킷을 보내보았다.
결과는 지금 보낸 기록 하나만 노출됨을 알 수 있었다.
즉 정답이 같은 사람들의 기록이 노출된다라는 것을 알 수 있었다.
이어 where answer='{$_POST["answer"]} 이런식으로 프로그래밍 해두었을 수도 있겠다라는 생각이 들었고,
이렇게 프로그래밍 해두었다면 SQL Injection을 통해 모든 기록을 다 조회할 수 있겠다는 생각이 들었다.
우선 SQL Injection을 시도하기 전에, SQL Injection이 되는지 여부에 대한 판단을 위해
answer 파라미터에 싱글쿼터를 하나 넣고 request를 날려 보았다.
결과는 query error. 에러가 난다는 것은...
나의 입력값이 쿼리에 영향을 끼친다.
즉 SQL Injection이 가능하다는 말이다.
다 알아낸 마당에 지체할 이유는 없다.
and 1=0이라는 구문을 통해 일부러 쿼리를 거짓으로 만든 뒤,
or '1 구문을 통해 쿼리를 모든 조건에 대하여 참으로 만드는 인젝션을 시도했더니,
admin이 남겨놓은 secret data확인할 수 있었고 이렇게 문제가 풀리게 된다.
'Webhacking > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-04번 문제 풀이 (0) | 2021.01.03 |
---|---|
[Webhacking.kr] old-06번 문제 풀이 (0) | 2021.01.02 |
[Webhacking.kr] old-05 풀이 (1) | 2021.01.02 |
[Webhacking.kr] old-02번 문제 풀이 (0) | 2021.01.02 |
[Webhacking.kr] old-01번 문제 풀이 (2) | 2021.01.01 |