클릭으로 보는 웹 취약점 4종
모든 공격은 이 페이지 안에서만 흉내냅니다. 실제 서버로 나가는 요청은 없습니다. 외부 사이트에 공격을 시도하는 것은 명백한 불법이라는 점, 다시 한 번 강조해 둡니다.
1. SQL 인젝션
로그인 창에 SQL 한 조각을 끼워 비밀번호 없이 들어가는 공격가짜 쇼핑몰 로그인 화면입니다. 보통은 ID와 비밀번호가 둘 다 맞아야 들어갈 수 있죠. 아래 버튼을 차례로 눌러보세요. ID 칸에 SQL 한 조각을 끼워 넣으면 비밀번호 검사를 통째로 건너뛸 수 있습니다.
SELECT * FROM users WHERE id = 'admin' AND pw = '1234'
SELECT * FROM users WHERE id = ? AND pw = ? -- 값: ['admin', '1234']
2. XSS
댓글 한 줄로 모든 방문자의 쿠키를 가져가는 공격
가짜 게시판 댓글창입니다. 다른 사람이 단 댓글이 모두에게 그대로 보이죠.
그런데 사이트가 댓글을 HTML 로 해석해버리면, 누군가 <script>를 댓글로 적었을 때 모든 방문자의 브라우저에서 그 코드가 진짜로 실행됩니다.
3. CSRF
공격자가 보낸 링크를 한 번 눌렀을 뿐인데 내 비밀번호가 바뀌는 공격가장 헷갈리는 공격이지만 원리는 한 줄입니다. "내가 어떤 사이트에 로그인되어 있으면, 다른 사이트가 그 사이트로 요청을 대신 보낼 때 내 쿠키가 자동으로 같이 따라간다." 아래 1 → 2 → 3 버튼을 차례로 누르세요.
쇼핑몰 서버가 당신의 브라우저에 sessionId=abc123 이라는 쿠키를 발급했습니다.
지금부터 당신의 브라우저는 shop.example.com 으로 가는 모든 요청에 이 쿠키를 자동으로 같이 실어 보냅니다.
이건 정상적인 흐름입니다. 쿠키가 없으면 페이지를 옮길 때마다 다시 로그인해야 하니까요.
카톡으로 받은 "이벤트 당첨!" 링크는 사실 친구가 보낸 게 아니라 공격자가 만든 페이지입니다(아래 박스).
도메인이 attacker.example.com 으로 쇼핑몰과 다르죠.
화면엔 "이벤트 당첨!" 글자만 보이지만, 그 페이지의 HTML 안에는 보이지 않는 이미지 한 줄이 숨어 있습니다.
<img src="https://shop.example.com/change-password?pw=hacked123" width="0" height="0">
브라우저는 이 이미지를 받으려고 shop.example.com 으로 요청을 보냅니다.
도착지가 shop.example.com 이라서, 1단계에서 받아둔 sessionId 쿠키도 자동으로 같이 따라갑니다.
쇼핑몰 서버는 "정상 사용자(victim)의 요청이네" 하고 비밀번호를 hacked123 으로 바꿔버립니다.
안전한 쇼핑몰은 쿠키에 SameSite=Lax 가 켜져 있어서,
attacker.example.com 처럼 다른 사이트에서 출발한 요청에는 쿠키를 안 실어 줍니다.
서버는 누구인지 모르겠다며 403 으로 막습니다.
취약한 쇼핑몰의 비밀번호가 내가 모르는 새에 hacked123 으로 바뀌어 있습니다.
다음 로그인 시도 때 나는 못 들어가고, 공격자는 들어갑니다.
안전한 쇼핑몰은 비밀번호가 그대로입니다.
이벤트 당첨!
축하합니다. 클릭만으로 응모 완료. (이 페이지를 보는 그 순간, 보이지 않는 요청 한 줄이 백그라운드에서 발사됩니다.)
<img src="https://shop.example.com/change-password?pw=hacked123" width="0" height="0">
4. 남의 데이터를 자기 것처럼 조작
로그인만 확인하고 "본인 것"인지는 확인 안 하는 흔한 실수 (IDOR)
가짜 게시판입니다. 여러분은 글 3번을 쓴 사람으로 로그인되어 있습니다. 글 수정 페이지 주소는
/posts/3/edit 입니다. 주소창의 숫자를 1, 2 로 바꿔보세요.
5. AI 에게 시킬 종합 점검 프롬프트
위 네 가지를 한 번에 훑어주는 한 덩어리. 그대로 복사해 쓰세요.Cursor, Claude Code, Copilot 같은 도구에 프로젝트를 열어둔 상태에서 이 한 덩어리를 그대로 붙여 넣으면 됩니다. 코드를 한 줄 한 줄 읽지 않아도 점검 보고서가 돌아옵니다.