• 목록
  • 아래로
  • 위로

안녕하세요??

 

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

 

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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

감사합니다!

 

작성자
이니스프리 119 Lv. (0%) 1930110/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

신고

"마스터님의 댓글"

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

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 24.02.11.17:21 830
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 4503
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4476
925 ls는 됫는대 압축풀기가 안되내요 ㅜㅜ 핫슈 20.06.16.21:15 42
924 XE 1.4.XXX 버전 사용하는데 모바일 레이아웃이 계속 적용이 안 되네요. 1 αGO 20.07.02.10:09 42
923 맵네임을 누르면 다른 사이트의 게시판을 나오게 하고싶은데 어떻게 해야하나요? 1 손가락개 20.11.08.01:01 51
922 퍼티에서 command 뜨면 없다는 것인가요? 2 핫슈 20.06.15.19:55 53
921 내 포인트는 어디서 확인하나요? 3 파이리 21.02.08.11:58 54
920 사이트 정보 등록글 링크가 뭐죠..? 2 파이리 21.02.07.20:11 56
919 ftp web파일 1 wikiowner 20.11.11.22:16 57
918 PHP) 위키 문법 정규식 처리 관련 260578 20.09.06.20:59 64
917 홈페이지 디자인을 바꾼 후부터 게시판 스킨 적용이 이상하게 됩니다 image 손가락개 20.12.04.02:56 66
916 가비아 도메인 스터디 포 어스 연결되나요? 1 HighSpeed 21.01.15.17:28 68
915 php 1 wikiowner 21.01.22.11:10 69
914 간단한 질문 드립니다 2 {Cog} 20.07.07.18:44 70
913 구글과 사파리의 결과값에 차이가 있습니다. 조언 부탁드려도 될까요? 7 image GsusWeb 20.06.18.09:52 73
912 그매햇던것이 라이믹스 에 안올라갑니다. 2 image 핫슈 20.06.19.20:52 73
911 요즘 코로나 백신 소식이 자주나오는데 내년에는 괜찮을까요? 3 필우 20.11.13.10:41 74
910 예)www.123.com > 123.com리디렉트 질문 1 image HighSpeed 21.01.21.17:27 74
909 FTP 로 라이믹스 업로드 중 전송실패가 많다. 2 핫슈 20.06.14.19:51 75
908 CentOS vsftp 윈도우 클라이언트에서 접속 불가 2 image 세종대왕 20.09.09.14:04 75
907 최근에 혹시 phpmyadmin 주소가 바뀌었나요? 2 막시모 21.01.28.17:42 75
906 마스터님! 3 citen 21.02.14.12:45 77