지난 주에 다른 사람을 위해 웹사이트를 만들었는데, 우연히 내 작업에 허점이 많다는 것을 발견했고, 단 20초 만에 SQL 인젝션을 사용하여 이를 수정했습니다. 그래서 SQL 인젝션에 대한 정보를 좀 확인해보고 인사이트를 얻었으니 초보자분들과 공유할 수 있으면 좋겠습니다. 전문가들이 웃었다!
SQL 주입 공격의 일반적인 개념은 다음과 같습니다.
SQL 주입 위치를 검색합니다.
서버 유형과 백그라운드 데이터베이스 유형을 결정합니다.
실행 가능성을 확인하기 위해
일부 공격자는 일반적으로 SQL 주입을 사용합니다. 다음에는 SQL 인젝션 방식에 대한 저의 통찰에 대해서도 말씀드리겠습니다.
주입 방법:
이론적으로 인증 웹페이지는 다음과 같습니다.
사용자 이름='XXX', 비밀번호='YYY' 문인 admin에서 *를 선택합니다. 이 문을 공식적으로 실행하기 전에 필요한 문자 필터링을 수행하지 않으면 SQL 주입을 쉽게 구현할 수 있습니다.
예를 들어, 사용자 이름 텍스트 상자에 abc'를 입력하거나 1=1-- 비밀번호 상자에 123을 입력하면 SQL 문은 다음과 같습니다.
select * from admin where 사용자 이름='abc' 또는 1=1 및 비밀번호='123' 사용자가 어떤 사용자 이름과 비밀번호를 입력하든 이 명령문은 항상 올바르게 실행되며 사용자는 쉽게 시스템을 속이고 법적 조치를 취할 수 있습니다. 신원.
해결책을 추측해보세요:
기본 아이디어는 모든 데이터베이스 이름을 추측하고, 데이터베이스의 모든 테이블 이름을 추측하고, 사용자 이름과 비밀번호를 저장할 수 있는 테이블 이름을 분석하고, 테이블의 모든 필드 이름을 추측하고, 테이블 내용의 모든 레코드를 추측하는 것입니다.
데이터베이스 이름과 각 테이블의 이름을 얻는 방법도 있습니다.
http://www .cn/news?id=10' 형식으로 오류를 보고하여 데이터베이스 이름과 테이블 이름을 얻으세요.
jsp의 경우 일반적으로 이를 처리하기 위해 다음 전략을 채택합니다.
1.준비문
이미 어느 정도 수준의 고급 개발자라면 항상Statement 대신PreparedStatement를 사용해야 합니다.
몇 가지 이유는 다음과 같습니다.
1. 코드 가독성 및 유지 관리성.
2. ReadyStatement는 성능을 최대한 향상시킵니다.
3. 가장 중요한 점은 보안이 대폭 향상되었다는 점입니다.
지금까지 일부 사람들(나를 포함)은 기본적인 사악한 SQL 구문조차 모릅니다.
문자열 sql = "name= '"+varname+"' 및 passwd='"+varpasswd+"'"인 tb_name에서 *를 선택합니다.
이름으로 [' 또는 '1' = '1]을 전달하면 비밀번호가 어떻게 되는지 살펴보겠습니다. 네트워크 관리 네트워크 비트CN.com은
* from tb_name = '또는 '1' = '1'을 선택합니다. 비밀번호 = '캐주얼' ;
'1'='1'은 확실히 참이므로 모든 검증을 통과할 수 있습니다.
['; drop table tb_name; ]을 varpasswd로 전달한 다음:
select * from tb_name = 'any' and passwd = ''; drop table tb_name; 일부 데이터베이스에서는 성공할 수 없지만 이러한 명령문을 실행할 수 있는 데이터베이스도 많이 있습니다.
그리고 미리 컴파일된 문을 사용하는 경우 전달하는 모든 콘텐츠는 원본 문과 일치하는 관계를 가지지 않습니다. (전제는 데이터베이스 자체가 미리 컴파일을 지원하지만 컴파일을 지원하지 않는 서버 측 데이터베이스가 없을 수 있다는 것입니다. 일부 데스크톱 데이터베이스, 즉 직접 파일 액세스 권한이 있는 데이터베이스는 모두 미리 컴파일된 문을 사용하는 한 들어오는 데이터에 대해 필터링을 수행할 필요가 없습니다. 낙하하는 데 많은 시간이 걸립니다. 등. 판단을 계획하고 지나치게 생각합니다.
2. 정규식
2.1. SQL 메타 문자를 감지하는 정규식/(%27)|(')|(--)|(%23)|(#)/ix
2.2. SQL 메타 문자 /((%3D)|(=))[^n]*((%27)|(')|(--) 54ne을 감지하기 위한 정규식을 수정합니다. com
|(%3B)|(:))/i
2.3. 일반적인 SQL 주입 공격 정규식/w*((%27)|('))((%6F)|o|(%4F))((%72)|r |( 중국 네트워크 관리 연합 www.bitscn.com
%52))/ix
2.4. UNION 쿼리 키워드의 정규식 SQL 삽입 감지 /((%27)|('))union/ix(%27)|(') - 싱글
따옴표 및 해당 16진수 합집합 - 공용체 키워드입니다.
2.5. MS SQL Server SQL 주입 공격을 탐지하기 위한 정규식/exec(s|+)+(s|x)pw+/ix
3. 문자열 필터링
공개 정적 문자열 filterContent(문자열 내용){
문자열 flt="'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare| |또는|-|+|,";
Stringfilter[] = flt.split("|");
for(int i=0; 나는 {
content.replace(filter[i], "");
}
콘텐츠 반환;
}
4. 안전하지 않은 캐릭터 마스킹
이 부분은 아주 작은 역할을 하는 차단을 위해 js를 사용합니다. 키워드를 차단하는 방법은 일정한 효과가 있지만 실제 응용 프로그램에서는 이러한 SQL 키워드가 실제 쿼리 키워드가 될 수도 있으며 그러면 사용자에 의해 차단됩니다. 사용자는 정상적으로 사용할 수 없습니다. 코딩 표준에 약간의 노력을 기울이십시오.
실행된 SQL에 변수가 있는 경우에는 JDBC(또는 기타 데이터 지속성 계층)에서 제공하는 ReadyStatement를 사용하면 됩니다. 문자열을 연결하는 방법을 사용하지 마십시오.
기능 소개: "'"," \","/ "가 포함되어 있는지 확인하세요.
매개변수 설명: 확인할 문자열 반환 값: 0: 예 1: 아님 기능 이름 예
기능 점검(a)
{
1을 반환합니다.
fibdn = 새 배열("'" ," \","/ ");
i=fibdn.길이;
j=a.길이;
for (ii=0; ii { for (jj=0; jj)
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
if (템'; p1==템플2)
{ 0을 반환 }
}
}
1을 반환합니다
.