Extra Form
PHP PHP 7.2
CMS Rhymix 2.0

현재 문제가 되고 있는 소스는 아래와 같습니다.

 

<div style="width:1px;height:1px;overflow:hidden;"> 
<a href="https://abc.com" target="_blank" rel="noreferrer noopener">
 </a>
<a href="https://abc.com" target="_blank" rel="noreferrer noopener">
 </a>
<a href="https://abc.com" target="_blank" rel="noreferrer noopener">
 </a>

<div>

 

a 태그는 굉장히 많아서 일부만 작성했습니다.

 

 

1. width:1px;height:1px;overflow:hidden; 해당 소스는 애드온의 금칙어에 걸려서 글 등록이 차단되도록 되어있습니다.

 - 실제 관리자인 제가 해당글을 수정하거나 해당 소스를 포함해서 새롭게 글을 작성하면 차단 되면서 운영자에게 쪽지가 잘 옵니다.

 - 그런데 스패머가 작성할때 통과가 되는 이유를 모르겠습니다.

 

2. a 태그가 빈태그라 실제 에디터에서 수정을 해 보면 

 

<div style="width:1px;height:1px;overflow:hidden;">&nbsp;</div>

 

이런식으로만 보입니다. 아마 라이믹스 코어에서 빈태그는 보여주지 않거나 하는 것 같습니다. CK에디터에서 처리하는지는 잘 모르겠습니다.

 

이 경우 관리자가 굉장히 많은 a 태그가 있다는 것 조차 인지하지 못하고 문제로 인식하지 못할 가능성이 매우 높습니다.

 

 

다시 돌아와서 

 

procBoardInsertDocument before 시점에서 분명 저 금칙어 체크가 되도록 되어 있고 

금칙어가 검출되면 글 작성 자체가 금지 되도록 되어 있는 것이 통과과 되는 이유가 궁금합니다.

 - 제가 일반적인 글쓰기 방법으로 테스트 시 에는 절대 글 작성이 되지 않습니다.

 

정상적인 글쓰기 버튼을 이용하지 않고 작성했다고 생각하기 어려운데 뭔가 다른 방법으로 글 쓰기를 할 수 있는 부분이 있는지 있다며 그런 경우도 허용하지 않으려면 라이믹스 코어에서 제공하는 것 외 별도 방안을 마련해야 하는지 알고 싶습니다.

 

 

*누군가 가입해서 유머글 열심히 써준다고 고맙게 생각하다가 해당 회원이 작성한 글 소스를 db에서 보시면 놀랄 수 있습니다. CK에디터에서는 <div style="width:1px;height:1px;overflow:hidden;">&nbsp;</div> 만 보이지만 db 또는 개발자도구에서 컨텐츠 영역쪽의 소스를 보면 엄청난 수량의 a 태그가 있는게 보입니다.

  • profile
    실제로 글입력시 필터링의 의해 최종수정본이 <div style="width:1px;height:1px;overflow:hidden;"> 이렇게 되는게 아닌가 검사해보셔야할 것 같아요.

    실제로 post 요청으로 access_log 한 값들을 분석해보셔서.. 실제로 스팸이 등록될때 해당 스팸이 등록한 글을 debug나 일부 다른곳에 남겨서 어떤내용으로 썼는지 보시는게 맞을 것 같아요.

    게시글 볼때 <div style="width:1px;height:1px;overflow:hidden;"> 으로 나타나더라도 실제로 필터링의 의해서 마지막으로 수정된 값일 수 있거든요.

    실제로 스패머가 등록할때 어떤내용으로 등록하는지 확인하시는게 먼저가 아닐까 생각이 드네요..

    만약 같은 내용으로 등록했다면 애드온의 처리방식을 다시 확인해보아야 하지 않을까 싶어요.
  • profile profile

    어떠한 방식으로 글을 작성했는지는 알 수 없지만
    <div style="width:1px;height:1px;overflow:hidden;"> 이런 소스가 db에 들어가는 상황에서 이게 막히지 않는게 이상해서 질문을 작성했습니다.

    어떠한 방법으로 라이믹스의 스팸필터 등의 php 필터링을 우회할 수 있는지 있다면 이걸 막을 대책이 필요한 것 같습니다.(스팸필터 모듈의 경우 태그는 제외하고 검사를 해서 애드온에 태그까지 검사하도록 추가했습니다.)

  • profile

    그리고 저희는 a태그의 경우 애드온에서 제거후 글이 등록이 되게 되어있는데 a태그가 살아남는거로 봐서는 금칙어필터링, a태그 제거 과정이 모두 거쳐지지 않는 글 쓰기 방식이 있는 것 같습니다.

    위 위 필터링 과정을 모두 거치는 글쓰기 방식이라면
    실제 작성된 내용과 전혀 다른 내용을 제시하여 필터링을 우회하도록 하는 방법이 있는건지 의심스럽습니다.

    결과적으로 저장된 글에는 a태그가 살아있고 금칙어들이 고스란히 남아있으니 말입니다.
    금칙어 사이에 빈문자를 넣은것은 아니란 것은 확인했습니다..

    a태그가 제거되지 않았다는게 굉장히 의심스럽습니다.

  • profile

    마케팅 업체에서 뭔가 트릭을 쓰는거 같은데 어떤 방법을 쓰는건지 알게되고 그리고 해결책이 나오기 전까지 우선 글,댓글 입력 직후 실제 db 입력된 내용을 불러와서 체크 후 금칙어 포함 작성된 게시글 정보를 관리자에게 쪽지를 보내도록 구현을 해서 우선 사후 조치를 할 수 있도록 해서 관리를 해야 겠습니다.

     

    일단 사후 감시용으로 (procBoardInsertDocument || procBoardInsertComment) && $called_position == "after_module_proc" 시점에서 방금 입력된 컨텐츠에 금칙어가 포함되어서 작성된 것인지 컨텐츠를 직접 가져와서 확인 한 후 검출이 된 글,댓글이면 관리자에게 신고하도록 했습니다.(우회의 방법이 계속 갱신될 수 있으니 사후 관리는 지속적으로 유지해야겠네요.)

     

    XE는 style 태그가 제거가 되니 라이믹스 사이트 들이 타겟인거 같습니다.

  • profile

    윗분 추측처럼 작성자가 처음에 입력한 내용은 <div style="width:1px;height:1px;overflow:hidden;"> 이 아닐 수도 있습니다. 중간에 무의미한 공백이 들어가거나 유효하지 않은 속성이 섞여 있었는데 라이믹스에서 태그를 필터링하는 과정에서 몇 가지가 날아가는 바람에 최종적으로 저렇게 남았을 뿐...

     

    만약 그렇다면 원래 내용이 무엇이었는지 찾아내거나, 태그 필터링 후의 내용을 확인해서 이미 등록된 게시물이라도 삭제하는 방식으로 애드온을 수정해야겠지요.

  • profile profile

    width:1px;
    height:1px
    overflow:hidden;

    위 세가지 패턴으로 테스트 해보았는데
    필터링되어 저렇게 바뀌는 케이스를 찾지 못했습니다.

    무엇을 넣어야 날아가서 저렇게 될지 테스트를 해도 결과가 나오지 않아 못찾았구요.

    overflow: hidden;
    이런식으로 공백 하나를 넣은 경우는 그냥 공백이 필터링되지 않고 그대고 작성이 됩니다.
    공백이 필터링이 된게 아니란 것이구요.

    &ZeroWidthSpace;
    &#8203;
    위 두가지도 마찬가지로 필터링 되지 않고 의도한 대로 표시나지 않게 숨길 수 있습니다.
    두가지도 금칙어로 넣으면 못하게 되는거죠. 그런데 지금 처럼 금칙어로 등록한 것을 회피할 수 있게 무언가 넣는 방식이 이것도 아닙니다.

    결국 찾지 못했고 어떤 꼼수인지 찾기 전까지는 해결할 수 없어서
    말씀 하신 실제 db에 입력된 내용을 확인 후 관리자에게 알림이 가도록 해서 해당 컨텐츠 작성자를 조치하는 것으로 일단 대응해 나가기로 했습니다.

    제가 이리저리 테스트 해 본 바로는 뭔가 끼워넣거나 해서 그걸 라이믹스가 날려버러셔 결과적으로 db에 들어갈때는 원하는 값이 들어가게 한 것이 아닌 것 같다는 생각입니다.(단순 추측)
    뭔가 다른 트릭이나 라이믹스의 헛점이 있지 않을까 하는 가능성도 생각해 보고 있습니다.

  • profile profile
    그리고 a태그 자체가 100개가 들어있어도 날아가야 하는데 다 살아남았다는 점이 굉장히 이상합니다. 넘겨받은 content가 뭔가 조작되지 않고서는 나오기 힘든 결과라서 지금 어리둥절한 상황입니다.
    예전에 도움받은 정규식으로 a 태그는 날리고 있는 상황이라.....
  • profile profile
    혹시 글을 처음 작성할 때는 체크하는데 수정할 때는 체크하지 않는 것은 아닐까요? 작성 후 수정할 때 필터링이 누락되는 점을 이용하는 보안취약점도 얼마 전에 알려진 터라...
  • profile profile

    아니요. 글 수정시 동일하게 체크합니다. 문제가 되는 게시글 제가 수정을 하면 차단된 메시지가 발생합니다. 작성자가 어떻게 작성했는지 미스테리가 발생되는 지점이라는거죠.

    그 소스 그대로 제가 새글로 작성해도 차단되구요. a태그만 작성해도 a 태그는 모두 날아가는게 맞구요.

     

    이게 라이믹스에서 통하는걸 아는 업체들이 어떤 방법으로 라이믹스 사이트들에 지금 백링크를 심고 다니는 상황으로 보입니다. 제가 운영하는 곳들에서 종종 발견되니까요.(금칙어로 설정하고 막히는 줄 알고 있었지만 아니었다는....)

  • profile profile

    웹지기님이 지금 보고 계신 소스는 당초에 작성자가 제출한 소스가 아닐 수도 있다는 말씀을 계속 드리는 겁니다. 한 번 필터링된 결과이고, 수정을 시도하는 순간 에디터에서 또다시 태그 구조 조정이 이루어지니까요. 필터링 시스템을 역이용하여 원하는 결과를 만들어내는 것은 무척 오래된 트릭입니다. 원래 어떤 내용이었길래 애드온에서 걸러지지 않았는지, 지금 남은 결과만 갖고는 알 수가 없습니다.

    물론 예전에 쓰던 blogapi 애드온이라든지, 그 밖에 취약점이 있는 서드파티 자료를 이용하여 애드온이 작동하는 조건(예: act=procBoardInsertDocument)을 우회하여 글을 작성하고 있을 가능성도 있습니다. act 조건이 아니라 트리거를 활용하는 애드온이라면 이런 가능성까지 좀더 완벽하게 대응할 수 있겠지요.

  • profile profile

    네. 어떤 의미인지는 이해하고 있습니다.
    처음 글 작성시는 필터링이 되니까 필터링이 안되는 내용으로 작성하고
    글 수정시에 필터링이 안되는 것을 이용해서 이시점에 금칙어를 넣는거 아니냐고 질문하신거로 이해해서 답변을 드린 것이구요.

    글 수정시에도 필터링 작업은 동일하게 작동되고 있습니다. 그 점을 답변드린 것이구요.

    새글,수정 두 케이스 모두 스패머가 어떤 식으로 회피하는 건지 지금 알 수 없는 상황이 진행상황입니다.

    예전에 처음 발견했을때 약간 이상했던 점은
    글 작성이 완료된 것이 푸시앱에서 새글로 인식을 못했던 것으로 확인했던 기억이 있습니다. 그래서 뭔가 노멀한 글 작성이 아니라는 점까지만 추측을 했던 것이죠.(푸시가 발생 안합니다.)

    procBoardInsertDocument after 이후 작동하는 트위터 전송은 또 제대로 연동되는 것으로 확인되고 있구요.

     

    작성자가 작성한 소스가 아닌 다른 것을 Context::get, $content 에 제시하는게 아닌가 하는 의심도 들어요.

    db에 입력되는 내용은 금칙어가 들어간게 들어가게 하고.....

  • profile profile

    종합적으로 더 검토를 해보니 특정한 프로그램으로 글쓰기를 한 것이 거의 확실시 되네요.

    최근 연달아 글을 작성했는데 글 작성 시간을 분석해 보니 대략 20,30초의 interval로 설정한 것 같습니다.
    사람이 직접 수작업으로 작성하기에는 너무 부족한 시간이네요.

    그리고 이미 말씀 드렸듯이 다른 모듈의 document insert 시점의 트리거도 동작하지 않은걸 발견한 점.

    스팸필터 과정을 무력화 하는 트릭이 있는건지
    아니면 아예 해당 과정에 진입하지도 않는건지 이부분은 확인이 필요하겠지만 현재로서는 사람이 직접 정상적인 절차로 직접 글을 작성하는 경우는 문제가 되지 않지만 특별한 방법으로 작성할 경우 문제가 될 것이라는 것으로 기울었습니다.

    이제 트릭이던 어떤 방법으로던 백링크 작성을 하게 되어도 관리자인 제가 쪽지로 알 수 있기 때문에 조치하면서 방법을 좀더 연구해봐야겠습니다.

  • profile profile
    blogapi 애드온은 라이믹스에서 아예 존재하지 않으니 이건 아닌거 같고 다른 뭔가를 사용해서 act=procBoardInsertDocument 를 우회해서 글을 작성할 수 있는지 있다면 난감한 상황일 것 같습니다. 우선 이부분은 배제하고...

    라이믹스에서 필터링시스템을 분석해서 미리 필터링될만한 것을 끼워넣어서 애드온에서 검사시 우회할 수 있게 하고 있다고 가정한다면

    https://github.com/rhymix/rhymix/blob/master/modules/document/document.controller.php#L623

    $obj->content = removeHackTag($obj->content)

    여기서 소스의 차이가 발생하게 될 것으로 보여집니다.

    혹시 애드온에서도 체크할 소스의 대상을 removeHackTag('컨텐츠소스') 이렇게 한다면 필터링시스템을 악용하는 것을 차단할 수 있을까요??
  • profile

    "글이 새로 작성된다 -> 글이 작성되면 이메일이 오도록 해놨지만 이메일이 오지 않는다 -> 그런데 procBoardInsertDocument after 애드온은 동작한다."

    여기에 힌트가 있을 것 같습니다. 즉, DB에 글이 들어간 이후에 에러가 발생하면 이런 경우가 발생할 여지가 있지 않을까 추측해봅니다. 예를들면, insertDocument() 에서 executeQuery('document.insertDocument', $obj); 까지는 성공적으로 되는데, 그 이후에 에러가 발생하는 것이죠.

     

    글이 DB에 성공적으로 넣어진 이후에 확장변수 처리과정이나 트리거 처리하면서나, 또는 첨부파일 처리하면서 에러가 발생했을때, $oDB->rollback(); 으로 되돌리기는 하지만, 글이 DB에 들어간 것까지 rollback이 되는지를 점검해볼 필요는 있을 것 같습니다. (물론, 그렇더라도 애시당초 안들어가야 할 글이 DB에 넣어진 것까지는 설명이 안되기는 하겠네요. 이건 다른 이유가 있을수도).

  • profile profile
    아... 정상적인 절차에 따른 사람이 작성한 글에서 트리거가 작동이 안되거나 뭔가 작동이 안되거나 하지 않아요.

    지금 스팸글을 작성하는 툴이 뭔지 알 수 없는데 이런 툴을 써서 글을 작성하면서 뭔가 트릭을 써서 발생되는 문제로 보입니다.

    푸시앱을 운영할 당시 모든 글은 글 작성시 트리거에 의해 푸시가 누락없이 잘 발송이 되어 새글 소식을 바로 알수 있었는데 스팸글의 경우 푸시앱이 이를 감지 못했다는 사례를 말씀 드린 것이에요.

    스패머가 어떤 툴을 써서 글을 작성할때 첨부나 기타 다른 모든 부분에 에러는 없습니다.

    다만 교묘하게 백링크를 넣기 위해 뭔가 트릭을 쓰는 것 같은 가능성이 매우 높아보이는 상황입니다.
    RXE를 굉장이 잘 아는 사람이 백링크작성을 위해 프로그램을 구입한 분들에게 프로그램을 팔기 위해 컨텐츠 내용을 필터링 하는 시점을 회피하거나 뭔가 트릭을 쓰는 것 같습니다.
  • profile

    사람이 작성한 글은 정상적으로 푸시 노티스가 오는데, 스패머가 작성한 글은 푸시 노티스가 안왔었던 이유가, 스패머가 확장변수나 첨부파일에 이상한 것을 넣으면 그럴 여지가 있지 않을까 추측해 본 것입니다. 즉, 스패머는 본문에 이상한 것을 넣는 것 뿐만 아니라 확장변수나 첨부파일에도 이상한 것을 넣은 것이죠 (물론 다 추측뿐입니다)...

  • profile profile

    네. 게시글이 insert 가 되면 당연히 푸시앱 모듈에서 푸시발송이 되어야 마땅한데 안되는 부분이 정상적인 게시글 작성이 아니라는 것을 의미하기도 하구요. 결과가 의도된 것인지 아니면 프로그램을 짜면서 뭔가 실수가 있었던 것인지 그건 프로그램을 저희가 알지 못하니 말씀 하신 추측의 영역일 것 같습니다.

    제가 어떠한 프로그램 하나를 발견했는데 그 프로그램 소개를 보면 백링크를 여러 사이트에 숨겨서 작성하려는 분들이 구입하거나 혹은 그런 업체에서 구입하게 될 것 같았습니다. 이렇다면 왠만한 금칙어를 컨텐츠 내의 소스에서 검출해서 글 작성 차단을 하는 것을 회피하려는 노력은 했을 거라는 추측을 하게 되었구요.

    실제로 저희 사이트에서 금칙어 검출에 따른 insert 중지, a태그는 제거 이 두가지를 뚫고 글이 작성이 된다는 것은 회피하는 방법을 썼다고 볼 수 있을 것 같아서요. 프로그램 판매자야 걸리지 않게 백링크가 잘 작성이 되어야 팔릴테니까요.......

    물론 스팸글이 작성되었을때 보여지는 결과 몇가지를 근거로 추론하는 것에 불과하지요.