2010. 12. 29. 14:32

ASP에서 DB체크후, SMS 메세지 발송.(step by step)


* 서버중 가입자에게 SMS 를 발송하는 서비스를 하는 업체가 있습니다.
  서버는 해킹으로 인해 SQL 패스워드등을 모두 강탈당한 상태 입니다.

* 우선 방화벽등의 서버상의 보안 수준을 높이는 방법이 있겠습니다.
   1. 방화벽을 이용해서 외부에서 SQL 포트 접근하지 못하게 진행.
   2. NT/SQL 계정밎 패스워드 변경.
   3. 기타 웹방화벽이나, 폴더의 보안수준, DB 의 특정 계정별로 Select, Insert, Delete 기능 할당. 등등.
   
    서버상의 보안 수준을 높이는 방법은 이방법 이외에도 수많은 방법이 있기 때문에 모두 기재하지는 않겠습니다.

* SMS 를 발송하는 데이터 베이스는 SMSSEND 라는 테이블에 값이 있을경우, 해당 값을 통신사에 보내여 SMS 발송하게 됩니다. 공격자는 SMSSEND 테이블에 강탈한 SQL 계정을 가지고 Insert 해 약 800만건이상의 대략의 SMS 를 발생시켰습니다.


* 만약 10만건 이상의 SMS 발송시에 관리자에게 통보할수 있도록 ASP 를 이용해서 체크툴을 만든것입니다.
  
* SMS 데이터 베이스중 SMSSEND 테이블의 열 체크 후 10만건 이상일경우 관리자에게 SMS 발송.

check.asp


  Dim strConnect
 
 strConnect="Provider=SQLNCLI.1;Password=pass;Persist Security Info=True;User ID=UserID;Initial Catalog=SMS;Data Source=Localhost;"
   
    Set Dbcon = server.CreateObject("ADODB.Connection")
    Dbcon.Open strConnect
   
    Set Rs=Server.CreateObject("ADODB.RecordSet")
    
<!-- Group by 절을 이용해서 특정 ID (userid)가 10만건 이상인 것만 추출 합니다..-->

    Sql = "Select count(userid) as cnt ,userid from SMS_Submits group by userid having count(userid)>100000"
   
    Rs.Open Sql,Dbcon,3
    

    if not Rs.Eof Then
   
    cnt = Rs("cnt")
    userid = Rs("userid")
   
    response.write "<br> 70.000개 초과된 ID : "
    response.write userid
    response.write "  입니다. <p> 개수는 : "
    response.write cnt
    response.write "  입니다.<p>"
    

<!-- if 문을 이용해서 값을 비교합니다.-->

    if cnt > 100000 then
      response.write " <br> 100.000개 초과"
    else
      response.write " <br> 100.000개 초과 없음"
    end if
   
    else
      response.write " 10만건이상되는 아이디는 존재하지 않습니다."
    end if


* 10만건 이상이 되었을경우 웹페지에 나타나게 설정되었습니다.
   이제 10만건이상일경우 웹페이지에 나타나게 하였으니, SMS 를 발송하게 하는것을 확인하겠습니다.
 
   만약 이미 10만건이상의 데이터가 올라가 있는데, 관리자에게 해당 사항을 전달하기 위해서 SMS 발송 서버를
   10만건이상의 데이터가 올라가있는 서버에 올리면, 10만건 이상의 데이터가 모두 보내진다음에 보내기 때문에
   상당한 시간이 소요될것이며, SMS 를 발송하는 의미가 없을것입니다.

   이에 타 서버에 있는 SMS 서버를 이용해서 보내도록하겠습니다.
   위의 문에서 Response.Write 문만 변경해서 다른 페이지를 띄우도록하겠습니다.

  다음 부분만 변경.
    
    if cnt > 100000 then
         response.write "<meta http-equiv=""refresh"" content=""1; url=http://duck.pe.kr/Mysql_insert.asp"">"
    else


 메타 테그를 써서 다른 페이지를 구지 띄우게 했습니다.
해킹당한 서버에 SQL 커넥션 문구를 남겨두지 않기 위함입니다.

  Mysql_insert.asp

SMS 관리자,사용자 발송

<%
 
  Dim Phone(2)
 
  strConnect="driver={MySQL ODBC 5.1 Driver};
server=xxx.xxx.xxx.xxx;uid=userid;pwd=password;database=DBName;option=3;Port=3306"

  Set DbCon = Server.CreateObject("ADODB.Connection")
  DbCon.Open strConnect
 
  Phone(0) = "01012312312"  '보내는사람 1
  Phone(1) = "01099922211"  '보내는 사람 2
  Phone(2) = "01011222144"  '보내는 사람 3
 

 
  Set Rs=Server.CreateObject("ADODB.RecordSet")

  For each Item in Phone
  Sql = "insert into Smstable (컬럼1, 컬럼2) values ('"& Item &"','10만건 이상입니다.')"
  Set RS = DbCon.Execute(Sql)
 
  Next
 
  DbCon.Close
%>


위 문을 보면 ASP 에서 MySQL 에 접속하는 커넥션 문을 볼수 있습니다. SMS 서버가 MySql 을 사용하기 때문이죠.

주의해야할점은 ODBC 5.1 Driver 을 설치해야만, 한글이 SMS 문자로 간다는 것입니다. ODBC 3.15 Driver 가 설치되어 있어 그것으로 했더니만 다 깨져서 나오더군요.

For each 문을 이용해서
Phone()="전화번호"  에 들어 있는 값을 불러왔습니다.
SQL 문에서는 "& Item &"  으로 값을 불러왔구요.


그럼 페이지를 주기적으로 자동 실행할수 있도록 VBScript 를 이용해서 예약 프로그램에 넣도록하겠습니다.

Sub Run(url)
        Set wshShell = WScript.CreateObject("WScript.Shell")
        wshShell.Run url
        Set wshShell = Nothing
End Sub

Run "http://check.sms.com/check.asp"