질문/조언질답게시판
Extra Form
PHP PHP 7.2
CMS Rhymix 1.x

기존 사용하는 애드온에서 이미 작성된 코드를 사용했는데 그냥 글 작성이 되어 버리는 것 같습니다.

 

금칙어가 확인되면 별도 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번 질문에서 우회할 수 있다면 두번째 변경한 코드는 우회하지 못하나요?

  • profile
    바꾼 코드도 뚫리네요.. 헐....

    before_module_proc, procBoardInsertDocument 에서 금칙어 확인되면

    $this->act = 'true';
    $this->stop($message);

    이렇게 처리되는데 이게 뚫리네요.

    제가 직접 브라우저에서 글쓰기로 진입해서 해보면 차단되는 알림창 뜨고 더 진행이 안되는데....
  • profile

    1번 코드 밑에 exit(); 을 넣어보시겠어요?

    2번 코드에서는 return false; 를...

  • profile profile

    1그부분은 생략되어 있고 코드는 들어가 있습니다.

    2번 코드에 넣어볼게요.

  • profile profile
    이상한 점은 access 로그를 보면
    dispBoardWrite 액션을 계속 하고 있는데 그에 비해서 실제 글 등록되는건 매우 적긴 합니다.

    그런데 이렇게 작성되는 글은 푸시앱 모듈에서 새글로 인식을 안하고 있네요.
  • profile
    지금보니 코드가 아예 작동을 안하는게 아니라, 특정 상황에서만 작동이 되지 않는거네요.
    금칙어를 사용한 게시글이 스팸게시글인 경우라면, 뭔가 다른 우회방법이 있는게 아닐까 싶습니다.

    u200b 와 같이 보이지 않는 문자열을 집어넣어 금칙어 필터링에서 빠져나온다던가,
    또는 다른 모듈의 취약점을 통해 DB에 직접 게시글을 집어넣는다던가...
  • profile profile
    access 로그를 보면
    dispBoardWrite 액션을 통해 글 작성이 된거 같아 db에 직접 넣은거라는 것은 일단 배제한 상황(잠시 보류) 입니다.

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

    이런 고정된 소스를 넣고 있어서...

    width:1px,width:0px,overflow:hidden 을 검출하고 있어서 다른 걸 넣은거로는 보이지 않았는데 글이 새로 등록되면 다시 한번 더 자세하게 봐보겠습니다. 그런데 소스 자체는 계속 똑같은거 같아요.
  • profile profile

    네, 다시 확인하실 때 게시글 수정 > 에디터의 소스보기 방식으로 보지 마시고...
    크롬(이나 파폭) 등에서 우클릭 > 검사(요소검사) 를 통해서 한번 확인해 보세요.

    '이 문장에는 숨겨진 요소가 있​습니다. 있과 습 사이예요.'
    에디터의 소스보기로도 확인하기 어렵습니다.

     

    스크린샷 2021-01-22 오후 11.24.33.png

     

    스크린샷 2021-01-22 오후 11.24.20.png

  • profile profile
    네. 근데 지금 검출하는 곳 자체가 텍스트 영역이 아닌 태그 부분이라 애매하긴 합니다. 글이 다시 등록되면 db에서도 확인해 볼 생각입니다. 그런데 거기는 문제가 없을 것 같은 생각이에요.

    아 그리고 db에 직접 밀어넣는건 아닌게 확인이 된게 저희가 procBoardInsertDocument 에서 트위터로 전송되는 자료를 사용하는데 이 문제의 글도 트위터로 전송되는거 확인되서 db에 직접 넣는건 아니라는 것이 확인 되었습니다.

    검출을 피해가는건지 insert를 중지 시키는 것을 무력화 하는 건지 알아내야겠습니다.
  • profile

    웹지기 님 안녕하세요,

    봇이라면 아마도 전단계에서 걸러 지겠지만
    사람이 직접 스팸글을 쓴다는 가정하에 CSS 검토 부분을 좀 보강 하였으니,
    잘 작동 되는지 한번 시험 해주셨으면 합니다. (http://crypto216.iwinv.net/xe/download)

    감사합니다.
    ksc

  • profile profile
    사람이 직접 쓰는건 맞는데 좀 특이한건 정상적인 방법은 아닌거 같아 테스트가 어렵습니다. 그 계정이 글 작성하면 푸시앱 모듈에서 새글 알림 발생하는 과정도 건너띠는 상황이었습니다. 해당 계정은 차단해서 더이상 테스트 환경이 되질 않네요.
  • profile profile
    네, 그렇군요. 테스트가 안 되겠네요
    댓글 감사합니다.
    ksc
  • profile profile

    테스트 삼아 애드온을 설치하고 오늘 사용해 보고 있는데 글 수정을 했더니 메시지가 뜨고 등록이 안되어 뒤로가기 해서 나왔는데요. 관리자한테 변수불일치 라고해서 쪽지가 왔는데 이건 왜 그런건가요? 이런 문제가 생길까 해서 애드온 사용을 못하고 있었는데요.

     

    검토를 해보니 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 )) )

     

    일단 위와 같이 처리했습니다.

  • profile

    웹지기 님 안녕하세요,

     

    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

  • profile profile

    스티커 모듈이라고 공개모듈이 있습니다.
    댓글창에 스티커 목록이 노출되며 스티커를 클릭과 거의 동시에 댓글이 스트커를 특정할수 있는 스트링으로 댓글이 입력되니다. 초스피드라 저 시간으로 컨트롤이 안됩니다.

    개인적으로는 500으로 시간을 줄이고
    스티커모듈의 스티커 댓글로 입력되는 스트링을 조건으로 걸어 회피했습니다.

    스티커모듈에 입력되는 스트링은 공개글로 작성하기 어렵네요. 스패머들이 이용할 수 있어서요.


    && !$ss_cp_in 이게 무슨 의미인지 모르겠습니다.

     

     

    spam.png

     

    여기 항목 자체가 이해가 안갑니다.

  • profile profile

    검증문자:  
    사이트마다 고유의 난수를 발생하기위한 옵션이며,  공난이어도 됩니다.  


    화면출력지연 오차시간: 
    네트웍 문제등으로 행이 걸려 등록이 지연되고 있을 때 허용시간입니다.


    출력될 메시지: 
    스팸 검출시 뜨는 기본 출력메시지 (Hey buddy, don't try to fool us!) 대신 출력될 메시지를 입력합니다.


    다른곳으로 보낼주소:
    회원가입시 스팸검출되면 다른곳으로 보낼 주소 입력난 입니다. (기본: 구글 스팸이미지 검색)

  • profile
    웹지기 님 안녕하세요,

    스트링 내용은 몰라도 되고,
    테스트는 위 코드를 적용 했을 때, 스티커 댓글이 잘 등록되는지 확인되면 됩니다.

    $ss_cp_in 에는 마우스 좌표값을 덧셈한 값이 들어있습니다.

    감사합니다.
    ksc
  • profile profile
    마우스 좌표값 이런게 왜 필요한지에 대한 설명이 애드온 설정이나 다운로드 페이지에 좀 있었으면 좋겠습니다.
    로직등을 공개하기 어려운 것이라면 이해할 수는 있는데 금칙어를 제외한 나머지 부분이 어떤 부작용이 생길지 판단도 잘 안되고 어떤 동작을 위해 무엇을 입력해야 하는지 하나도 모르겠습니다.

    일단 테스트를 해보겠습니다. 잠시만요.
  • profile profile
    수정 누르고 등록 빠르게 눌렀을때 차단되는 문제는 해결되었습니다.
    스티커 댓글 입력시에는 여전히 차단됩니다.
  • profile profile
    웹지기 님 안녕하세요,

    네, 그렇게 되는군요.
    스티커 댓글이 어떤건지 한번 설치 해봐야 겠군요.

    테스트 감사합니다.
    ksc
  • profile profile
    https://xetown.com/tips/448113
  • profile profile

    그리고 추가로 발생된 문제가 있습니다.

    정상적인 a 링크의 경우도 차단이 되네요.
    퍼오다보면 소스 자체에 a 링크가 있을 수 있습니다.

    <p><a data-tqimg="sent" href="이미지주소" target="_blank"><img alt="RdHsm" data-tqimg="sent" src="이미지주소" /></a></p>

    위와 같은 소스에서 차단이 됩니다.

     

    보이지 않는 a링크 였던가요. 그거 사용 안함으로 임시조치 했습니다.

  • profile
    웹지기님 안녕하세요,

    계속 테스트 해주셔서 고맙습니다.

    a태그는 에디터 영향을 받는 경향이 있는듯 해서 약간 혼란스러운 부분이 있습니다.
    아래 주소는 제가 테스트 하는 곳인데,
    문제있는 "a"태그 글을 올려주시면 검토에 많은 도움이 될것 같습니다.

    그리고 스티커 모듈은 이리저리 고쳐가며 설치를 해보고 있는데...
    묘하게도 콤멘트 밑에 그림이 안뜨느 군요.ㅜㅜ

    http://planner123dot.dothome.co.kr/rhymix/board

    감사합니다.
    ksc
  • profile profile
    텍스트로 올려드렸습니다. 별다른 링크가 아니고 이미지에 링크가 걸린 형태의 기본적인 링크입니다.
  • profile profile

    라이믹스 2.0 이리시라면 고쳐야 할 부분이 조금 있을 겁니다. 저는 1.9라서...

  • profile profile
    웹지기님 안녕하세요,

    조금 이상하네요.
    위 테스트 사이트 역시 stop_spambot이 설치가 되어 있는데 글이 등록이 되는것을 보면,
    환경이 조금 다른건지도 모르겠군요.

    같은소스를 소스 입력을 통해서 등록하는 경우와 비교 해보시기 바랍니다.

    감사합니다.
    ksc
  • profile profile

    방금 안되는거 확인하고 텍스트로 바꿔서 입력해 드린겁니다.

    저희 사이트도 안됩니다.

  • profile profile

    스크린샷(115).png.jpg

  • profile
    웹지기님 안녕하세요,

    아! 라이믹스 1.9와 2.0 차이인가요?
    저는 2.0.1 부터 라이믹스를 사용해서 1.9는 어떻게 작동하는지 몰랐어요.
    XE 경우 에디터에 따라 결과가 달랐던 것으로 기억 됩니다.

    감사합니다.
    ksc
  • profile profile
    어떤거 말씀이죠? 스티커 모듈이면 라이믹스 2.0에서 스티커 관련 이상 증상이 발생합니다.
  • profile
    웹지기님 안녕하세요,

    그렇군요.
    스티커 모듈이 이상하다 했는데 라이믹스 2.0에서 이상이 생기는 거군요.
    자체 테스트가 안되서 애매한데... 혹시 스티커 그림을 클릭하면 자동 댓글이 생성 되는건가요?

    a 태그 문제는 올려주신 예제를 보니 소스입력을 통해 이미지 출력을 의도하는 경우인데....
    해결 방법을 조금 더 고민 해봐야 되겠습니다.

    감사합니다.
    ksc
  • profile profile
    저런 이미지에 태그를 거는 소스는 너무 일반적인 형태입니다. 웹에서 막거나 하면 안되는 작성 방법이죠. 텍스트 대신 이미지에 걸린겁니다. 링크가...
  • profile

    웹지기님 안녕하세요,

     

    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