安全 调用外部程序要小心

Rei · 2013年07月11日 · 最后由 goinaction 回复于 2013年07月13日 · 7168 次阅读
本帖已被管理员设置为精华贴

http://blog.chloerei.com/articles/33-be-careful-on-system-call

之前开发导出功能的时候,不小心引入一些安全漏洞。好在这些漏洞在没有被利用之前,就被我发现了并且修复了。我记录一下这些漏洞的产生,也许能给人一些启发。

用数组方式做调用,或者拼字符串时加上 obj.shellescape 就好了

不过 curl 的协议问题也是经常会没注意到...

对于大部分带拼字符串的命令行调用

system "cc #{foo} -o tmp/#{bar}"

全部改成这样就不怕注入了:

system *%W"cc #{foo} -o tmp/#{bar}"

利用 ruby 语法优势,只需要加 *%W 超简单...

这种问题我记得 Brakeman 可以检查出来的

https://github.com/presidentbeef/brakeman

#1 楼 @luikore 学习了,之前不知道有 shellescape 这个方法。

我也是用 *%W,为了避免讲解语法所以用简单的数组。

#3 楼 @huacnlee 好东西,检出几个潜在漏洞

还可以对上线版本用 metasploit 做穿透测试,metasploit 还可以开 irb 控制台干坏事...

试了一下@Rei 说的

> system "curl", "-o a.png //l.ruby-china.com/photo/5982eaaa64f467d9dbda03ad4f40ea27.png"
curl: no URL specified!
curl: try 'curl --help' or 'curl --manual' for more information
=> false

system "curl", "-o", "a.png", "//l.ruby-china.com/photo/5982eaaa64f467d9dbda03ad4f40ea27.png" 正常

> system "curl", "-o", "a.png", "//l.ruby-china.com/photo/5982eaaa64f467d9dbda03ad4f40ea27.png"
  % Total    % Received % Xferd  Average Speed   Time    Time    Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12458  100 12458    0     0  11821      0  0:00:01  0:00:01 --:--:--  553k
=> true

#7 楼 @charles 抱歉,我搞错了,数组参数需要把每个参数都分开。实际我是这么用的

system *%W( curl -o a.png //l.ruby-china.com/photo/5982eaaa64f467d9dbda03ad4f40ea27.png )

%w前加个*是啥意思呢?

#11 楼 @goinaction %W( ) 是个数组,直接传给方法是一个数组参数,加 * 将数组展开作为多个参数传入。

#12 楼 @Rei 原来还是数组展开的作用,以为是啥特殊功能。。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号