금칙어 체크 후 문서삽입 금지 시키는 문제
CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.2 |
기존 사용하는 애드온에서 이미 작성된 코드를 사용했는데 그냥 글 작성이 되어 버리는 것 같습니다.
금칙어가 확인되면 별도 php파일의 함수에
header("Content-Type: text/xml; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
if($var)
printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<response>\r\n<error>-1</error>\r\n<message>".$message."</message>\r\n</response>",$var);
else
printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<response>\r\n<error>-1</error>\r\n<message>".$message."</message>\r\n</response>");
위와 같은 코드로 메시지를 띄웁니다. 제가 직접 브라우저에서 금칙어 넣고 게시글 등록 눌러보면 메시지와 확인 버튼이 표시된 알림창이 잘 뜹니다.
그런데 위와 같은 것을 무력화하고 그냥 insert act가 진행될 수 있나요??
일반적인 브라우저가 아닐수도 있다는 의심이 되고 있습니다.
- 푸시앱에서 새글 작성시 푸시알림이 발생하지 않더군요.
그래서 그냥 직접 다른방식으로 코드를 바꿔 봤습니다.
$message = '금지어 또는 금지 소스가 포함되어 등록 할 수 없습니다.';
$this->act = 'true';
$this->stop($message);
위와 같이 코드를 작성하면 뚫을 수 없는건가요?
1.기존코드의 경우 저 메시지창 자체가 안뜨게 우회해서 글 작성을 성공할 수 있나요?
- 아니라면 필터링 자체를 통과했다고 밖에..
2. 1번 질문에서 우회할 수 있다면 두번째 변경한 코드는 우회하지 못하나요?
댓글 32
before_module_proc, procBoardInsertDocument 에서 금칙어 확인되면
$this->act = 'true';
$this->stop($message);
이렇게 처리되는데 이게 뚫리네요.
제가 직접 브라우저에서 글쓰기로 진입해서 해보면 차단되는 알림창 뜨고 더 진행이 안되는데....
1번 코드 밑에 exit(); 을 넣어보시겠어요?
2번 코드에서는 return false; 를...
1그부분은 생략되어 있고 코드는 들어가 있습니다.
2번 코드에 넣어볼게요.
dispBoardWrite 액션을 계속 하고 있는데 그에 비해서 실제 글 등록되는건 매우 적긴 합니다.
그런데 이렇게 작성되는 글은 푸시앱 모듈에서 새글로 인식을 안하고 있네요.
금칙어를 사용한 게시글이 스팸게시글인 경우라면, 뭔가 다른 우회방법이 있는게 아닐까 싶습니다.
u200b 와 같이 보이지 않는 문자열을 집어넣어 금칙어 필터링에서 빠져나온다던가,
또는 다른 모듈의 취약점을 통해 DB에 직접 게시글을 집어넣는다던가...
dispBoardWrite 액션을 통해 글 작성이 된거 같아 db에 직접 넣은거라는 것은 일단 배제한 상황(잠시 보류) 입니다.
<div style="width:1px;height:1px;overflow:hidden;"> </div>
이런 고정된 소스를 넣고 있어서...
width:1px,width:0px,overflow:hidden 을 검출하고 있어서 다른 걸 넣은거로는 보이지 않았는데 글이 새로 등록되면 다시 한번 더 자세하게 봐보겠습니다. 그런데 소스 자체는 계속 똑같은거 같아요.
네, 다시 확인하실 때 게시글 수정 > 에디터의 소스보기 방식으로 보지 마시고...
크롬(이나 파폭) 등에서 우클릭 > 검사(요소검사) 를 통해서 한번 확인해 보세요.
'이 문장에는 숨겨진 요소가 있습니다. 있과 습 사이예요.'
에디터의 소스보기로도 확인하기 어렵습니다.
아 그리고 db에 직접 밀어넣는건 아닌게 확인이 된게 저희가 procBoardInsertDocument 에서 트위터로 전송되는 자료를 사용하는데 이 문제의 글도 트위터로 전송되는거 확인되서 db에 직접 넣는건 아니라는 것이 확인 되었습니다.
검출을 피해가는건지 insert를 중지 시키는 것을 무력화 하는 건지 알아내야겠습니다.
웹지기 님 안녕하세요,
봇이라면 아마도 전단계에서 걸러 지겠지만
사람이 직접 스팸글을 쓴다는 가정하에 CSS 검토 부분을 좀 보강 하였으니,
잘 작동 되는지 한번 시험 해주셨으면 합니다. (http://crypto216.iwinv.net/xe/download)
감사합니다.
ksc
댓글 감사합니다.
ksc
테스트 삼아 애드온을 설치하고 오늘 사용해 보고 있는데 글 수정을 했더니 메시지가 뜨고 등록이 안되어 뒤로가기 해서 나왔는데요. 관리자한테 변수불일치 라고해서 쪽지가 왔는데 이건 왜 그런건가요? 이런 문제가 생길까 해서 애드온 사용을 못하고 있었는데요.
검토를 해보니 1.5초 이내에 등록을 해서 그런것 같습니다.
- 이건 문제가 있어 보이네요. 글 수정만 다시 해야 하는 경우가 사이트에 따라 발생할 수 있습니다. 특정한 기능이 글 작성 이후 수정을 한번 해야 한다던지.. 이 내용을 아는 사람들은 글을 쓰자마자 수정 -> 등록 을 누르는데 1.5초가 안걸립니다.
- 그리고 처음 1.5초 이내에 한번 등록 버튼을 누르면 잠시 기다렸다가 눌러도 반복해서 계속 차단되는 문제가 있네요.
- 일단 저희는 1500 의 값을 500 으로 고치고 다른 부작용을 더 체크해 보겠습니다.
스티커모듈 사용해서 댓글 작성할때 애드온에서 차단한다는 것 보았는데 이 제한 때문인 듯 하네요.
- 실제 스티커로 댓글 작성하려고하니 차단되네요. 시간을 아무리 짧게 해도 스티커가 인서트 되는 건 스티커를 누르자마자 인서트 되기 때문에 여길 우회할 수는 없을 것 같습니다.
스티커모듈의 스티커 댓글로 삽입할때 문제는
if (Context::get('content')가 스티커댓글내용이 아니라면 && (Context::get($name_text2) != $value2 || $pin_in < 500 || !($token_in + $pin >= $token - $delay && $token_in + $pin <= $token +1 )) )
일단 위와 같이 처리했습니다.
웹지기 님 안녕하세요,
1) 1.5초 이내에 등록
네, 그렇군요.
수정화면에 들어가서 짧은 시간내에 내용을 수정하고 업데이트 하더라도 1.5초는 걸릴 것으로 봤는데,
이 시간이 너무 긴 경우도 있겠군요.
2) 실제 스티커로 댓글 작성하려고하니 차단되네요. 시간을 아무리 짧게 해도 스티커가 인서트 되는 건 스티커를 누르자마자 인서트 되기 때문에 여길 우회할 수는 없을 것 같습니다.
스티커모듈 사용해서 댓글을 작성한다는게 어떤 것인지 인터넷을 찾아봤으나 잘 모르겠군요.
아마도 화면에서 어떤 단추(스티커?)를 누르면 댓글이 자동으로 작성되는 것 아닌가 하고 추축 해봅니다.
3) 위의 경우를 감안하여 해당 부분의 코드를 아래와 같이 변경하려고 합니다.
혹시 테스트가 가능하시면, 아래 코드가 위의 환경에서 잘 작동 되는지 한번 더 테스트 부탁 드립니다.
(스티커 댓글 이라는것이 생소하고 어찌 쓰는지 몰라 테스트를 못하겠군요.ㅜㅜ)
// 1500 조건은 좌표값 없을 경우로 한정
if (Context::get($name_text2) != $value2 || $pin_in < 1500 && !$ss_cp_in || !($token_in + $pin >= $token - $delay && $token_in + $pin <= $token +1 ) )
감사합니다.
ksc
스티커 모듈이라고 공개모듈이 있습니다.
댓글창에 스티커 목록이 노출되며 스티커를 클릭과 거의 동시에 댓글이 스트커를 특정할수 있는 스트링으로 댓글이 입력되니다. 초스피드라 저 시간으로 컨트롤이 안됩니다.
개인적으로는 500으로 시간을 줄이고
스티커모듈의 스티커 댓글로 입력되는 스트링을 조건으로 걸어 회피했습니다.
스티커모듈에 입력되는 스트링은 공개글로 작성하기 어렵네요. 스패머들이 이용할 수 있어서요.
&& !$ss_cp_in 이게 무슨 의미인지 모르겠습니다.
여기 항목 자체가 이해가 안갑니다.
검증문자:
사이트마다 고유의 난수를 발생하기위한 옵션이며, 공난이어도 됩니다.
화면출력지연 오차시간:
네트웍 문제등으로 행이 걸려 등록이 지연되고 있을 때 허용시간입니다.
출력될 메시지:
스팸 검출시 뜨는 기본 출력메시지 (Hey buddy, don't try to fool us!) 대신 출력될 메시지를 입력합니다.
다른곳으로 보낼주소:
회원가입시 스팸검출되면 다른곳으로 보낼 주소 입력난 입니다. (기본: 구글 스팸이미지 검색)
스트링 내용은 몰라도 되고,
테스트는 위 코드를 적용 했을 때, 스티커 댓글이 잘 등록되는지 확인되면 됩니다.
$ss_cp_in 에는 마우스 좌표값을 덧셈한 값이 들어있습니다.
감사합니다.
ksc
로직등을 공개하기 어려운 것이라면 이해할 수는 있는데 금칙어를 제외한 나머지 부분이 어떤 부작용이 생길지 판단도 잘 안되고 어떤 동작을 위해 무엇을 입력해야 하는지 하나도 모르겠습니다.
일단 테스트를 해보겠습니다. 잠시만요.
스티커 댓글 입력시에는 여전히 차단됩니다.
네, 그렇게 되는군요.
스티커 댓글이 어떤건지 한번 설치 해봐야 겠군요.
테스트 감사합니다.
ksc
그리고 추가로 발생된 문제가 있습니다.
정상적인 a 링크의 경우도 차단이 되네요.
퍼오다보면 소스 자체에 a 링크가 있을 수 있습니다.
<p><a data-tqimg="sent" href="이미지주소" target="_blank"><img alt="RdHsm" data-tqimg="sent" src="이미지주소" /></a></p>
위와 같은 소스에서 차단이 됩니다.
보이지 않는 a링크 였던가요. 그거 사용 안함으로 임시조치 했습니다.
계속 테스트 해주셔서 고맙습니다.
a태그는 에디터 영향을 받는 경향이 있는듯 해서 약간 혼란스러운 부분이 있습니다.
아래 주소는 제가 테스트 하는 곳인데,
문제있는 "a"태그 글을 올려주시면 검토에 많은 도움이 될것 같습니다.
그리고 스티커 모듈은 이리저리 고쳐가며 설치를 해보고 있는데...
묘하게도 콤멘트 밑에 그림이 안뜨느 군요.ㅜㅜ
http://planner123dot.dothome.co.kr/rhymix/board
감사합니다.
ksc
조금 이상하네요.
위 테스트 사이트 역시 stop_spambot이 설치가 되어 있는데 글이 등록이 되는것을 보면,
환경이 조금 다른건지도 모르겠군요.
같은소스를 소스 입력을 통해서 등록하는 경우와 비교 해보시기 바랍니다.
감사합니다.
ksc
방금 안되는거 확인하고 텍스트로 바꿔서 입력해 드린겁니다.
저희 사이트도 안됩니다.
라이믹스 2.0 이리시라면 고쳐야 할 부분이 조금 있을 겁니다. 저는 1.9라서...
아! 라이믹스 1.9와 2.0 차이인가요?
저는 2.0.1 부터 라이믹스를 사용해서 1.9는 어떻게 작동하는지 몰랐어요.
XE 경우 에디터에 따라 결과가 달랐던 것으로 기억 됩니다.
감사합니다.
ksc
그렇군요.
스티커 모듈이 이상하다 했는데 라이믹스 2.0에서 이상이 생기는 거군요.
자체 테스트가 안되서 애매한데... 혹시 스티커 그림을 클릭하면 자동 댓글이 생성 되는건가요?
a 태그 문제는 올려주신 예제를 보니 소스입력을 통해 이미지 출력을 의도하는 경우인데....
해결 방법을 조금 더 고민 해봐야 되겠습니다.
감사합니다.
ksc
웹지기님 안녕하세요,
a태그 관련하여 248번 라인을 아래 코드로 변경했으니 참고 바랍니다.
기존:
foreach ($links as $link)
{
if (!str_replace(' ', '', $link->nodeValue)){
$ind_empty_tag = 'Y';
$notice_msg .= '내용없는 "a" 태그 검출됨, ('.$link->getAttribute('href').' '.$link->getAttribute('title').'), ';
break;
}
}
변경:
foreach ($links as $link)
{
$img_node = $link->getElementsByTagName('img');
str_replace(' ', '', $link->nodeValue);
if (!$link->nodeValue && !count($img_node))
{
$ind_empty_tag = 'Y';
$notice_msg .= '내용없는 "a" 태그 검출됨, ('.$link->getAttribute('href').' '.$link->getAttribute('title').'), ';
break;
}
}
감사합니다.
ksc