看板 C_and_CPP 關於我們 聯絡資訊
大家好 我在閱讀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
pili100: 我是不知道foobar是什麼 06/14 13:51
pili100: 簡單說,指令不用明碼傳送 06/14 13:51
x000032001: 大致上是個wrapper 類似 https://url.fit/ZZRBN 06/14 14:45
x000032001: 查查command injection就蠻多資訊了 06/14 14:50
hn12404988: 投wrapper一票 06/14 19:25
jackace: 只要有一個概念就行了 : DON'T DO THIS 06/14 20:17
longlongint: 一般做法 只開固定功能 參數只給填純數值 06/14 23:03
longlongint: 讓人填指令的做法真的很北七 06/14 23:03
Neisseria: 讓人填指令感覺就是自已開洞給別人進來 06/15 07:41
sirusi: 非常謝謝各位大大提供的方向! 06/15 10:05
alex70266: 最簡單的想法就是client side丟過來的東西一定要驗證 06/16 22:48
alex70266: 因為不能設想request參數都是安全的 06/16 22:50
pttuser: 填指令當然沒問題,有問題的是安全性,加上sandbox吧 06/17 23:33
Killercat: 其實我不太懂 安全性的東西不是server要負責的嗎? 06/18 14:45
Killercat: SELinux就是這種思維下的產物 怎麼會跑去要client負責 06/18 14:45
Killercat: 一個operation「安不安全」的定義 怎樣都不是client管 06/18 14:45
Killercat: 今天client就算定一堆定義 別人sniffer你 一樣可以繞過 06/18 14:46
Killercat: client的規範,這完全不是一個安全的系統該有的做法 06/18 14:46