URL 인코딩에 관해 말하면 N년 전의 URL 인코딩 취약점을 떠올릴 수 있습니다. 제가 잘못된 시기에 태어났다니 안타깝습니다. 인터넷을 접했을 때 허점이 사라진 지 오래였습니다.
집에서 가까운 곳, URL 인코딩이란 무엇입니까? 제가 인터넷에서 복사한 정의를 살펴보십시오.
인용문: URL 인코딩은 브라우저에서 양식 입력을 패키지화하기 위해 사용하는 형식입니다. 브라우저는 양식에서 모든 이름과 값을 가져와 이름/값 매개변수 인코딩(전송할 수 없는 문자 제거, 데이터 정렬 등)을 사용하여 URL의 일부로 또는 별도로 서버에 보냅니다. 두 경우 모두 서버측 양식 입력 형식은 다음과 같습니다.
theName=Ichabod+Crane&gender=male&status=missing&headless=yes
URL 인코딩은 다음 규칙을 따릅니다. 각 이름/값 쌍은 앰퍼샌드로 구분됩니다. = 문자로 구분된 형식에서 나옵니다. 사용자가 이름 값을 입력하지 않으면 이름은 계속 표시되지만 값은 표시되지 않습니다. 모든 특수 문자(즉, 중국어 문자와 같이 간단한 7비트 ASCII가 아닌 문자)는 =, & 및 %와 같은 특수 문자를 포함하여 백분율 기호 %를 사용하여 16진수로 인코딩됩니다.
하하, 사실 URL 인코딩은 문자의 16진수 ASCII 코드라는 것을 이해하셨을 겁니다. 다만, 앞에 "%"를 추가해야 하는데 약간의 변화가 있습니다. 예를 들어 ""의 ASCII 코드는 92이고 16진수 값 92는 5c이므로 ""의 URL 인코딩은 입니다. 그렇다면 한자의 URL 인코딩은 어떨까요? 매우 간단합니다. 예를 보면 "Hu"의 ASCII 코드는 -17670이고, 16진수는 BAFA이고, URL 인코딩은 "%BA%FA"입니다. 하하, 변환하는 방법을 아시나요?
우리는 일반적으로 URL 인코딩을 사용하지 않습니다. 왜냐하면 IE는 주소 표시줄에 입력한 숫자가 아닌 문자를 자동으로 URL 인코딩으로 변환하기 때문입니다. 따라서 브라우저의 경우 http://blog.csdn.net/l%61ke2는 http://blog.csdn.net/lake2 와 동일합니다(첫 번째 URL에서 a를 %61로 바꿨습니다). 하하, 누군가 데이터베이스 이름에 다운로드를 방지하기 위해 "#"을 추가하자고 제안했다는 사실을 기억하셨을 것입니다. 왜냐하면 IE는 #을 만날 때 다음 문자를 무시하기 때문입니다. 크래킹 방법은 매우 간단합니다. #을 URL 인코딩 #으로 바꾸세요. 처음에는 삽입 검사를 피하기 위해 URL 인코딩을 사용하려고 했지만 서버가 URL 인코딩을 문자로 변환하므로 실패했습니다.
잠깐, 주제에서 벗어난 것 같네요. 하하, 죄송합니다. :)
SQL 주입은 현재 매우 인기가 높기 때문에 일부 사람들은 주입 방지 스크립트를 작성했습니다. 물론 생각도 다르고 결과도 많이 다릅니다. 독자 여러분, 아래 ××SQL 범용 안티 주입 ASP 버전의 코드 일부를 살펴보시기 바랍니다.
Fy_Url=Request.ServerVariables("QUERY_STRING")
Fy_a=분할(Fy_Url,"&")
Fy_Cs(ubound(Fy_a))를 다시 사용하세요.
오류 발생 시 다음 재개
Fy_x=0에서 ubound(Fy_a)로
Fy_Cs(Fy_x) = 왼쪽(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
다음
Fy_x=0에서 ubound(Fy_Cs)로
Fy_Cs(Fy_x)<>""이면
Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0이면
응답.쓰기 "오류가 발생했습니다!"
응답.종료
종료 조건
종료 조건
다음
아이디어는 먼저 제출된 데이터를 얻고, "&"를 구분으로 사용하여 이름/값 그룹을 획득 및 처리한 다음, 값에 정의된 키워드가 포함되어 있는지 확인하는 것입니다(여기에서는 단순화를 위해 "and"만 남깁니다). 그렇다면 주사입니다.
얼핏 보면 값을 확인해 보니 문제가 없어 보입니다. ㅎㅎ 네, 가치에는 문제가 없지만 이름은 어떻습니까?
이름/값 그룹 값은 Request.ServerVariables("QUERY_STRING")에서 가져옵니다. 하하, 죄송합니다. 여기에 문제가 발생했습니다. Request.ServerVariables("QUERY_STRING")은 클라이언트가 제출한 문자열을 가져오는 것입니다. URL 인코딩은 여기서 자동으로 변환되지 않습니다. 하하, 이름을 URL 인코딩한 다음 제출하면 검사를 우회할 수 있습니다. 예를 들어 매개변수가 ph4nt0m=lake2 및 lis0인 경우 프로그램은 이를 이때 감지할 수 있으며, %50h4nt0m=lake2 및 lis0(URL 인코딩 p)을 제출하면 프로그램은 %50h4nt0m 및 %50h4nt0m 값을 판단합니다. ph4nt0m 으로 변환되므로 %50h4nt0m 값이 비어 있으므로 감지를 우회합니다.
잠깐, 이름은 해독되지 않았지만 값은 우회할 수 없다면 왜 검사를 우회할 수 있습니까? value의 값은 Request(Fy_Cs(Fy_x))에서 가져오므로 서버는 이를 디코딩합니다.
프로그램을 어떻게 개선할 수 있나요? 클라이언트가 제출한 디코딩된 데이터를 얻을 수 있는 한 명령문을 변경하여 이름을 For Each SubmitName In Request.QueryString으로 가져오면 됩니다.
하하, 제 글을 읽어주셔서 감사합니다^_^
Lake2