오늘날의 웹 기반 공격은 일반적으로 주입 방식입니다. 주입의 이유는 일반적으로 변수 필터링이 불완전하여 침입자가 불법적으로 프로그램을 실행하거나 임의의 데이터를 쿼리하고 수정할 수 있기 때문입니다. 인젝션 공격이 점점 더 심해지면서 일부 특화된 필터링 코드가 등장했다. 그러나 일부 필터링 코드의 결함으로 인해 새로운 공격이 발생할 수 있습니다. 다음은 가장 널리 사용되는 필터링 코드인 SQL 범용 안티인젝션 프로그램을 이용하여 취약점의 원인과 활용방법, 예방대책을 설명한다.
SQL 범용 안티 주입 프로그램은 Firefox의 Feng Zhiqiu가 작성했습니다. 상당히 완전한 안티 주입 코드입니다. 정의된 필터 문자에 대한 제출 필터링을 구현할 수 있으며 공격자의 IP가 제출한 데이터 정보를 기록할 수 있습니다. 이를 사용할 때 변수 필터링을 달성하기 위한 삽입을 방지하려면 파일 헤더에 <--#Include File="WrSky_Sql.Asp"--> 코드를 추가하기만 하면 됩니다. 데이터베이스 연결 파일(예: conn.asp) 뒤에 프로그램 코드를 추가하면 전체 사이트에 대한 변수 필터링을 달성하여 주입 방지 효과를 얻을 수 있습니다.
자, 먼저 변수 필터링 부분의 코드를 살펴보겠습니다:
'---------정의 부분------
희미한 Fy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr
'필터링이 필요한 문자열을 "단풍나무"로 구분하여 사용자 정의하세요.
Fy_In = "' Maple; Maple 및 Maple Exec Maple 삽입 Maple 선택 Maple 삭제 Maple 업데이트 Maple 개수 Maple * Maple% Maple Chr Maple Mid Maple 마스터 Map Truncate Maple Char Maple 선언"
'-----------------------------------
%>
<
Fy_Inf = 분할(Fy_In,"단풍나무")
'---------POST 부분------
요청 양식<>그럼
Request.Form의 각 Fy_Post에 대해
Fy_Xh=0에서 Ubound(Fy_Inf)로
If Instr(LCase(Request.Form(Fy_Post)),Fy_Inf(Fy_Xh))<>Then
'---------부분 가져오기----
If Request.QueryString<>Then
각 Fy_Get In Request.QueryString에 대해
Fy_Xh=0에서 Ubound(Fy_Inf)로
If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>Then
이 코드는 "'", "and" 등과 같이 일반적으로 주입되는 변수의 필터링을 정의합니다. 필터링이 그렇지 않다고 생각되면 충분하거나 너무 많으면 스스로 할 수 있습니다. 문자를 추가하거나 뺄 수 있습니다. 분명히, get 또는 post를 통해 서버에 제출된 데이터에 필터링된 문자가 포함되어 있는 한 이는 프로그램에 의해 금지됩니다. 이로 인해 문제가 발생합니다. 포럼의 데이터베이스 연결 파일 뒤에 프로그램 코드를 추가하면 게시물 내용에 필터링된 문자가 포함되어 있으면 금지됩니다. 기본 필터링 내용에 따르면 내용이 영어로 되어 있으면 게시가 거의 불가능한 것 같습니다. 또한 포럼 스타일을 정의할 때 일부 특수 문자(예: 퍼센트 기호 "%")가 사용되는 경우가 있습니다. 이러한 특수 문자를 필터링하면 전체 포럼이 제대로 작동하지 않습니다. 위에서 언급한 문제에 대해 dvbbs를 이용해서 테스트해 보았는데, 결과는 딱 기대한 대로였습니다.
위 문제를 해결하는 방법은 필터링이 필요한 파일에만 연결문이 삽입되는 것을 방지하는 것이다. 하지만 이 작업량은 상대적으로 크며 일반적으로 웹마스터는 어떤 파일을 필터링해야 하는지 모릅니다. 따라서 내 제안은 필터링 코드를 conn.asp에 추가한 다음 필터링 코드가 포함되지 않은 connl.asp를 만들고 확실히 필터링이 필요하지 않은 파일을 연결하는 것입니다. 필터링 코드는 다음 작업에 영향을 줍니다. 이 파일을 conn1.asp에 저장해야 하지만 두 데이터 연결 파일의 기본 내용은 일관성이 있어야 합니다. 또한 스타일 설정에서는 필터링된 문자를 사용하지 않는 것이 가장 좋습니다. 꼭 사용해야 하는 경우에는 주입 방지 프로그램에서 해당 문자의 필터링을 삭제하면 됩니다.
위 내용은 주사방지 프로그램이 사이트 운영에 미치는 영향에 대한 것으로, 어떠한 해를 끼칠 수 없습니다. 실제로 실제 피해는 데이터 기록 부분에서 발생합니다. 코드의 이 부분을 살펴보겠습니다.
''--------데이터베이스에 쓰기-------헤더----. ----
Fy_dbstr="DBQ="+server.mappath("SqlIn.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver(*.mdb)};"
Fy_db=Server.CreateObject("ADODB.CONNECTION") 설정
Fy_db.open Fy_dbstr
Fy_db.Execute("SqlIn(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) 값에 삽입('"&Request.ServerVariables("REMOTE_ADDR")&"','"&Request.ServerVariables("URL")&"',' GET','"&Fy_Get&"','"&replace(Request.QueryString(Fy_Get),"'","''")&"')")
Fy_db.close
Fy_db = 없음으로 설정
'---------데이터베이스에 쓰기-------꼬리--------
Response.Write "<스크립트 언어=JavaScript>alert('Fengwang SQL 범용 안티 주입 시스템 프롬프트↓ nn매개변수에 잘못된 문자를 삽입하지 마세요. nnHTTP://WwW.WrSkY.CoM 시스템 버전: V2.0(ASP) 완벽한 버전');<스크립트>
Response.Write "잘못된 조작! 시스템에 다음과 같은 기록이 기록되었습니다↓<br>"
Response.Write "작업 IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
응답.쓰기 "작업 시간:"&지금&"<br>
response.Write "작업 페이지:"&Request.ServerVariables("URL")&"<br>"
Response.Write "제출 방법: GET<br>"
응답.쓰기 "매개변수 제출:"&Fy_Get&"<br>"
Response.Write "데이터 제출:"&Request.QueryString(Fy_Get)
응답.종료
종료 조건
다음
다음
종료 조건
'-----------------------------------
이 코드의 기능은 공격자의 정보와 행동을 기록하는 것입니다. 필요한 조치를 취할 수 있다는 것입니다. 프로그램이 공격자의 IP, 제출 주소, 제출 내용 등을 기록하는 것을 코드에서 볼 수 있지만 여기에는 분명히 몇 가지 허점이 있습니다.
1. 빈번한 공격은 처리되지 않습니다. 즉, 법적 데이터를 어떻게 제출하더라도 프로그램에 의해 기록되므로 악의적인 DOS 공격으로 이어질 가능성이 높습니다. 이에 대해 실험을 해봤습니다. 보호된 파일의 URL 뒤에 다음 명령문을 제출합니다. (admin에서 top l asc(mid (username,l,l)) 선택)>0, 키 마법사를 사용하여 제출 프로세스를 기록한 다음 자동으로 반복합니다. 제출 . 잠시 후 데이터베이스 크기가 크게 변경되었습니다(그림 1 및 2 참조). 상상할 수 있듯이 Shuoxue와 같은 도구를 사용하여 다중 스레드 제출을 활성화하면 DOS는 확실히 문제가 되지 않습니다.
그림 1
그림 2
2. 레코드 데이터 길이가 잘리지 않습니다. 이는 포럼 운영에 영향을 미치는 안티 주입 프로그램을 테스트하는 동안 발견한 것입니다. 그림 3과 같이 게시물 내용에 필터링된 문자가 포함되어 있으면 게시물 내용이 데이터베이스에 완전히 기록됩니다. 일반 포럼이나 기사 시스템에서는 게시되는 기사의 길이에 제한이 있지만 SQL 범용 안티 주입 프로그램은 이에 대한 제한을 두지 않습니다. 공격자가 보호된 파일의 URL 뒤에 지나치게 긴 콘텐츠를 제출하면 프로그램이 중단될 가능성이 높습니다. 피해량이 상대적으로 높아 테스트는 하지 않았으나, 100K까지 제출한 내용은 평소대로 기록되었습니다.
그림 3
3. 데이터 콘텐츠 변환 및 데이터베이스 폭발 문제. 코드로 판단하면 프로그램은 불법적으로 제출된 데이터를 변환 없이 데이터베이스에 직접 기록합니다. 즉, 귀하가 제출한 내용에 관계없이 필터링된 콘텐츠가 포함되어 있는 한 프로그램은 귀하가 제출한 모든 콘텐츠를 기록합니다. 이 문제는 원래 심각하지는 않지만 "보안"을 위해 일부 웹마스터는 모든 mdb 파일을 asp 접미사로 변경하는 것을 좋아합니다. 또한, 안티인젝션 프로그램의 데이터베이스에는 테이블이 하나뿐이므로, 테스트 과정에서 보호된 파일의 URL을 데이터베이스에 직접 작성하여 웹쉘을 얻을 수 있도록 하였으며, 테스트 과정에서 sqlin.mdb를 sqlin.asp로 변경하였습니다. 보호된 파일의 URL을 입력한 후 Binglangzi 마이크로 ASP 백도어가 입력되었습니다. Ice Fox 클라이언트에 연결한 후 wedshll을 성공적으로 획득했습니다.
이러한 웹쉘 획득 방법은 상대방의 데이터베이스가 ASP 형식으로 실행되고 있는지, 데이터 경로를 알고 있는지 확인이 필요하기 때문에 이 데이터베이스의 경로를 얻을 수 있는 방법을 찾아야 합니다. 일반적인 상황에서는 데이터베이스 경로를 직접 추측할 수 있지만 실제로 이 경로가 노출될 수 있습니다. 전체 안티인젝션 프로그램을 살펴보면 방폭 라이브러리 문을 발견하지 못했기 때문에 직접 액세스하거나 사용하기만 하면 됩니다. %5C 방식으로 데이터베이스가 노출됩니다. 프로그램 코드가 데이터베이스 연결 파일 바로 뒤에 위치할 경우, 데이터 연결 파일에는 일반적으로 방폭문이 포함되어 있으므로 데이터베이스의 주소를 노출할 수 없습니다.
위에서 언급한 사항은 모두 데이터 기록 과정에서 발생하는 문제입니다. 대량의 반복적인 데이터 제출에 대해 IP를 자동으로 차단하는 등 유능한 웹마스터가 스스로 관련 허점을 해결할 수 있습니다. 실제로 코드의 데이터 기록 부분을 완전히 제거할 수 있어 변수 필터링에 영향을 미치지 않으며, 공격자의 정보가 기록되더라도 별로 유용하지 않을 것이다. 따라서 모든 취약점이 더 이상 존재하지 않도록 이 코드를 제거하는 것이 가장 좋습니다.
자, 이번 글은 여기까지입니다. 마지막으로 보안 보호 프로그램을 사용할 때 프로그램 자체의 보안 문제에도 주의를 기울여야 한다는 점을 상기시켜드리고 싶습니다
. 허점은 더 심각하다.