使用shell脚本进行CGI编程

时间:2009-07-30 13:09:08

标签: security bash shell cgi

我需要将文本框的内容传递给变量。即,在html页面的texbox中输入的任何内容都需要传递给变量。这是因为我在linux shell编程中调用了HTML(CGI)。我需要根据需要操纵该变量。你有任何想法吗?

我需要做的是,我想将MAC地址作为用户的输入。即我们应该有一个带有文本框的HTML页面,该用户将能够输入MAC地址。因此,任何用户输入文本框都需要传递给变量。

一旦我们有了变量,这个脚本就会自动将这个MAC地址添加到linux防火墙中以拒绝访问。

代码应类似于以下内容:

!/bin/bash

echo "Content-type: text/html"

echo ""

echo ""

echo "enter the MAC address "

iptables -A INPUT -m mac --mac-source $mac_address -j DROP

service iptables save

service iptables restart

我将此文件(test.cgi)保存在/ var / www / cgi-bin目录下,我将从firefox运行此脚本。

现在问题是变量$mac_address。 CGI不会将文本框输入传递给变量$ mac_address。

4 个答案:

答案 0 :(得分:4)

这个问题的真正答案是

您的网络服务器似乎以root权限运行。这是第一个禁忌。

您真的想让整个世界都能够修改防火墙配置吗?您无法控制如何调用shell脚本,传递给它的内容。您正在打开 主要 安全漏洞。

请参阅WWW Security FAQ on CGI scriptsWriting secure CGI scripts以及CGI Security : Better Safe than Sorry

答案 1 :(得分:3)

首先,阅读CGI primer

您需要一个包含以下代码的HTML页面:

<form method="get" action="/cgi-bin/my-fw-script.sh">
    <p>Gimme an IP address: <input name="addr"></p>
    <input type="submit">Block IP</input>
</form>

当用户单击表单的“提交”按钮时,将运行您的Bash CGI程序。 (上例中的 /path/to/cgi-bin/my-fw-script.sh 。)文本输入将在QUERY_STRING环境变量中,格式为 variable = value 。对于简单输入,您可以调用Bash函数eval将其转换为Bash变量:

#!/bin/sh
eval $QUERY_STRING
echo You asked me to block $addr.

这仅适用于单个输入字段,如果有空格或其他特殊字符,则会中断。我想其他人推荐的bash_cgi会为你处理这些细节。只有当这个程序保持非常简单时,才能像上面的例子一样。

顺便说一句,您几乎肯定不希望将MAC地址添加到防火墙。这仅适用于与防火墙盒子在同一LAN上的主机。来自另一个LAN,Internet等的数据包将具有LAN网关的MAC地址。您可能应该通过IP地址阻止主机。

答案 2 :(得分:1)

查看bashlib - CGI programming with the bash shell

  

bashlib是一个shell脚本,它在bash shell中进行CGI编程   更容易,或至少更容忍。它包含一些功能   自动调用并放置表单元素(来自POST和GET)   和环境中的cookie。它还包含完整的   有关如何使用这些变量以及如何设置cookie的文档   手动

超级简单使用并将传递url字符串作为变量等等轻而易举。不要让反对者讨厌bash作为一种网络脚本语言。它可以拥有自己的...而且它简单,无处不在,有效......这种情况略有不同,但如果你不容易受到同伴的压力,我会说要去做吧。

#!/bin/bash
# this sources bashlib into your current environment
. /usr/local/lib/bashlib
echo "Content-type: text/html"
echo ""
# OK, so we've sent the header... now send some content
echo "<html><title>Crack This Server</title><body>"

相关且很酷:xmlshshellinabox

答案 3 :(得分:0)

很抱歉在这一点上继续努力,我只是认为太有趣了 ......

因此,对于最终的所有CGI脚本,请查看...

警告...... 不是因为安全怪胎或任何不完全了解以下内容的人...

#!/usr/bin/python
# /var/www/cgi-bin/doanything.cgi   r-xr-x---  wwwuser group
# what does this do?  LITERALLY ANYTHING.   Usage: 
# http://server.local/cgi/doanything.cgi?DO="if you can think of how to bash it"; THEN="bash it"; echo $THEN 
# result: bash it


import cgitb; cgitb.enable()
import os, urllib, subprocess as sub

# Retrieve the command from the query string and unencode the escaped %xx chars
str_command = urllib.unquote(os.environ['QUERY_STRING'])
p = sub.Popen(['/bin/bash', '-c', str_command], 
     stdout=sub.PIPE, stderr=sub.STDOUT)
output = urllib.unquote(p.stdout.read())

print """\
Content-Type: text/html\n
<html><body>
<pre>
<!-- UNCOMMENT THE FOLLOWING TO ECHO COMMAND --> 
<!-- $ %s  -->
%s
</pre>
</body></html>
""" % (str_command, output)