黑客如何用nginx攻擊一個網站?
~~最好的防禦方式就是攻擊~~ 知己知彼,百戰不殆。掌握攻擊者的套路才好頂得住攻擊。
可能我的讀者多少了解過Nginx
,我先給不瞭解的同學簡單説一下原理。已經瞭解的跳到第二節。
3分鐘瞭解Nginx
Nginx
是一款高性能的Web
服務器和反向代理服務器。
它可以用來搭建網站、做應用服務器,能夠處理大量的併發連接和請求。
- 靜態內容託管(主要):可以用來做網頁、圖片、文件的 “靜態”內容託管。
- 動態內容託管(主要):將經常訪問的動態內容緩存到內存中,提高訪問速度和性能。
- 反向代理(主要):將客户端的請求發送到後端真實服務器,並將後端服務器的響應返回給客户端。
類似於一個快遞收發室,指揮快遞(流量)應該投遞到哪個買家。
它還能提供一些高級功能:
- 負載均衡:將客户端的請求分發到多個後端服務器上,從而提高服務的可用性和性能。
- SSL/TLS加密傳輸:通過加密和認證保護數據傳輸安全。
- HTTP/2支持:通過多路複用技術提高併發連接處理能力和頁面加載速度。
- 安全防護:提供多種防護機制,如限制IP訪問、請求頻率限制、反爬蟲等。
- 動態內容處理:支持FastCGI、uWSGI等協議,與後端應用服務器進行動態內容交互。
- 日誌記錄:記錄訪問日誌和錯誤日誌,方便監控和排查問題。
- 自定義模塊開發:支持自定義模塊開發,可以根據需求進行二次開發和擴展。
讀到這裏,我知道很多人腦子都要爆了。現在讓我們直入主題。結合以上功能的能做哪些攻擊方式。
反向代理攻擊
使用Nginx
作為反向代理服務器,將攻擊流量轉發到目標服務器。這樣就能隱藏攻擊流量的真實地址。
perl
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
- 所有訪問
www.example.com:80
的流量全部都會轉發到http://backend_server
服務器上。 proxy_set_header X-Real-IP $remote_addr;
設置請求頭提供真實來源ip
。proxy_set_header Host $host;
設置訪問的Host
。
只要把X-Real-IP
改成其他不存在的IP
,就可以隱藏自己的真實IP地址,讓攻擊更難以被追蹤和防禦。當然相對於客户端來説,只能知道nginx
的地址就不知道真實服務器的地址了。
DDoS攻擊
DDoS
攻擊就是藉助某些工具瞬間發動大量的請求,讓服務器資源耗盡,無法正常響應其他用户的請求,一般也常用於壓力測試。介紹一些常用的工具:
ApacheBench
(ab):常用的命令行工具,用於模擬多個併發請求。可以控制請求總數、併發數等參數。Siege
:命令行工具,和上面一樣,並且還支持HTTP
和HTTPS
協議。JMeter
:一個功能強大的Java
應用程序,可以用於模擬各種負載情況。JMeter
可以通過圖形界面進行配置,支持更多協議和數據格式,包括 HTTP、HTTPS、SOAP、REST 等。
但事實往往比這個殘酷,攻擊者會做一些病毒,在網絡上傳播開來,病毒運行時可以直接瘋狂訪問服務器,或者利用Nginx
提供的反向代理和其支持的比如socket
、SSL
,不斷的建立握手請求。
限流、黑名單防禦
小熊主要給大家介紹怎麼防禦。這種病毒感染方式就不説了,我害怕戴銀手銬。
```yaml http { limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
geo $block {
default 0;
include /path/to/block_ip.txt;
}
server {
listen 80;
location / {
limit_req zone=one burst=10 nodelay;
if ($block) {
return 403;
}
proxy_pass http://backend;
}
}
} ```
limit_req_zone
定義了一個名為“one”的限制請求速率的區域,該區域的大小為10MB,請求速率限制為每秒5個請求。limit_req
指定使用名為“one”的限制規則。geo $block
是黑名單,這個文件可以寫需要屏蔽的ip
。server
塊中的location
指令使用了limit_req
和if
表示黑名單的返回403
狀態碼。
負載均衡防禦
假設我有兩個後端服務器。
bash
http {
upstream backend {
# 輪詢方式的負載均衡
server backend1.example.com;
server backend2.example.com;
}
...
server{...}
}
有多種負載均衡方式。
```bash server { ... location /api/ { # 輪訓 proxy_pass http://backend; }
location /lb/ {
# IP哈希方式的負載均衡
ip_hash;
proxy_pass http://backend;
}
location /upstream/ {
# 根據服務器性能或響應時間進行加權輪詢
upstream backend {
server backend1.example.com weight=2;
server backend2.example.com;
}
# 對 backend 進行訪問
proxy_pass http://backend;
}
location /least_conn/ {
# 最少連接數的負載均衡
least_conn;
proxy_pass http://backend;
}
location /random/ {
# 隨機方式的負載均衡
random;
proxy_pass http://backend;
}
location /sticky/ {
# 基於客户端IP的哈希方式的負載均衡
hash $remote_addr consistent;
server backend1.example.com;
server backend2.example.com;
}
} ```
很多人學nginx
都會對ip_hash
和基於客户端IP的哈希方式的負載均衡有疑惑。分不清,我一句話給大家講清楚。
ip_hash
能保證相同來源一定能訪問相同的服務器,適用於登錄等有狀態的場景。在請求量少的時候,容易出現很多ip
落在同一服務器上,分佈不均衡。- 基於客户端ip的hash,是根據客户端 IP 地址計算哈希值,然後將哈希值與後端服務器數量取模。使請求平均分配到不同的服務器上,也能保證同一
ip
請求落到同一服務器上。但是可以保證各個服務器比較均衡。
我認為使用方式二更好,可能理解有限,歡迎各位讀者分享自己的看法!
網絡釣魚攻擊
黑客可以使用Nginx偽裝成一個合法的網站,誘騙用户輸入敏感信息。例如,他們可以使用Nginx構造一個偽造的登錄頁面,讓用户輸入用户名和密碼,然後將這些信息發送給黑客服務器。
其實就是靜態託管+反向代理功能的組合。
```bash server { listen 80; server_name example.com;
# 靜態網站託管
location / {
root /var/www/mywebsite/dist;
index index.html index.htm;
}
# API代理轉發
location /api {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
} ```
- 訪問根目錄就訪問到靜態的網站資源。
- 訪問
/api
路由轉發到api
服務上。
我的博客就用了這種方式,同樣的我寫了很多了不同的server{}
塊,來監聽不同的域名,這樣我可以把多個網站全部部署在同一台機器上,極限利用服務器資源。
最後
這兩天在寫一個小程序,計劃做成程序員資源、求助、內推、課程、學習路線圖之類的綜合類小程序,所以更新有點慢了,見諒見諒。
對於今天所述的文章,真正有不良居心的人,總是會有更sao
的攻擊方法。我也不敢説得太多,而且這些攻擊的行為都是違法的,建議大家學會以後手下留情。
今天的目的實際上是教大家學會nginx
的常用配置方法,用心良苦,莫辜負點個贊再走。
一起進步
你好,我是小熊,是一個愛技術但是更愛錢的程序員。上進且佛系自律的人。喜歡發小祕密/臭屁又愛炫耀。
奮鬥的大學,激情的現在。賺了錢買了房,寫了書出了名。當過面試官,帶過徒弟搬過轉。
大廠外來務工人員。是我,我是小熊,是不一樣的煙火歡迎圍觀。
可掘金私信我,也可 加我好友 我們一起進步
開啟掘金成長之旅!這是我參與「掘金日新計劃 · 2 月更文挑戰」的第 3 天,點擊查看活動詳情