1. 문제
APP을 출시한 지 꽤 됐는데, 어느 날 갑자기 온라인 상품에서 인증코드를 보낼 수 없는 걸 발견했어요.
타사 SMS 인증코드 서비스 백엔드에 로그인해 보니 문제가 심각한 것으로 나타났습니다.
3 | youbiquan | 15797 | 2015-12-25 |
4 | youbiquan | 57 | 2015-12-23 |
5 | youbiquan | 49 | 2015-12-22 |
6 | youbiquan | 54 | 2015-12-21 |
7 | youbiquan | 64 | 2015-12-20 |
221.178.182.21 - - [05/Jan/2016:16:19:25 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.3; XM50h Build/19.1.1.C.1.2)" "-" 171.82.225.66 - - [05/Jan/2016:16:19:32 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.4; 2014812 MIUI/V6.6.3.0.KHJCNCF)" "-" 171.82.225.66 - - [05/Jan/2016:16:19:32 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.4; 2014812 MIUI/V6.6.3.0.KHJCNCF)" "-" 110.89.16.13 - - [05/Jan/2016:16:19:49 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.2.2; R827T Build/JDQ39)" "-" 110.89.16.13 - - [05/Jan/2016:16:19:49 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.2.2; R827T Build/JDQ39)" "-" 118.114.160.200 - - [05/Jan/2016:16:21:26 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-" 118.114.160.200 - - [05/Jan/2016:16:21:39 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-" 119.122.0.136 - - [05/Jan/2016:16:21:41 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-" 118.114.160.200 - - [05/Jan/2016:16:21:51 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-"
방문수가 너무 많아도 서버가 정상적으로 서비스를 제공하지 못하고 붕괴 직전이라는 느낌을 받게 될 것입니다. 2. 임시 해결 방법
문제 파악에 앞서 가장 먼저 떠오르는 것은 공격자가 서비스에 접근할 수는 없지만 서비스를 종료할 수 없도록 SMS 서비스를 중지하는 것입니다. 서버를 삭제하세요. 결국 온라인 사용자는 여전히 이를 사용하고 있습니다. 먼저 nginx를 사용하여 이 인터페이스를 다시 작성하세요.if ( $request_uri ~* "showType=smsAuthcode" ) { rewrite ^/ http://www.baidu.com/; }
물론 구성 방법은 다양할 수 있습니다. 여기서는 문제를 해결하기 위한 아이디어일 뿐이며, 보다 전문적인 nginx 구성 정보를 참조할 수도 있습니다.
우선 바이두 측에 사과드리며 공격 요청을 바이두 측에 전달했습니다. 실제로는 200 등 아무 값이나 반환하면 됩니다.3. 로그 분석 기반 솔루션
물론 문제는 해결되지 않습니다. line 이전 사용자는 신규 사용자를 등록할 수 없습니다.
로그를 분석한 결과, 어떤 IP는 수천 건의 공격이 있었고, 어떤 IP는 물론 몇 번의 방문만 있었던 것을 발견했습니다. 여러 번 방문한 IP의 경우 실제 사용자의 IP인지, 공격 머신의 IP인지 확인할 방법이 사실상 없습니다. 특정 인터페이스가 특정 기간 내에 IP 액세스 횟수를 제한할 수 있도록 하는 솔루션을 인터넷에서 찾았습니다.
iptables -A INPUT -p tcp --dport 80 -d xx.xx.xx.xx -m string --string "/myinterface?showType=smsAuthcode" --algo kmp -m recent --name httpuser --set iptables -A INPUT -m recent --update --name httpuser --seconds 86400 --hitcount 4 -j LOG --log-level 5 --log-prefix 'HTTP attack: ' iptables -A INPUT -m string --string "/myinterface?showType=smsAuthcode" --algo kmp -m recent --update --name httpuser --seconds 86400 --hitcount 10 -j REJECT
기본적인 의미는 액세스 요청에 대해 문자열 일치를 수행하는 것입니다. SMS 인터페이스에 대한 액세스가 발견되면 액세스가 하루에 4회를 초과하는 경우 최근 모듈을 사용하여 액세스를 기록합니다. 그러면 SMS 인터페이스에 다시 액세스할 수 없습니다. 사실 어느 정도 효과가 있는 솔루션이기도 합니다
序号 | 账号 | 数量(条) | 日期 |
---|---|---|---|
2 | youbiquan | 540 | 2016-01-08 |
3 | youbiquan | 2857 | 2016-01-04 |
4 | youbiquan | 388 | 2016-01-05 |
5 | youbiquan | 2469 | 2016-01-06 |
IP 주소를 기반으로 한 예방은 어느 정도 효과는 있지만, 아직 완전히 예방할 수는 없습니다. 보통 하루에 약 50개의 메시지만 보내지만, IP 방화벽을 설정한 후에도 여전히 매일 수천 개의 메시지가 전송됩니다. 분석 결과, 이번 공격에 사용된 IP 주소가 너무 많은 것으로 확인됐기 때문에 IP 주소를 사용해 방어할 가능성은 없어 보였다.
어느 날 고민에 빠졌을 때 nginx 액세스 로그를 다시 열어보니 갑자기 공격 행위의 user-agent가 매우 짧다는 것을 발견했는데, 이는 다른 액세스의 user-agent와는 확연히 다른 점이었습니다. 공격자의 user-agen은 모두 "Mozila/5.0"인 것으로 보이며 이후에는 시스템 버전, 브라우저 등을 포함한 추가 정보를 얻을 수 있습니다. 이 추측에 따르면 사용자 에이전트를 분석하는 프로그램을 사용했습니다. 물론 SMS 인터페이스에 액세스하는 UA에는 짧은 "Mozila/5.0"만 존재합니다. Short UADalvik/1.6.0 (Linux; U; Android 4.2.2; R827T Build/JDQ39)" "-"
그래서 검색해보니 Dalvik이 안드로이드 가상머신이라는 걸 알게 되었는데, 갑자기 Mozila/5.0과 가상머신을 완전히 차단할 수 있겠다는 생각이 들었습니다. UA 예방을 기반으로 하면 문제가 해결될 것입니다.
그래서 nginx 구성에 다음 코드를 추가했습니다if ($http_user_agent = "Mozilla/5.0") { return 503; } if ($http_user_agent ~* "Dalvik/1.6.0") { return 503; }
2 | youbiquan | 57 | 2016-01-09 |
위 내용은 제가 접한 DDOS 공격을 영리하게 해결하기 위해 Nignx를 사용하는 방법을 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.