본문 바로가기

분류 전체보기3722

728x90
스캐너가 못 찾는 취약점 — IDOR·SSRF·업무 로직 결함, 점검자는 어디를 보나 자동 스캐너는 알려진 패턴 — 오래된 버전, 설정 오류, 단순 인젝션 — 을 잘 찾습니다. 그런데 요즘 실제 사고의 큰 부분은 스캐너가 '정상 응답' 으로 보는 곳에서 납니다. 남의 주문서를 번호만 바꿔 열어 보는 것(IDOR), 서버가 내부 주소로 대신 요청하게 만드는 것(SSRF), 쿠폰을 두 번 쓰는 것. 이런 로직 취약점은 사람이 기능을 이해하고 손으로 눌러 봐야 나옵니다. 점검자가 어디부터 보는지 유형별로 적습니다. 허가된 범위 안에서의 점검을 전제로 합니다.1. IDOR — 가장 흔하고 가장 단순한점검의 기본 도구는 계정 두 개입니다. A 로 주문 상세를 열고 그 요청(예: GET /api/orders/10234)을 잡은 뒤, B 의 세션으로 번호만 바꿔 보냅니다. 읽기는 막혀 있어도 수정(P.. 2026. 7. 28.
로그 관리 기본 — 무엇을 얼마나 남기고, 어디에 모으고, 누가 언제 보나 사고가 났을 때 가장 먼저 찾는 것이 로그인데, 그때서야 '그 로그는 안 남기고 있었다' 거나 '2주 전 건 이미 지워졌다' 는 것을 알게 되는 경우가 많습니다. 로그 관리는 도구보다 무엇을·얼마나·어디에·누가 보나 네 가지를 정하는 일입니다.1. 무엇을 남기나모든 것을 남기면 아무것도 못 봅니다. 위 다섯 묶음이 기준이고, 특히 개인정보·중요 데이터에 대한 접근 기록(누가·언제·어떤 데이터를·어떻게)은 법적 요구이기도 합니다. 각 기록에는 시각·행위자(계정)·대상·결과·출발지(IP)가 있어야 나중에 사람 이야기가 됩니다.2. 얼마나 남기나보안·감사 로그는 1년 이상을 기본으로 보는 경우가 많고, 법령이나 인증 기준에 따라 더 길게 요구되기도 합니다(개인정보 접근 기록 등은 해당 고시를 확인). 애플리케.. 2026. 7. 27.
개인정보 파기 실무 — 보유기간이 끝난 데이터를 찾고, 지우고, 기록 남기기 개인정보는 모으는 것보다 제때 지우는 것이 어렵습니다. 보유기간이 끝났는데 남아 있는 데이터는 그 자체로 위반이고, 유출 사고가 나면 피해 범위를 키웁니다. 처리방침에 '지체 없이 파기한다' 고 적어 두고 실제로는 아무것도 돌아가지 않는 경우가 많아, 담당자가 실제로 돌릴 수 있는 절차로 정리했습니다.1. 대상을 찾는다 — 규칙을 쿼리로'탈퇴 후 즉시', '목적 달성 후 즉시', '1년 미이용 시' 같은 규칙을 실제 테이블 기준의 조건으로 옮깁니다. 예를 들어 탈퇴일로부터 N일 지난 회원, 상담 종료 후 보유기간이 지난 문의, 채용 종료 후 지원서 등. 이 조건을 스크립트로 만들어 월 1회 자동으로 돌리고 건수를 알림으로 받으면 '잊어서 못 지움' 이 사라집니다.2. 법정 보존 항목은 분리 보관으로전자상.. 2026. 7. 25.
로그인·결제 폼의 보안 기본 — CSRF 토큰, 자동완성 속성, 비밀번호 입력 UX, 속도 제한 폼은 사용자와 서버가 만나는 자리라서 보안과 UX 가 같은 곳에서 결정됩니다. 그리고 '보안을 위해' 라며 넣은 장치가 오히려 보안을 해치는 경우가 많습니다 — 비밀번호 붙여넣기 금지가 대표적입니다. 로그인·결제·설정 변경 폼을 만들 때 지켜야 할 기본을 정리합니다.1. CSRF — 남의 사이트에서 내 폼을 보내지 못하게CSRF(교차 사이트 요청 위조)는 로그인된 사용자가 다른 사이트의 페이지를 여는 순간 그 사이트가 몰래 우리 서버로 '비밀번호 변경' 같은 요청을 보내는 공격입니다. 방어는 서버가 발급한 토큰을 폼에 넣고 요청 때 확인하는 것이고, 대부분의 프레임워크가 기본으로 제공합니다. 세션 쿠키에 SameSite=Lax(또는 Strict) 를 두면 브라우저 단에서 한 겹 더 막힙니다. 그리고 상태.. 2026. 7. 24.
PHP 입력값 검증과 SQL 인젝션 방어 — 준비된 문장, 필터, 그리고 출력 이스케이프 SQL 인젝션은 20년 넘게 알려진 취약점이지만 지금도 점검에서 가장 자주 나옵니다. 이유는 간단합니다 — 문자열을 이어 붙여 쿼리를 만드는 코드가 '잘 돌아가기' 때문입니다. PHP 에서 입력값을 다루는 기본 원칙을 받기 → 검증 → 쓰기 → 내보내기 네 단계로 정리합니다.1. 준비된 문장(Prepared Statement) — 예외 없이$pdo = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false,]);$stmt = $pdo->prepare('SELECT id, title FROM posts WHERE user_id = :uid AND stat.. 2026. 7. 23.
728x90
728x90