• 목록
  • 아래로
  • 위로

안녕하세요??

 

주말 잘 보내고 계시는가요??

 

http://amina.co.kr/bbs/board.php?bo_table=nariya_qa&wr_id=971

후..요즘 매크로 스팸글 때문에 골치입니다. 포인트가 없어도 글을 씁니다..포인트 설정된 게시판인데도그냥...

 

이 글을 보면 그누보드 환경에서 글쓰기 포인트 차감 설정을 했음에도 불구하고

 

이걸 우회하여 도배하는 스팸이 문제되고 있다고 하던데요 ㅎㄷㄷ

 

파이썬 requests를 이용한 스팸봇이라면 write_update.php에 formdata를 그대로 대입하는 방식이기 때문에

 

포인트가 부족하다면 포인트 차감이 설정된 것을 우회하지는 못할 것으로 생각되네요~

 

(1) 도대체 어떤 방법으로 이러한 스팸이 가능한 것이고, (2) 어떻게 하면 이를 근본적으로 차단할 수 있는지 여쭤봅니다.

 

그럼 즐거운 주말 되세요 ^-^

 

감사합니다!

 

작성자
이니스프리 119 Lv. (1%) 2586490/115200000EXP

Make StudyForUs Great Again!

 

CSVpuymXAAAVVpd.jpg

댓글 22

갱생협스
profile image
아미나 댓글에서도 나왔지만, 그누보드 포인트 포인트 차감 설정이 완벽하게 됐다는 가정 하에 DB에 강제로 밀어넣는 방식(SQL Injection)으로 게시글이 작성되었다고 추측합니다.
이를 막기 위해선 근본적으로 SQL 인젝션을 방어하는 방향으로 코드를 수정해야 할 테고, 당장은 올라오는 족족 IP 밴을 먹여야 할 것 같습니다.

가장 좋은 것은 커뮤니티를 없애는 것ㅇ..(도망)
comment menu
2020.05.31. 01:28

신고

"갱생협스님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → 갱생협스
profile image

적어도 현재의 아미나에서는 SQL 인젝션이 가능하지 않도록 취약점 패치가 충분히 되어있다고 알고 있는데요 ㄷㄷ
만약 아미나에서 저런 공격이 가능하다면... 아미나 기반의 수많은 사이트에서 저런 문제가 발생해야 될텐데 저런 유형의 공격을 최근에 본 사례가 없거든요~!
업그레이드를 하지 않아서 발생하는 문제인지, 커스텀의 문제인지, 아니면 새로운 취약점이 발견된 것인지 잘 모르겠네요 ㅠㅠ

comment menu
2020.05.31. 09:22

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

갱생협스 → 이니스프리
profile image
그누보드는 써 본 적이 없어서요(도망)
취약점이야 어디에나 존재할 수 있으니 최신 패치여도 가능할 지도 모르고요. 네모네모네모님이 네이버 XSS 취약점을 찾아낸 것처럼 어딘가엔 있을 지도 모르는 일이죠 ~!
하지만 구버전을 사용중이라는 이론이 더 그럴듯 해 보이기는 하네요.

아마 새로운 취약점이 발견되었다면 (그누보드던 WP던)난리가 났을 터이니 구버전을 쓰던 중 커스텀된 부분과 뭔가 충돌이 일어나 SQL Injection이 가능하지 않았을까 추측해봅니다.
comment menu
2020.05.31. 12:02

신고

"갱생협스님의 댓글"

이 댓글을 신고 하시겠습니까?

NoYeah
profile image
그누보드에 심각한 보안 이슈가 될것 같은데 그누보드 개발팀에 직접 건의를 하면 업데이트를 할 것 같습니다.
comment menu
2020.05.31. 08:36

신고

"NoYeah님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → NoYeah
profile image

옙 그렇게 해야겠네요! ^^
감사합니다!!

그런데 아미나는 그누보드 5.3 기반이고 현재 그누보드 최신 버전은 5.4인데
단순히 구 버전이어서 생긴 문제라면 업데이트가 안 되겠죠?? ㅠㅠ

 

+) 나리야에서 발생한 문제라면 그누보드의 심각한 취약점이 발견된 것이겠네요 ㅎㄷㄷ

comment menu
2020.05.31. 09:18

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

NoYeah → 이니스프리
profile image
네. 보안 취약점같습니다.
DB에 다이렉트로 인젝션이 가능한거면 매우 위함해보이네요.
comment menu
2020.05.31. 09:59

신고

"NoYeah님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → NoYeah
profile image

존재하지 않는 스티커입니다.

comment menu
2020.05.31. 10:07

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → NoYeah
profile image
그렇다면 굉장히 심각한 문제인데... 최근에 5.3의 보안패치가 올라오지 않아서 불안하네요 ㅠㅠ
comment menu
2020.05.31. 10:08

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

NoYeah → 이니스프리
profile image
이슈제기가 되면 금방 해결해주지 않을까 합니다.
comment menu
2020.05.31. 10:19

신고

"NoYeah님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit
profile image

포인트가 음수로 되었다는 것을 보았을 때 SQL Injection 공격이라고 보긴 어려울 거 같아요. 만약 SQL Injection 공격으로 시도했다면 포인트 차감은 1번만 이루어지지만 무수히 많은 게시글이 작성되어야 합니다.

 

그래서 저는 SQL Injection 공격이라고 보기 보다는 서버 성능이 좋지 않아서 생기는 문제와 SQL 쿼리 설계 상의 문제가 합쳐져서 발생하는 문제라고 생각합니다.

comment menu
2020.05.31. 15:47

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

NoYeah → humit
profile image
역시 전문가의 답변!
DB 취약점이라기보단 서로의 문제가 겹쳐져서 생간일인거군요.
comment menu
2020.05.31. 21:46

신고

"NoYeah님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit
profile image

1. 아래의 SQL query를 실행하여 포인트와 게시글 테이블을 만들고 계정을 등록합니다.

 

CREATE TABLE doc (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`title` VARCHAR(60),
`description` VARCHAR(255)
);

CREATE TABLE point (
`user_id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`point` INT(11)
);

INSERT INTO point VALUES(1, 10);

 

2. 아래와 같이 PHP 코드를 작성합니다.

 

<?php

$db = array();

$db['hostname'] = 'localhost';

$db['username'] = '*****';

$db['password'] = '*****';

$db['database'] = '*****';

 

$write_point = 10;

 

$mysqli = new mysqli($db['hostname'], $db['username'], $db['password'], $db['database']);

 

$res = $mysqli->query("SELECT `point` from `point` WHERE `user_id` = 1;");

$point = intval(mysqli_fetch_row($res)[0]);

// check if point is larger than write_point

if($point < $write_point) {

    echo "Point is not enough!";

} else {

    // write post

    $query = "INSERT INTO `doc` VALUES(NULL, 'title', 'description')";

    $mysqli->query($query);

    // assuming write post takes too long...

    sleep(5);

    // decreasing point

    $query = "UPDATE `point` SET `point` = `point` - $write_point WHERE `user_id` = 1;";

    $mysqli->query($query);

 

    $res = $mysqli->query("SELECT `point` from `point` WHERE `user_id` = 1;");

    $point = intval(mysqli_fetch_row($res)[0]);

    echo "Write success! current point: " . $point;

}

 

3. 아래 python 코드를 실행합니다.

import threading
import requests

url = 'PHP 스크립트의 URL'

class TestThread(threading.Thread):
    def __init__(self, url):
        super().__init__()
        self.url = url
    def run(self):
        res = requests.get(self.url)
        print(res.text)


for i in range(5):
    t = TestThread(url)
    t.start()

comment menu
2020.05.31. 15:58

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → humit
profile image
원래라면 포인트가 10이므로 게시글이 1개만 써지고 나머지 4개의 경우에 대해서는 포인트가 부족하다는 메시지가 나와야 합니다. 하지만 해당 코드를 실행해보시면 게시글이 5개가 작성되고 포인트가 음수가 되는 것을 볼 수 있습니다.

여기서는 성능이 좋지 않아 글쓰기가 오래 걸린다는 가정을 표현하기 위해서 중간에 sleep(5)를 추가했습니다.
comment menu
2020.05.31. 16:04

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image

오오~ 바쁘신데 상세히 설명해주셔서 정말 감사합니다!!
humit 님께서도 주말 잘 보내고 계시죠??

성능이 좋지 않은 서버를 상대로 멀티스레딩으로 게시글을 작성하는 POST 요청을 하면
미처 포인트를 차감하기 전에 여러 개의 글이 작성될 수 있군요 ㅎㄷㄷ
전혀 생각을 하지 못했던 부분이 심각한 문제를 초래할 수 있네요~!
그렇다면 더 높은 사양의 서버를 구입해서 내부적으로 글 작성에 소요되는 시간을 줄이는 것 이외에는 대책이 없는 것인가요??
아니면 글이 작성되기 전에 미리 포인트를 차감해야 되는 것인가요?? ㅠㅠ

제가 SQL에 대해서는 아주 기초적인 내용밖에 몰라서 올려주신 SQL문 자체에는 딱히 어떤 문제가 있는지 모르겠네요~ ㅜㅜ


그럼 humit 님께서도 남은 주말 즐겁게 보내시고 남은 학기도 홧팅홧팅하세요~

+) 저는 요새 연수를 받고 있는데 공대 분들이 많이 계셔서 반갑더군요 ^-^

comment menu
2020.05.31. 21:41

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → 이니스프리
profile image

존재하지 않는 스티커입니다.

comment menu
2020.05.31. 21:56

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → 이니스프리
profile image
+1
저기서 문제가 되는 부분이 글쓰기 요청을 여러개 보냈을 때 처리하는 순서에 의해서 발생하는 문제입니다.

예를 들어 글쓰기 요청이 2개가 이루어지고 포인트는 10이라고 가정을 하겠습니다.
원래 자연스러운 흐름은 (포인트 체크1) => (글쓰기 요청1) => (포인트 감소1) => (포인트 체크2) => (포인트 에러2) 와 같은 흐름이 되어야 합니다.

하지만 저렇게 글쓰기 요청이 오래 걸리면 실행흐름이 아래와 같이 될 수 있습니다.
(포인트 체크1) => (글쓰기 요청1) => (포인트 체크2) => (글쓰기 요청2) => (포인트 감소1) => (포인트 감소2) 와 같은 흐름이 가능해질 수 있습니다. 즉 포인트 체크를 하는 부분이 이전의 포인트 감소가 일어나기 전에 발생할 수 있기 때문에 이런 경우엔 우회가 가능하게 되는 것입니다.

이를 해결하려면 SQL에서 제공하는 기능인 transaction을 사용하는 방법이 있습니다.
comment menu
2020.06.01. 00:09

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image
앗 흐름을 설명해주신 덕분에 잘 이해가 되었습니다~!
역시 코딩의 세계는 어렵게 심오하네요 ㅎㄷㄷ
제가 지금 진행하고 있는 홈페이지 개발에 적용할 수 있도록 transaction 등과 관련하여 공부를 더 해야겠네요 :)
번번이 정말 감사합니다!! ^-^
그럼 굿밤 되세요 :)
comment menu
2020.06.01. 00:13

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image

존재하지 않는 스티커입니다.

comment menu
2020.06.01. 00:13

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → humit
profile image

맛스타님 댓글에서는 syntax highlighter를 어떻게 사용해야 하나요??

comment menu
2020.05.31. 16:17

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

NoYeah → humit
profile image
앗. 댓글에는 사용하지 못하도록 되어있나봅니다. 수정해놓겠습니다.
comment menu
2020.05.31. 21:47

신고

"NoYeah님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → NoYeah
profile image

존재하지 않는 스티커입니다.

comment menu
2020.06.01. 00:10

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

마스터 → humit
profile image
PC로 사용하는 경우에 에디터로 작성하면 syntax highlighter 사용할 수 있도록 하였습니다.
(모바일은 본문, 댓글 모두 불가능합니다. 쓸일이 없을 것 같아서요.)
comment menu
2020.05.31. 22:51

신고

"마스터님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [1차 해결 및 추가] 서버 접속 불가 문제 안내 12 마스터 24.06.20.15:22 489
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 24.02.11.17:21 2521
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 6212
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4629
706 네이버 카페의 게시글 크롤링과 관련하여 질문 드려요 ^^ 7 image 이니스프리 20.04.04.23:33 1532
705 파이썬 Requests과 HTTP 통신에 관하여 이론적으로 궁금한건데요~ 4 이니스프리 20.04.03.15:55 209
704 아이콘 구매와 활용법에 대한 질문 10 해피보이 20.04.02.18:04 234
703 사이트 메인페이지에 갈림길 화면이 뜨게 하는 법에 대하여 어쭈어 봅니다. 5 image 입체그림 20.04.01.19:31 220
702 Cloudflare와 관련하여 질문 드려요 ^-^ 7 이니스프리 20.03.30.14:48 439
701 크롤링 용도로 사용하는 VPS의 트래픽이 얼마나 될까요?? 2 이니스프리 20.03.29.21:02 264
700 안녕하세요ㅠㅠ 위키 URL 리다이렉션 관련 질문입니다 1 김광현 20.03.26.16:33 231
699 그누보드용 회원차단 크롬 확장프로그램을 만들어보려는데요~ ^-^ 7 이니스프리 20.03.24.23:53 263
698 VPS 웹서버 설치 후 보안을 위해 추가로 해야되는 조치에는 어떤 것이 있을까요?? 6 이니스프리 20.03.13.22:46 249
697 페북이나 트위터처럼 태그 속성이 자주 변경되는 사이트의 크롤링은 어떻게 해야 될까요?? 4 이니스프리 20.03.09.00:27 240
696 브라우저 개발자도구에서 formdata를 숨기는 방법이 있는가요? 6 이니스프리 20.03.07.23:54 2653
695 그누보드5 홈피 관리해주실분 찾습니다. 찰리 20.03.04.23:10 207
694 [파이썬] 윈도우에서 datetime 객체의 invalid format string 에러 3 이니스프리 20.03.04.15:52 1511
693 XE 에디터가 작동하지 않아요 ㅠㅠ 4 image 입체그림 20.03.03.17:30 221
692 VPS 플랜 선택과 관련하여 질문 드립니다 ^-^ 4 image 이니스프리 20.02.28.20:52 216
691 스터디포어스 웹호스팅상에서 비주얼에디터 설치하는 중 오류가 났습니다 ㅠㅠ image 입체그림 20.02.28.14:40 207
690 [해결][CURL/PHP] 스터디포어스서버에서의 PHP CURL에 대한 특정 서버의 잘못된 응답에 대하여 3 Hanam09 20.02.27.15:36 315
689 [파이썬] 웹 페이지 크롤링 시 조건에 따라 보여졌다 안보여지는 class를 조건문으로 사용 하고 싶은데요.. 4 위돈톡애니모 20.02.25.15:19 1334
688 [파이썬] Temporary failure in name resolution에 대해 여쭤봅니다 2 이니스프리 20.02.25.11:50 990
687 홈서버용 CPU 좀 봐주시면 감사하겠습니다~ ㅠㅠ 7 image 이니스프리 20.02.24.22:40 220