
1. 문제 정보
- 문제 번호 : old -3
- 문제 점수 : 30점
2. 문제 분석
문제에 들어가면 nonogram이 나오고 nonogram을 처음 풀어봐서 위키 피디아를 참고해 룰을 보았다.

노노그램을 풀면 아래 그림처럼 나온다.

클리어하면 log에 name을 입력하는 창이 나온다.


그리고 로그 창이 나온다.
처음 소스 코드를 보면
3. 풀이
처음 nonogram을 풀 때 클릭을 하면 kk_num 값이 1로 바뀌고 검정으로 바뀐다 그리고 마지막에 solved버튼을 누르면 eval과 함께 문제가 get요청을 보낸다.
<script>
function go(){
var answer="";
for(i=1;i<=25;i++) { answer=answer+eval("kk._"+i+".value"); }
kk._answer.value=answer;
kk.submit();
}
</script>
eval 함수는 인자로 전달된 문자열을 실제 코드로 해석하여 실행한다. 이 함수는 외부에서 조작된 입력값이 제대로 검증되지 않은 채 전달될 경우 시스템 전체를 제어할 수 있는 심각한 보안 취약점이다. 이를 흔히 코드 주입(Code Injection) 취약점이기 때문에 먼저 눈여겨보았다.
하지만 eval에 사용자가 제공한 값을 넣는 것이 아니라 eval로 값을 불러오므로 이 문제의 취약점이 아니었다. 만약 공격자가 HTML 요소의 이름(name 속성)을 임의로 조작할 수 있는 환경이라면 eval을 통한 공격이 가능하다, 하지만 이 문제의 경우 클라이언트 측 스크립트 내부에서 루프를 돌며 값을 취합하는 구조이므로 직접적인 코드 주입이 어렵다.

그리고 다음으로 시도해 본 것은 xss로 로그에 찍힌 곳에 stored xss가 가능할 것 같았다.

<input type="hidden" name="answer" value="1010100000011100101011111">
그래서 name과 value에 각각 <script>alert('1')</script>을 입력해 보았다. 하지만 answer에 입력했을 때 쿼리 에러가 떴다.
이건 데이터베이스에서 에러이므로 answer에 'or 1=1 -- 을 넣어서 sqli를 해보니 문제가 풀렸다.


4. 요약
- 웹 페이지의 노노그램 퍼즐을 해결하면 사용자의 이름과 퍼즐의 정답(answer) 값이 서버로 전송되어 데이터베이스에 기록된다.
- 정답 전송 과정에서 스크립트 삽입을 시도했으나 데이터베이스 쿼리 에러가 발생했으며, 이는 입력값이 SQL 구문에 직접 영향을 미치고 있음을 의미한다.
- answer 파라미터에 참(True)을 유도하는 SQL 구문을 삽입하여 인증 및 검증 로직을 우회하는 SQL Injection 공격으로 문제를 해결했다.
'워게임 > webhacking.kr' 카테고리의 다른 글
| [webhacking.kr] old-5 문제 (0) | 2026.02.05 |
|---|---|
| [webhacking.kr] old-7문제 (0) | 2026.02.03 |
| [webhacking.kr] old-11 문제 (0) | 2026.02.02 |
| [webhacking.kr] old-4 문제 (0) | 2026.02.02 |
| [webhacking.kr] old-56 문제 (0) | 2026.02.02 |