'분류 전체보기'에 해당되는 글 213건
- 2012.10.18 흑형 소울치즈버거
- 2012.10.17 향상된 for문
- 2012.09.20 dezend라는게 있었네..
- 2012.09.20 테크노트 분석중...
- 2012.09.19 CSRF 토큰에 대해서 1
- 2012.09.14 비주얼 C에서 디버깅할때 어셈을 hex로 바꾸는거
- 2012.09.07 정규식 관련
- 2012.09.07 시큐어 코딩을 위한 방법-그누보드
- 2012.08.29 php 설정관려
- 2012.07.31 mssql2000 은 row_number가 없다.
예)
LIst<String> strList = new ArrayList<String>();
for(String str : strList){
// 처리내용
}
'개인적인 프로그램 > JAVA/JSP' 카테고리의 다른 글
파일을 하나의 통합테이블로 관리하는 것에 대해서 (0) | 2013.03.11 |
---|---|
The import collides with another import statement 라는 에러 (0) | 2013.03.04 |
이클립스에서 jsp가 jsp editor로 안열릴경우 (0) | 2011.11.11 |
java 에서 unix timestamp (0) | 2011.10.26 |
벨로시티(velocity)에서 브라우저 캐쉬없애기 (0) | 2011.10.26 |
테크노트는 zend로 암호화 되어 있는데 이런걸 풀어주는 dezend라는게 있었다..
확실히는 모르겠지만 zend로 암호화되도 apache에는 결국 디코딩된것처럼 올라가 있을테고 그걸 읽어서 파일로 만들어주는게 아닌가 싶다.
우선 onerror에 의한 xss가 먹는다 일부 문자열을 치환시켜 막으려고 하는것도 있긴한데 문자열 조합방식으로 우회가능하다.
sql injection에는 강한 내성을 가지고 있다 기본적으로 #이나 '같은 무자열은 모두다 공백치환해버린다.
또한 숫자가 들어가는 필드에는 숫자이외에는 들어가면 0으로 처리해버리는듯 하다.
CSRF에 대한 내성도 강하다
주요모듈은 반드시 수정버튼을 누르면 관리자 비밀번호를 묻는 시스템이다.
그렇다면 노출된 정보가 약하냐면 그것도 아니다
노출된 정보에서 크리티컬한건 *로 치환시키고 사용자의 패스워드를 찾는방식도 순전히 힌트에만 의존하며 아니면 관리자가 수정해주는방식이다.
기존에 있는 비밀번호를 불러주는 방식이 아님
기본적으로 단방향 암호화방식을 써서 인증에 필요한 암호들은 다 인코딩해버렸다
php자체의 crypto라는 함수를 쓰고 salt를 붙여서 암호화한다.
또한 소스를 zend라는 것을 사용하여 암호화했기때문에 소스에 기반한 공격방법을 찾기 힘들다.
뭐 이부분은 공개형과 오픈소스의 차이라고 봐야겠다
테크노트는 다른것과 다르게 공개형이긴 해도
오픈소스로 볼수는 없기떄문에..
공개형이라고는 하지만 한회사의 사업기반이므로 보안에 충실하게 되어 있다.
다만 XSS부분은 제로보드가 더 뛰어났다.
XSS 부분은 계속된 공격방법이 나오므로 어쩔수 없는 문제라고 생각한다.
또한 HML5가 나오면 좀더 많은 공격방법이 나올것이라고 예상되는데
보안관련된 사항을 주시하지 않거나 HTML5에 대해서 소홀히 하면 기존에 들인 노력이 허사가 될것이다.
CSRF 토큰이란 CSRF 공격에 대응을 하기 위한 방어기법중 하나다
원리는 다음과 같다. 보통 CSRF공격은 특정액션시 넘어가는 파라미터를 가지고 그 행위를 특정액션이외에 자동으로 넘어가게 하는 기법인데
이것을 넘어가는값중에 랜덤으로 발행되는 키값을 넘기고 받게 해서 이값이 일치하지 않으면 그 액션을 수행하지 않는것이다.
실례로 든다면 게시판에 글을 등록시 등록폼을 통해서 반드시 등록을 해야된다는 정책을 수립하고 글을 등록폼 화면을 호출시 랜덤한 키값을 세션에 저장하고 실제로 글을 등록하려고 할때 세션에 있는 해당 키값과 넘어온 키값이 동일한지를 체크하는것이다 해당 키값이 없거나 불일치하다면 그것은 CSRF공격으로 판단하는 것이다.
하지만 이것도 우회가 가능하다.
단순 CSRF토큰만으로 체크할경우 iframe등을 통해서 해당 페이지를 호출한후 parent 에서 iframe의 스크립트를 호출하여 CSRF토큰도 생성시키는 방법으로 동작하게 할 수 있다.
이부분을 막으려면 글등록시 캡차코드와 같은것을 토입했을경우 막을 수 있다.
개인적으로는 CSRF 공격의 최상의 방어법은 캡차코드라고 생각된다. 물론 본인계정의 패스워드를 다시 묻는방법도 훌륭한 방법이다.하지만 본인계정의 패스워드를 묻는것은 개인정보수정페이지와 같이 민감한 페이지에 사용되는 것이 옳다고 생각되고 그이외에는 캡차를 체크하는게 좋다고 생각된다.
하지만... 현실적으로 개발자 입장에서 무쟈게 귀찮은 일이다. 이걸 자동화하는 프로세스 + 라이브러리가 있으면 좋겠다..
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<script>
function test(){
var a = document.getElementById('test').value;
var b = new Array();
b=a.split('\r\n');
var c = document.getElementById('test1');
var d = "";
for(var i = 0 ; i< b.length ;i++){
if(b[i].indexOf(" ") !=0){
var e = b[i].split(" ");
for(var j = 0 ; j< e.length ;j++){
if(e[j] !=""){
d +="\\x"+e[j];
}
}
}
}
c.innerHTML=d;
}
</script>
</HEAD>
<BODY>
되는 이유 : 코드를 자르면 hex줄의 앞에는 스페이스가 없고 <br/>
hex가 아닌줄은 앞에 스페이스가 있음<br/>
<textarea id="test"></textarea>
<a href="#" onclick="test();return false;">실행</a>
<div id="test1"></div>
</BODY>
</HTML>
1. 필드를 넣는부분 필터링
ORDER 구문이나 WHERE에서 검색필드에 대해서
// 필드값에 a-z A-Z 0-9 _ , | 이외의 값이 있다면 검색필드를 고정한다.
솔직히 | 이건 왜 들어가나 싶긴한데 저렇게 고정하면 sqlinjection에 상대적으로 유리하다.
// OBJECT 태그의 XSS 막기
function bad120422($matches)
{
$tag = $matches[1];
$code = $matches[2];
if (preg_match("#\bscript\b#i", $code)) {
return "$tag 태그에 스크립트는 사용 불가합니다.";
} else if (preg_match("#\bbase64\b#i", $code)) {
return "$tag 태그에 BASE64는 사용 불가합니다.";
}
return $matches[0];
}
// 악성태그 변환
function bad_tag_convert($code)
{
global $view;
global $member, $is_admin;
if ($is_admin && $member[mb_id] != $view[mb_id]) {
//$code = preg_replace_callback("#(\<(embed|object)[^\>]*)\>(\<\/(embed|object)\>)?#i",
// embed 또는 object 태그를 막지 않는 경우 필터링이 되도록 수정
$code = preg_replace_callback("#(\<(embed|object)[^\>]*)\>?(\<\/(embed|object)\>)?#i",
create_function('$matches', 'return "<div class=\"embedx\">보안문제로 인하여 관리자 아이디로는 embed 또는 object 태그를 볼 수 없습니다. 확인하시려면 관리권한이 없는 다른 아이디로 접속하세요.</div>";'),
$code);
}
//return preg_replace("/\<([\/]?)(script|iframe)([^\>]*)\>/i", "<$1$2$3>", $code);
// script 나 iframe 태그를 막지 않는 경우 필터링이 되도록 수정
return preg_replace("/\<([\/]?)(script|iframe)([^\>]*)\>?/i", "<$1$2$3>", $code);
}
// 내용을 변환
function conv_content($content, $html)
{
global $config, $board;
if ($html)
{
$source = array();
$target = array();
$source[] = "//";
$target[] = "";
if ($html == 2) { // 자동 줄바꿈
$source[] = "/\n/";
$target[] = "<br/>";
}
// 테이블 태그의 갯수를 세어 테이블이 깨지지 않도록 한다.
$table_begin_count = substr_count(strtolower($content), "<table");
$table_end_count = substr_count(strtolower($content), "</table");
for ($i=$table_end_count; $i<$table_begin_count; $i++)
{
$content .= "</table>";
}
$content = preg_replace($source, $target, $content);
$content = bad_tag_convert($content);
// XSS (Cross Site Script) 막기
// 완벽한 XSS 방지는 없다.
// 이런 경우를 방지함 <IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
$content = preg_replace("#\/\*.*\*\/#iU", "", $content);
// object, embed 태그에서 javascript 코드 막기
$content = preg_replace_callback("#<(object|embed)([^>]+)>#i", "bad120422", $content);
$content = preg_replace("/(on)([a-z]+)([^a-z]*)(\=)/i", "on$2$3$4", $content);
$content = preg_replace("/(dy)(nsrc)/i", "dy$2", $content);
$content = preg_replace("/(lo)(wsrc)/i", "lo$2", $content);
$content = preg_replace("/(sc)(ript)/i", "sc$2", $content);
$content = preg_replace_callback("#<([^>]+)#", create_function('$m', 'return "<".str_replace("<", "<", $m[1]);'), $content);
$content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content);
// 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다.
// value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다.
$content = preg_replace("/((?<=\<param|\<embed)[^>]+)(\s*=\s*[\'\"]?)always([\'\"]?)([^>]+(?=\>))/i", "$1$2never$3$4", $content);
// 이미지 태그의 src 속성에 삭제등의 링크가 있는 경우 게시물을 확인하는 것만으로도 데이터의 위변조가 가능하므로 이것을 막음
$content = preg_replace("/<(img[^>]+delete\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content);
$content = preg_replace("/<(img[^>]+delete_comment\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content);
$content = preg_replace("/<(img[^>]+logout\.php[^>]+)/i", "*** CSRF 감지 : <$1", $content);
$content = preg_replace("/<(img[^>]+download\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content);
$pattern = "";
$pattern .= "(e|&#(x65|101);?)";
$pattern .= "(x|&#(x78|120);?)";
$pattern .= "(p|&#(x70|112);?)";
$pattern .= "(r|&#(x72|114);?)";
$pattern .= "(e|&#(x65|101);?)";
$pattern .= "(s|&#(x73|115);?)";
$pattern .= "(s|&#(x73|115);?)";
$pattern .= "(i|&#(x6a|105);?)";
$pattern .= "(o|&#(x6f|111);?)";
$pattern .= "(n|&#(x6e|110);?)";
$content = preg_replace("/".$pattern."/i", "__EXPRESSION__", $content);
}
else // text 이면
{
// & 처리 : & 등의 코드를 정상 출력함
$content = html_symbol($content);
// 공백 처리
//$content = preg_replace("/ /", " ", $content);
$content = str_replace(" ", " ", $content);
$content = str_replace("\n ", "\n ", $content);
$content = get_text($content, 1);
$content = url_auto_link($content);
}
return $content;
}
<?php를 하면 잘되는데
<? 를 그냥하면 즉.. php를 뺴면 안되는경우가 있다
이건 php.ini의 short_open_tag = Off를
On으로 바꿔줘야한다.
다음의 그 옵션에 대한 설명이다.
; This directive determines whether or not PHP will recognize code between
; <? and ?> tags as PHP source which should be processed as such. It's been
; recommended for several years that you not use the short tag "short cut" and
; instead to use the full <?php and ?> tag combination. With the wide spread use
; of XML and use of these tags by other languages, the server can become easily
; confused and end up parsing the wrong code in the wrong context. But because
; this short cut has been a feature for such a long time, it's currently still
; supported for backwards compatibility, but we recommend you don't use them.
; Default Value: On
; Development Value: Off
; Production Value: Off
; http://www.php.net/manual/en/ini.core.php#ini.short-open-tag
short_open_tag = On