ASP 개발이 vbs와 js라는 두 가지 언어를 사용할 수 있다는 점을 고려하면 두 언어의 프로그램 코드가 여기에 제공됩니다(이중 언어 버전? YY 매체...). 마지막으로 장황한 문장 하나, 이 기사를 입력하는 데 사용한 기계에는 ASP 환경이므로 제공된 코드가 테스트되지 않았는데, 이에 대해 사과드립니다. 코드에 문제가 있으면 댓글로 남겨주세요~저는 피부가 두꺼운 편입니다~
1. 공격원리
쿠키 스푸핑은 현재 네트워크의 일부 사용자 관리 시스템에서 사용자 로그인 정보를 쿠키에 저장하는 안전하지 않은 관행을 주로 이용합니다. SQL 주입 취약점과 같은 취약점에 비해 공격 방법은 상대적으로 어렵지만 여전히 매우 어리석습니다.
우리는 쿠키를 기반으로 하는 일반 사용자 시스템이 쿠키에 사용자 이름과 userlevel이라는 두 가지 이상의 변수를 저장한다는 것을 알고 있습니다. 여기서 사용자 이름은 사용자 이름이고 userlevel은 사용자 수준입니다. 브라우저가 ASP 페이지에 액세스하면 다음과 같은 내용이 전송됩니다.
GET /.../file.asp HTTP 1.0
...
쿠키: 사용자 이름=사용자&사용자 수준=1
...
패킷을 전송한 다음 관리자의 사용자 이름과 사용자 수준 값(각각 admin과 5로 가정)을 알고 있으면 전송할 수 있습니다.
GET /.../file.asp HTTP 1.0
...
쿠키: 사용자 이름=admin&userlevel=5
...
관리자 권한을 얻으려면. 아주 간단하지 않나요? 그러나 이 취약점이 발견되기 전에는 거의 모든 사용자 관리 시스템이 쿠키에 의존했습니다.
2. 이용자 정보를 안전하게 보관
쿠키는 안전하지 않고 사용자 로그인 정보를 저장해야 하는데, 쿠키는 어디에 저장해야 합니까?
ASP에는 쿠키 외에 정보를 저장할 수 있는 세션도 있다는 사실을 알아냈습니다. 세션은 서버에 저장되며 클라이언트가 임의로 변경할 수 없으므로 보안이 매우 높습니다. 이런 방식으로 모든 쿠키 코드를 세션으로 바꿀 수 있습니다.
3. 이용자 정보를 장기간 보관
Session을 사용하여 사용자 로그인 정보를 저장하는 방법은 Cookies기만 문제를 제거하더라도 Session을 장기간 저장할 수 없으므로(IIS 기본 Session은 사용자가 응답을 중지한 후 20분 후에 만료됨), Cookies + Session 하이브리드 저장 방법을 설명합니다. 이 섹션에서는 .
이 방법에는 두 가지 변형이 있습니다. 첫 번째는 사용자가 페이지를 방문할 때 세션을 먼저 읽는 것입니다. 그렇지 않으면 쿠키가 우선합니다. 쿠키에 제공된 정보는 쿠키의 내용이 합법적인지 확인하기 위해 사용자 이름과 비밀번호로 불투명하게 로그인하는 데 사용됩니다. 이 메서드를 구현하는 코드는 다음과 같습니다.
vbs:
다음과 같이 코드 코드를 복사합니다.
<%
희미한 사용자 이름, 비밀번호
사용자 이름 = 세션(사용자 이름)
사용자 이름 = 다음인 경우
' 세션에 사용자 로그인 정보가 없습니다
사용자 이름 = Request.Cookies(사용자 이름)
비밀번호 = 요청.쿠키(비밀번호)
' 위 두 문장에서 얻은 사용자 이름과 비밀번호는 SQL 주입 취약점(즉, 작은따옴표가 필터링됨')을 방지해야 하므로 여기서는 생략합니다.
사용자 이름 = 또는 비밀번호 =이면
'사용자가 로그인되어 있지 않습니다
...
또 다른
' 이는 conn 및 rs 객체가 생성되었다고 가정합니다.
rs.Open SELECT TOP 1 * FROM [user] WHERE 사용자 이름=' & 사용자 이름 & ' AND 비밀번호=' & 비밀번호 & ', conn, 1, 3
만약 rs.eof라면
'쿠키에 포함된 정보는 불법입니다.
...
또 다른
'쿠키에 포함된 정보는 합법적인 정보이므로 자동으로 로그인됩니다.
세션(사용자 이름) = 사용자 이름
...
종료하면
종료하면
또 다른
'사용자 정보가 이미 세션에 존재합니다. 직접 읽어보세요.
...
종료하면
%>
JS:
다음과 같이 코드 코드를 복사합니다.
<%
var 사용자 이름, 비밀번호;
사용자 이름 = 세션(사용자 이름) + ;
if (사용자 이름 == || 사용자 이름 == 정의되지 않음) {
// 세션에 사용자 정보가 없습니다.
사용자 이름 = Request.Cookies(사용자 이름) + ;
비밀번호 = Request.Cookies(비밀번호) + ;
// 위 두 문장에서 얻은 사용자 이름과 비밀번호는 SQL 주입 취약점을 방지하기 위해 필요합니다(즉, 여기서는 생략된 작은따옴표 '를 필터링합니다.
if (사용자 이름 == || 사용자 이름 == 정의되지 않음 || 비밀번호 == || 비밀번호 == 정의되지 않음) {
//사용자가 로그인되어 있지 않습니다.
...
}
또 다른 {
// conn 및 rs 객체가 생성되었다고 가정합니다.
rs.Open(SELECT TOP 1 * FROM [사용자] WHERE 사용자 이름=' + 사용자 이름 + ' AND 비밀번호=' + 비밀번호 + ', conn, 1, 3);
만약 (rs.eof) {
//쿠키에 포함된 정보는 불법입니다.
...
}
또 다른 {
//쿠키에 포함된 정보는 합법적입니다. 자동으로 로그인됩니다.
세션(사용자 이름) = 사용자 이름 + ;
...
}
}
}
또 다른 {
// 사용자 정보가 이미 Session에 존재하므로 직접 읽어보세요.
...
}
%>
그러나 이 방법은 사용자가 페이지를 방문할 때마다 브라우저에서 쿠키를 전송하고, 비밀번호가 포함된 쿠키를 다른 사람이 획득하면 사용자의 계정을 도용할 수 있기 때문에 사용자에게 그다지 안전하지 않습니다. 이러한 상황을 대비한 두 번째 방법은 사용자 정보 데이터베이스에 필드 verifycode를 추가하는 것입니다. 사용자가 로그인하면 긴 정수 검증 값이 무작위로 생성되어 verifycode 필드에 저장되고 사용자 이름과 이 검증코드가 저장됩니다. 비밀번호 대신 쿠키를 저장합니다. 쿠키에서 사용자 정보를 확인할 때 사용자 이름과 확인 코드만 확인됩니다. 이 방법의 장점은 해커가 사용자의 쿠키를 획득하더라도 일시적으로 생성된 검증코드를 통해서만 로그인이 가능하고, 사용자의 비밀번호는 알아낼 수 없다는 점입니다. 이 사용자가 다시 사용자 이름과 비밀번호를 사용하여 로그인하면 검증코드 값이 변경되고 해커는 원래 검증코드를 통해 로그인할 수 없습니다.
이 메서드를 구현하려면 위 메서드 1의 코드를 약간만 변경하면 됩니다. 먼저 로그인 프로그램에서 확인 후 사용자 정보가 저장되는 단락을 추가해야 합니다.
vbs:
다음과 같이 코드 코드를 복사합니다.
<%
Response.Cookies(verifycode) = int(rnd * 2100000000)
%>
JS:
다음과 같이 코드 코드를 복사합니다.
<%
Response.Cookies(verifycode) = Math.floor(Math.random() * 2100000000);
%>
그런 다음 위에 제공된 인증 코드에서 쿠키(비밀번호) 확인을 쿠키(verifycode) 확인으로 변경합니다.
4. 결론
당사의 분석 및 처리를 통해 쿠키 스푸핑 취약점이 완전히 해결되었습니다. 그 이후로 당사의 ASP 프로그램은 더욱 안전해졌습니다.