세이박스

php DB 인젝션 공격 방어

웹프로그램
인젝션 방어를 위한 처리를 하기 위해선
get, post 로 넘어오는 모든 변수중에서 DB에 사용될 변수에 대해 검수를 거친뒤에 DB에서 사용하도록 해야하나 이미 구축된 사이트에 일일이 적용하기엔 힘들 경우 아예 get, post 데이터 전체를 검사하도록 다음과 같이 구현해 봤습니다.

//인젝션 공격 막기 넘어오는 변수들 모두 검사

//GET
while(list($fildn1,$fildv1) = each($_GET)) {
  if(eregi("--",$fildv1)) {
    echo "<script>alert('[요청거절] 요청하신 값중에 사용할 수 없는 코드가 들어 있습니다.');history.back();</script>";
    exit;
  }
}

//POST
while(list($fildn2,$fildv2) = each($_POST)) {
  if(eregi("--",$fildv2)) {
    echo "<script>alert('[요청거절] 요청하신 값중에 사용할 수 없는 코드가 들어 있습니다.');history.back();</script>";
    exit;
  }
}

일단 인젝션 공격에 대표적인 문구인 "--" 하나 넣어 봤는데 필요시 "--|;|\.js" 처럼 "|"로 구분해서 추가 하면 되겠죠!
물론, 정상적인 값들까지 차단 될 수 있다는 문제가 있긴 합니다.
따라서, 차단할 패턴은 잘 선택해서 입력하세요.
그리고, ".js" 앞에 "\" 표시 붙인 이유는 "." 점이 정규식 예약어라서 무시하도록 하기 위해 "\"원화 표시를 붙여 줍니다.
정규식 예약어는 세이박스에서 조회 해서 확인 하세요!

하지만, 효율성을 위해서 사이트 구축시 처음부터 인젝션 공격을 고려해서 코딩 하세요!
이게 정답이다 할만한건 없지만 자신의 사이트에 맞는 최적화 방법이 최고 입니다.

예로 들자면 $num 이라는 변수에는 단순 숫자만 넘어와야한다면
if(eregi("[^0-9]",$num)) echo "접속차단";

이런식으로 필요하지 않는 값을 원천적으로 차단 해주는게 가장 좋습니다.
이유인즉, 최근에는 Ascii 코드 값으로 문자를 만들어 공격 하기도 합니다.
이럴경우 제가 만든 소스로는 좀 힘들겠죠...

그럼, 여러분들이 만들어 두신 좋은 차단 방법 좀 있으면 올려주세요~
화이팅!!

MSSQL 작업스케줄러로 반복 적으로 쿼리 실행하기

데이타베이스
최근 스크립트 인젝션 공격으로 인해 DB에 <script *></script> 가 삽입 되어 애를 먹은적이 있었다.

다행히 스크립트를 찾아서 지워주는 쿼릴 실행해서 복구는 되었으나 지속적으로 들어와 서비스를 중단하고 소스를 수정해야하는 사항까지 갈것 같았다.
그래서 생각한게 보안처리 될 동안 복구해주는 쿼리가 주기적으로 돌아가 주면 좋겠다는 생각에 MSSQL 에이전트 작업을 이용해보았다.

백업등을 목적으로 주로 이용하지만 이렇게 원하는 쿼리를 주기적으로 동작하게끔도 할수 있다.

1. 먼저 "엔터프라이즈 관리자"를 실행한다.

사용자 삽입 이미지

2. 다음으로 콘솔루트 > Microsoft SQL Servers > (LOCAL) ... > 관리 > 작업 을 선택한다.

사용자 삽입 이미지

3. 마우스 우측 버튼을 눌러 작업 추가를 선택한다.
여기서 이름을 구분할 수 있게 적어두고 범주는 적당히 데이터베이스 유지 관리 등 선택한다.
그리고, 당연 쿼리를 실행할 소유자를 선택한다. 쿼리 적용할 소유자 필요하면 다른 작업자를 위해 설명을 달아두는것도 좋을듯..그리고 우측 대상 서버 선택 보통 [local]

사용자 삽입 이미지


4. 다음으로 단계 탭을 클릭한다. 여기서 새로 만들기 클릭

사용자 삽입 이미지


5. 단계이름 적당히 입력하고 유형은 Transact-SQL 스크립트 [TSQL] 를 선택 그리고 데이터베이스를 선택한다. 그리고 명령칸에 쿼리를 작성한다.

사용자 삽입 이미지


6. 이제 일정 탭을 선택후 새일정을 추가한다. 스크립트를 언제 마다 돌릴지 설정 해주는것이다.

사용자 삽입 이미지

7. 이름을 적당히 넣어주고 되풀이를 선택한다. 그리고 되풀이 옆에 변경을 클릭!

사용자 삽입 이미지


8. 되풀이 방법은 매일 혹은 매주 선택하고 매일 인 경우 몇일마다 1일마다면 매일이 되는것이겠죠. 하루빈도 한번수행할지 되풀이 수행할지 선택 되풀이 수행 체크하고 1분으로 설정하면 1분마다 계속 줄기차게 실행이 되겠죠 그리고 시작 끝은 그냥 놔두시면된 기본설정이 24시간이니깐.

사용자 삽입 이미지

9. 마지막으로 알림 탭에서 처리후 관리자에게 처리 상태를 메일을 발송할지 여부를 선택할 수 있다. 즉, 실패할 경우라고 선택하고 메일을 적어두면 메일을 보고서 쿼리가 동작 안하는구나 하고 판단을 할 수 있겠죠. 필요하시면 설정하시면됩니다.

사용자 삽입 이미지

10. 이것으로 설정이 끝났으며 목록에서 자신이 추가한 항목에 마우스 우측 버튼 눌러 시작을 클릭하시면 동작합니다. 만약 중지하고 싶으시면 중지 그리고 아예 비활성화 시킬수도 있습니다. 말그대로 "비활성화"를 선택해주시면 절대 동작 안합니다.

사용자 삽입 이미지

원래 백업 관리 계획용으로 주로 이용되나 저처럼 반복적인 쿼리 실행을 하고자 할 때 유용하게 사용하실 수 있을겁니다. 응용해서 잘 이용해보세요!

위 글은 제가 직접 작성한 글이니 가져가실땐 꼭 출처까지 표시 해주세요!
출처 : 세이박스 http://www.saybox.co.kr/460

DB injection script 스크립트 공격 복구 및 보안

데이타베이스

DB injection 공격?
구글에서 <script src= 0.js 라고 검색하면 놀랄 정도로 많은 사이트들이 DB 공격을 받았음을 확인 하실 수 있을겁니다.
제가 관리하는 사이트 또한 위와같은 스크립트 삽입되어 수많은 사이트를 찾아 다니며 복구하고 나름대로 보안하는 방법을 접하게 된 것을 올려 봅니다.


1. 공격 유형 :
SQL injection 홈페이지 상의 DB사용하는 페이지를 공격 즉, 웹소스 취약한 곳을 통해 DB를 공격.
특수 코드 삽입해서 DB에 스크립트를 삽입하여 접속하는 사용자에게 악성코드를 설치하는 유형.


2. 조치 시 주의 사항
참조 : http://swbae.egloos.com/1747128
1) 홈페이지 변조를 통해 악성코드 링크를 삽입한게 아니라, SQL injection 기법을 이용해 DB 컨텐츠에 삽입한 것입니다.
2) 조치 시 DBA 의 도움을 받는게 좋습니다.
3) 공격 때문에 기존의 데이터가 일부 덧씌워져 변경되었을 수 있습니다. 이럴 땐 백업의 도움을 받아야 겠지만, 일부 데이터의 유실은 어쩔 수 없을 듯...
4) 근본 원인은 사이트가 SQL injection 공격에 취약하게 개발되어 있어서 그렇습니다. 공격 포인트를 파악해서 외주개발 업체, 혹은 내부개발팀을 통해 소스를 수정하세요.
5) 소스를 수정할 수 없는 경우 웹 방화벽이 도움이 될 수도 있습니다. 그러나, 제품 도입시 면밀히 검토하실 필요가 있습니다. 단순 패턴 매칭 형태를 사용해서, 보유패턴과 1byte 만 틀려도 탐지 못하는 제품이 몇 개 있더군요.


3. 공격으로 생긴 DB table 삭제
comd_list 테이블 삭제
ahcmd 테이블 삭제
foofoofoo 테이블 삭제
Reg_Arrt 테이블 삭제
comd_list 테이블 삭제
D99_CMD 테이블 삭제
D99_TMP 테이블 삭제
Kill_kk 테이블 삭제
jiaozhu 테이블 삭제


4. 삽입 스크립트 제거 복구
DECLARE @T varchar(255), @C varchar(255);
DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR
b.xtype = 35 OR
b.xtype = 231 OR
b.xtype = 167);
OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;
WHILE (@@FETCH_STATUS = 0) BEGIN
  EXEC(
    'update ['+@T+'] set ['+@C+'] = left(
            convert(varchar(8000), ['+@C+']),
            len(convert(varchar(8000), ['+@C+'])) - 6 -
            patindex(''%tpircs<%'',
                      reverse(convert(varchar(8000), ['+@C+'])))
            )
      where ['+@C+'] like ''%<script src=http://s.ardoshanghai.com/s.js></script>'''
      );
  FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;

'스크립트 부분은 삽입된 스크립트를 입력


5. 보안 적용 1 - MSSQL 메모리에서 위험한 sp들을 내린다.
보안상 위협이 될 수 있는 개체들에 대하여 일반 사용자 그룹의 사용권한을 제한한다.
참조: http://blahblah.springnote.com/pages/351077
SP 등록해제는 위험을 감안해야 하므로 메모리에서만 내린다. 단점, 재부팅되거나 DB 재시작시 다시 아래 쿼리 실행 할것!

dbcc xp_cmdshell(free)
dbcc xp_dirtree(free)
dbcc xp_regdeletekey(free)
dbcc xp_regenumvalues(free)
dbcc xp_regread(free)
dbcc xp_regwrite(free)
dbcc sp_makewebtask(free)


6. 보안 적용 2
무엇보다 DB 인젝션이 발생한 원인인 로그인, 회원가입, 게시판 등 사용자가 DB를 접하게 되는 소스 개발시 특수 문자 보안 적용 안된 경우가 가장 유력하다.
로그인, 회원가입, 아이디 비번찾기, 게시판 등이 개발자가 개발하면서 DB를 공격할만한 특수 문자에 대한 차단 기능을 적용하지 않은 문제로 판단됨. 소스를 모두 개선 해야함.
보안참조 : http://magic.littleworld.net/ai/kmod.asp?no=327&amp;isn=&amp;mymsg


위 글은 세이박스에서 작성한 글입니다.
출처를 적어 주시고 많은 국내 사이트들이 공격을 받고 있으니 도움이 되기 위해 많이 많이 올려주세요! ^^
출처 : 세이박스  http://saybox.tistory.com/453

mssql 전체 테이블 문자 검색 변경

데이타베이스
 
어느날 갑자기 DB에 "<script src=http://...></script>" 와 같은 내용이 삽입 된경우는 스크립트 삽입 공격을 받으신 겁니다.
 
참고로, 구글(http://www.google.co.kr) 에서 "<script src=http://...></script>" 내용을 검색해보세요.
국내 사이트중 어마어마 하게 많이 공격받은걸 확인 하실 수 있을겁니다.
 
MSSQL 을 사용중인 서버들이 공격 대상입니다.
항상 느끼는거지만 윈도우 관련 서버들이 취약점이 많다 보니 이런 문제가 생기는 것 같네요 저도 더 자세히 관련 공격 원인과 방어를 찾아봐야겠지마 끝이 없는듯 ㅡㅡ;
 
그럼, 테이블 마다 일일이 삽입된 스크립트를 일일이 지우는것도 끝이 없죠 그래서 다음과 같이 쿼리를 실행 해주시면 문제의 스크립트가 있는 테이블, 컬럼을 일일이 자동으로 찾아서 삭제 해줍니다.
 
 
DECLARE @T varchar(255), @C varchar(255);
DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR
b.xtype = 35 OR
b.xtype = 231 OR
b.xtype = 167);
OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;
WHILE (@@FETCH_STATUS = 0) BEGIN
  EXEC(
    'update ['+@T+'] set ['+@C+'] = left(
            convert(varchar(8000), ['+@C+']),
            len(convert(varchar(8000), ['+@C+'])) - 6 -
            patindex(''%tpircs<%'',
                      reverse(convert(varchar(8000), ['+@C+'])))
            )
      where ['+@C+'] like ''%<script src=http://...></script>'''
      );
  FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;
 
 
위 진하게 표시된 부분을 삽입된 스크립트 내용으로 넣어 주시면 됩니다.
만약 여러 종류의 스크립트가 삽입된경우 ''%<script%</script>''' 처럼 넣어 주셔도 됩니다. 하지만 정상적인 스크립트가 사라지는 경우가 발생하겠죠! 주의!
 
하지만, 안타깝게도 위 쿼리로 100% 복구 안될 가능성 있습니다.
가장 좋은 방법은 백업해두신거 복구하는게 가장 좋겠죠!
 
아무튼 행운을 빌며 해당 공격에 대해 더 자사한 정보 찾으면 올리겠습니다.

아파치 데몬 감시 스크립트

서버,보안
Apache 데몬 모니터링을 위한 스크립트
 
아파치 서비스를 운영하다 보면 접속자가 너무 많거나 이상 증상으로 데몬이 죽어 버리는 경우 상시 모니터링 하지 않는 이상 관리자가 확인 하기 전까지 서버는 웹 서비스를 멈추어 버린체 방치하게 된다. 그래서 적어도 한시간 이내에 한번은 데몬이 죽은는지 체크해서 다시 살리는 시스템을 생각하게 된다.
 
# 적당한 위치에 스크립트 파일 만들기
cd /usr/local/apache/bin
vi httpd_check.sh
#/bin/sh
DAEMON="httpd"
COUNT=$(ps acx | grep -c $DAEMON)
if [ "$COUNT" -gt "0" ]; then
   /usr/local/apache/bin/apachectl restart
else
   /usr/local/apache/bin/apachectl start
fi
 
# 스크립트 파일 실행 권환 주기
chmod +x httpd_check.sh
 
# 매 시간마다 위 스크립트 실행되도록 crontab 적용
crontab -e
00 * * * * /user/local/apache/bin/httpd_check.sh