作者sirusi (印)
看板C_and_CPP
标题[问题] 关於server接受client的shell指令之安全
时间Wed Jun 14 12:56:33 2017
大家好 我在阅读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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1497416196.A.354.html
※ 编辑: sirusi (60.135.146.248), 06/14/2017 12:57:42
1F:→ pili100: 我是不知道foobar是什麽 06/14 13:51
2F:→ pili100: 简单说,指令不用明码传送 06/14 13:51
4F:→ x000032001: 查查command injection就蛮多资讯了 06/14 14:50
5F:推 hn12404988: 投wrapper一票 06/14 19:25
6F:→ jackace: 只要有一个概念就行了 : DON'T DO THIS 06/14 20:17
7F:推 longlongint: 一般做法 只开固定功能 参数只给填纯数值 06/14 23:03
8F:→ longlongint: 让人填指令的做法真的很北七 06/14 23:03
9F:推 Neisseria: 让人填指令感觉就是自已开洞给别人进来 06/15 07:41
10F:→ sirusi: 非常谢谢各位大大提供的方向! 06/15 10:05
11F:推 alex70266: 最简单的想法就是client side丢过来的东西一定要验证 06/16 22:48
12F:→ alex70266: 因为不能设想request参数都是安全的 06/16 22:50
13F:推 pttuser: 填指令当然没问题,有问题的是安全性,加上sandbox吧 06/17 23:33
14F:→ Killercat: 其实我不太懂 安全性的东西不是server要负责的吗? 06/18 14:45
15F:→ Killercat: SELinux就是这种思维下的产物 怎麽会跑去要client负责 06/18 14:45
16F:→ Killercat: 一个operation「安不安全」的定义 怎样都不是client管 06/18 14:45
17F:→ Killercat: 今天client就算定一堆定义 别人sniffer你 一样可以绕过 06/18 14:46
18F:→ Killercat: client的规范,这完全不是一个安全的系统该有的做法 06/18 14:46