>백엔드 개발 >PHP 튜토리얼 >PHP의 SQL 주입 분석

PHP의 SQL 주입 분석

WBOY
WBOY원래의
2016-07-29 09:15:021021검색

1. 인젝션 공격의 종류
공격 동기에는 다양한 유형이 있을 수 있지만 언뜻 보면 더 많은 것으로 보입니다. 이는 매우 사실입니다. 악의적인 사용자가 여러 쿼리를 수행하는 방법을 찾는 경우입니다. 이에 대해서는 이 기사의 뒷부분에서 자세히 논의하겠습니다.

등 스크립트가 SELECT 명령을 실행하는 경우 공격자는 아래와 같이 WHERE 절에 "1=1"과 같은 조건을 주입하여 테이블의 모든 행을 강제로 표시할 수 있습니다(여기서 주입된 부분은 굵게 표시됨). :
SELECT * FROM wines WHERE Variant = 'lagrein' OR 1=1;'

앞서 논의한 것처럼 이는 테이블의 일반적인 구조를 나타내기 때문에 그 자체로 유용한 정보가 될 수 있습니다. 일반 기록)뿐만 아니라 기밀 정보가 포함된 기록도 공개될 가능성이 있습니다.
업데이트된 지시문은 잠재적으로 보다 즉각적인 위협을 가할 수 있습니다. SET 절에 다른 속성을 배치함으로써 공격자는 다음 예(주입된 부분이 굵게 표시됨)와 같이 현재 업데이트된 레코드의 모든 필드를 수정할 수 있습니다.
UPDATE wines SET type='red', 'vintage'='9999' WHERE Variant = 'lagrein'

업데이트 명령의 WHERE 절에 1=1과 같은 참 조건을 추가하면 이 수정 범위가 다음 예(주입 부분이 굵게 표시됨)와 같이 각 레코드로 확장될 수 있습니다.
UPDATE wines SET type='red', 'vintage'='9999 WHERE Variant = 'lagrein' OR 1=1;'

아마도 가장 위험한 명령은 DELETE일 것입니다. 상상하기 어렵지 않습니다. 주입 기술은 이미 본 것과 동일합니다. 아래 예(삽입 부분은 굵게 표시됨)와 같이 WHERE 절을 수정하여 영향을 받는 레코드의 범위를 확장합니다.
DELETE FROM wines WHERE 품종 = 'lagrein' OR 1=1;'

2. 다중 쿼리 삽입
다중 쿼리 주입은 단일 쿼리에 여러 개의 파괴적인 명령이 포함될 수 있도록 함으로써 공격자가 초래할 수 있는 잠재적 피해를 더욱 악화시킵니다. MySQL 데이터베이스를 사용할 때 공격자는 예상치 못한 종결자를 쿼리에 삽입하여 이를 쉽게 달성할 수 있습니다. 삽입된 따옴표(단일 또는 이중)는 예상 변수의 끝을 표시한 다음 세미콜론으로 지시문을 종료합니다. 이제 종료된 원래 명령 뒤에 추가 공격 명령을 추가할 수 있습니다. 최종 파괴적인 쿼리는 다음과 같습니다.

<code><span><span>SELECT</span> * <span>FROM</span> wines <span>WHERE</span> variety = <span>'lagrein'</span>;</span><span><span>GRANT</span><span>ALL</span><span>ON</span> *.* <span>TO</span><span>'BadGuy@%'</span> IDENTIFIED <span>BY</span><span>'gotcha'</span>;</span>' </code>

이 주입은 새로운 사용자 BadGuy를 생성하고 해당 사용자에게 네트워크 권한(모든 테이블에 대한 모든 권한)을 부여합니다. 여기에는 "불길한" 비밀번호도 추가됩니다. 이 간단한 SELECT 문입니다. 이전 기사의 조언을 따르고 프로세스 사용자의 권한을 엄격하게 제한한 경우 웹 서버 데몬에는 취소한 GRANT 권한이 더 이상 없기 때문에 이 방법은 작동하지 않습니다. 그러나 이론적으로 이러한 공격을 통해 BadGuy는 데이터베이스로 원하는 모든 작업을 자유롭게 수행할 수 있습니다.

이러한 다중 쿼리가 MySQL 서버에서 처리되는지 여부에 대한 결론은 고유하지 않습니다. 이 중 일부는 MySQL의 다른 버전으로 인해 발생할 수 있지만 대부분은 여러 쿼리가 존재하는 방식으로 인해 발생합니다. MySQL의 모니터링 프로그램은 이러한 쿼리를 완벽하게 허용합니다. 일반적으로 사용되는 MySQL GUI-phpMyAdmin은 최종 쿼리 전에 이전 내용을 모두 복사하고 이 작업만 수행합니다.
그러나 주입 컨텍스트 내의 다중 쿼리 대부분은 PHP의 mysql 확장에 의해 관리됩니다. 다행스럽게도 기본적으로 쿼리에서 여러 명령을 실행하는 것을 허용하지 않습니다. 두 명령(예: 위에 표시된 주입)을 실행하려고 하면 단순히 실패가 발생합니다. 오류가 설정되지 않으며 출력 정보도 생성되지 않습니다. 이 경우 PHP는 기본 동작을 "정기적으로"만 구현하지만 실제로 대부분의 간단한 주입 공격으로부터 사용자를 보호할 수 있습니다.
mysql과 마찬가지로 PHP5의 새로운 mysqli 확장(http://php.net/mysqli 참조)은 본질적으로 다중 쿼리를 지원하지 않지만 다중 쿼리 구현을 지원하는 mysqli_multi_query() 함수를 제공합니다. 그렇게 하세요.
그러나 PHP5와 함께 번들로 제공되는 내장형 SQL 데이터베이스 엔진(http://sqlite.org/ 및 http://php.net/sqlite 참조)인 SQLite의 상황은 더욱 심각합니다. 사용자 관심. 어떤 경우에는 데이터베이스가 일괄 쿼리, 특히 일괄 INSERT 문 처리를 매우 효율적으로 최적화할 수 있기 때문에 SQLite는 기본적으로 이러한 다중 명령 쿼리를 허용합니다. 그러나 sqlite_query() 함수는 쿼리 결과가 스크립트에서 사용되는 경우(예: SELECT 문을 사용하여 레코드를 검색하는 경우) 여러 쿼리 실행을 허용하지 않습니다. 3. INVISION Power BOARD SQL 인젝션 취약점
Invision Power Board는 잘 알려진 포럼 시스템입니다. 2005년 5월 6일 로그인 코드에서 SQL 주입 취약점이 발견되었습니다. 발견한 것
저자는 GulfTech Security Research의 James Bercegay입니다.
이 로그인 쿼리는 다음과 같습니다.

<code><span>$DB</span>->query(<span>"SELECT * FROM ibf_members WHERE id=<span>$mid</span> AND password='<span>$pid</span>'"</span>); </code>

其中,成员ID变量midID

以上就介绍了PHP中SQL注入解析,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.