[問題] 關於server接受client的shell指令之安全

看板C_and_CPP作者 (印)時間7年前 (2017/06/14 12:56), 7年前編輯推噓5(5013)
留言18則, 10人參與, 最新討論串1/1
大家好 我在閱讀Beej's Guide中文譯本時,不太能理解下列這段文字: (http://beej-zhtw.netdpi.net/08-FAQ) 以下是我有疑問的一段內文 (疑問處使用綠色標記) ---------------------------------------------------------------- Q:我該怎麼寫一個 server,可以接受來自 client 的 shell 指令並執行指令呢? client 的處理過程是: 1. 用 connect() 連線到 server 2. send("/sbin/ls > /tmp/client.out") 3. 用 close() 關閉連線 此時,server 正在處理資料並執行指令: 1. accept() client 的連線 2. 使用 recv(str) 接收命令字串 3. 用 close() 關閉連線 4. 用 system(str) 執行指令 注意!server 會執行全部 client 所送的指令,就像是提供了遠端的 shell 存取權限,人 們可以連線到你的 server 並用你的帳號做點事情。例如:若 client 送出 "rm -rf ~" 會怎麼樣呢?這會刪掉你帳號裡的全部資料,就是這樣! 所以你學聰明了,你會避免 client 使用任何危險的工具,比如 foobar 工具: if (!strncmp(str, "foobar", 6)) { sprintf(sysstr, "%s > /tmp/server.out", str); system(sysstr); } 可是這樣還是不安全,沒錯:如果 client 輸入 "foobar; rm -rf ~" 呢? 最安全的方式是寫一個小機制,將命令參數中的非字母數字字元前面放個['\']字元[如 果適合的話,要包括空白]。 如你所見,當 server 開始執行 client 送來的東西時,安全性(security)是個問題。 ---------------------------------------------------------------- 我的疑問如下: 1. 請問加了strncmp那個判斷式後,按照程式邏輯 假如client要請server執行"ls > file1.txt" 必須要使用"foobar ls > file1.txt"才可以嗎? 請問為什麼要這樣做呢? 2. 請問"最安全的方式是寫一個小機制"那一個方式是什麼意思呢? 目前我的程度對於程式安全還沒有什麼概念...上面這段讀了幾次還是無法看懂QQ 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.135.146.248 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1497416196.A.354.html ※ 編輯: sirusi (60.135.146.248), 06/14/2017 12:57:42

06/14 13:51, , 1F
我是不知道foobar是什麼
06/14 13:51, 1F

06/14 13:51, , 2F
簡單說,指令不用明碼傳送
06/14 13:51, 2F

06/14 14:45, , 3F
大致上是個wrapper 類似 https://url.fit/ZZRBN
06/14 14:45, 3F

06/14 14:50, , 4F
查查command injection就蠻多資訊了
06/14 14:50, 4F

06/14 19:25, , 5F
投wrapper一票
06/14 19:25, 5F

06/14 20:17, , 6F
只要有一個概念就行了 : DON'T DO THIS
06/14 20:17, 6F

06/14 23:03, , 7F
一般做法 只開固定功能 參數只給填純數值
06/14 23:03, 7F

06/14 23:03, , 8F
讓人填指令的做法真的很北七
06/14 23:03, 8F

06/15 07:41, , 9F
讓人填指令感覺就是自已開洞給別人進來
06/15 07:41, 9F

06/15 10:05, , 10F
非常謝謝各位大大提供的方向!
06/15 10:05, 10F

06/16 22:48, , 11F
最簡單的想法就是client side丟過來的東西一定要驗證
06/16 22:48, 11F

06/16 22:50, , 12F
因為不能設想request參數都是安全的
06/16 22:50, 12F

06/17 23:33, , 13F
填指令當然沒問題,有問題的是安全性,加上sandbox吧
06/17 23:33, 13F

06/18 14:45, , 14F
其實我不太懂 安全性的東西不是server要負責的嗎?
06/18 14:45, 14F

06/18 14:45, , 15F
SELinux就是這種思維下的產物 怎麼會跑去要client負責
06/18 14:45, 15F

06/18 14:45, , 16F
一個operation「安不安全」的定義 怎樣都不是client管
06/18 14:45, 16F

06/18 14:46, , 17F
今天client就算定一堆定義 別人sniffer你 一樣可以繞過
06/18 14:46, 17F

06/18 14:46, , 18F
client的規範,這完全不是一個安全的系統該有的做法
06/18 14:46, 18F
文章代碼(AID): #1PGC84DK (C_and_CPP)