>웹 프론트엔드 >JS 튜토리얼 >응답 조작을 통한 OTP 우회 방지를 중지하는 방법

응답 조작을 통한 OTP 우회 방지를 중지하는 방법

Linda Hamilton
Linda Hamilton원래의
2025-01-22 22:45:14805검색

이 블로그 게시물에서는 Node.js 및 React.js를 중심으로 OTP(일회용 비밀번호) 우회 공격을 효과적으로 방지하는 방법을 설명하지만 다른 기술에도 적용할 수 있습니다. OTP 구현을 보호하기 위한 기술과 모범 사례를 자세히 설명합니다.

OTP 우회 공격의 이해

OTP 우회는 애플리케이션 취약점을 악용하여 유효한 OTP 없이 무단 액세스를 얻는 것입니다. 공격자는 유효하지 않거나 만료된 OTP를 사용하거나 API 응답을 조작(종종 Burp Suite와 같은 도구 사용)하여 OTP 확인을 우회할 수 있습니다. 일반적인 공격에는 합법적인 사용자의 유효한 응답을 가로채서 무단 액세스에 재사용하는 것이 포함됩니다.

응답 조작 방지

단순히 API 응답을 암호화하는 것만으로는 충분하지 않습니다. 암호화(AES 또는 RSA 사용)는 전송 중인 데이터를 보호하지만 모든 사용자에 대한 동일한 응답은 취약점을 생성합니다. 암호화를 사용하더라도 성공/실패 기준이 HTTP 상태 코드 또는 일관된 성공 메시지("OTP가 성공적으로 확인되었습니다")만을 기반으로 하는 경우 공격자는 캡처된 성공 응답을 재생하여 OTP 확인을 계속 우회할 수 있습니다.

강력한 솔루션: 고유 응답 ID

해결책에는 각 요청에 대해 고유한 사용자별 식별자를 생성하는 것이 포함됩니다. 이는 응답 재생 공격을 방지합니다. 설명된 방법은 데이터베이스 사용을 방지합니다.

클라이언트측 구현(React.js 예):

  1. 페이로드 암호화: OTP 데이터를 서버로 보내기 전에 암호화하세요.
  2. 고유 ID 생성: 고유한 7자리 ID(UID, rsid)를 생성합니다. 적합한 임의 ID 생성 방법을 사용할 수 있습니다.
  3. 헤더에 UID 보내기: 요청 헤더에 rsid를 포함합니다.
  4. API 호출: 암호화된 데이터와 rsid을 서버로 보냅니다.
  5. 응답 유효성 검사: 서버의 응답을 해독합니다.
  6. UID 일치: 결정적으로, 응답으로 받은 rsid를 요청 헤더로 보낸 것과 비교하세요. 일치는 성공적인 확인을 나타냅니다. 불일치는 공격 시도를 의미합니다.
<code class="language-javascript">const OnSubmit = async () => {
  let data = await AesEncrypt(form);
  let verifyobj = { "encdata": data };
  let getid = await makeid(7);
  let config = { headers: { "rsid": getid } };
  let ApiCallverify = await axios.post("http://localhost:4000/api/verifyotp", verifyobj, config);
  let decryptedData = await Aesdecrypt(ApiCallverify.data.dataenc);
  if (ApiCallverify && ApiCallverify.data.dataenc && ApiCallverify.status === 200) {
    if (decryptedData.rsid === getid) {
      alert(decryptedData.message);
    } else {
      alert("Invalid User");
    }
  } else {
    alert(decryptedData.message);
  }
};</code>

서버측 구현(Node.js 예):

  1. 요청 유효성 검사: 요청 본문(암호화된 데이터)과 rsid 헤더가 있는지 확인하세요.
  2. 복호화: 요청 본문을 복호화합니다.
  3. OTP 검증: 데이터베이스 또는 기타 보안 저장소를 사용하여 사용자 정보에 대해 OTP를 검증합니다.
  4. 응답 생성: 검증에 성공하면 응답을 암호화하고 요청 헤더의 원본 rsid을 포함합니다.
  5. 응답 보내기: 암호화된 응답을 보냅니다.
<code class="language-javascript">const OnSubmit = async () => {
  let data = await AesEncrypt(form);
  let verifyobj = { "encdata": data };
  let getid = await makeid(7);
  let config = { headers: { "rsid": getid } };
  let ApiCallverify = await axios.post("http://localhost:4000/api/verifyotp", verifyobj, config);
  let decryptedData = await Aesdecrypt(ApiCallverify.data.dataenc);
  if (ApiCallverify && ApiCallverify.data.dataenc && ApiCallverify.status === 200) {
    if (decryptedData.rsid === getid) {
      alert(decryptedData.message);
    } else {
      alert("Invalid User");
    }
  } else {
    alert(decryptedData.message);
  }
};</code>

입증된 효율성: 블로그 게시물에는 Burp Suite를 사용하여 응답을 가로채고 수정하는 성공적인 로그인 및 실패한 시도를 보여주는 스크린샷이 포함되어 있습니다. 고유한 rsid은 성공적인 재생 공격을 방지합니다.

How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation How to stop preventing OTP Bypass through Response Manipulation

이미지는 원래 위치를 유지합니다. 이미지 URL은 보존됩니다. 이를 올바르게 표시하려면 시스템이 해당 URL에 액세스할 수 있어야 합니다.

위 내용은 응답 조작을 통한 OTP 우회 방지를 중지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.