• 목록
  • 아래로
  • 위로

안녕하세요??

 

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

 

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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

감사합니다!

 

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

당분간 일신상의 사정으로 쪽지나 댓글로 답변을 드리기 어렵습니다. 죄송합니다.

 

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

신고

"마스터님의 댓글"

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

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 24.02.11.17:21 380
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 4063
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4464
762 극저사양 테스트 서버 구축 OS 및 스포어 호스팅 수정승인대기 13 image Apache 20.06.28.12:03 290
761 오라클 클라우드 프리티어 가입이 안 되네요 ㅠㅠ 20 이니스프리 20.06.26.21:31 4827
760 웹 페이지에서 알 수 없는 공간을 없애고 싶은데.. 5 GsusWeb 20.06.25.14:59 96
759 정전 상태에서 인강을 들어야 되는데요 ㄷㄷ 17 이니스프리 20.06.24.21:51 210
758 호스팅 신청했는데요 도움 좀 부탁드립니다. 24 GsusWeb 20.06.20.21:34 227
757 사이트의 Slow query가 의심되어서 질문 드려요! ^^ 8 이니스프리 20.06.20.14:02 160
756 제 블로그 들어갈 때마다 ERR_CONNECTION_RESET 이 오류가 뜨는데 어째서일까요... 9 MYIG 20.06.19.22:53 399
755 그매햇던것이 라이믹스 에 안올라갑니다. 2 image 핫슈 20.06.19.20:52 72
754 코딩하실 때 어떤 브라우저를 기준으로 하시나요? 9 GsusWeb 20.06.19.17:49 127
753 HTML 과 PHP의 연동? 8 GsusWeb 20.06.19.08:34 168
752 구글과 사파리의 결과값에 차이가 있습니다. 조언 부탁드려도 될까요? 7 image GsusWeb 20.06.18.09:52 72
751 ls는 됫는대 압축풀기가 안되내요 ㅜㅜ 핫슈 20.06.16.21:15 42
750 퍼티에서 command 뜨면 없다는 것인가요? 2 핫슈 20.06.15.19:55 52
749 FTP 로 라이믹스 업로드 중 전송실패가 많다. 2 핫슈 20.06.14.19:51 74
748 JSP의 장단점에 대해 질문 드립니다. 21 이니스프리 20.06.09.21:42 218
747 오라클 클라우드로 vpn 구축하는 법? 2 joyfuI 20.06.09.15:44 690
746 Chrome와 Safari의 비밀번호 연동이 가능한가요? 10 갱생협스 20.06.06.21:24 126
745 게임 용어에 대해 질문 드립니다 (탱커/딜러/힐러) 21 이니스프리 20.06.05.20:45 2112
744 AWS elastic inference 끄는 법 아세요? 15 image 국내산라이츄 20.06.03.15:21 180
743 핸드폰 유심이 이상해요. 7 슬기 20.06.01.19:18 213