通过CGI实现在Web页面上执行shell命令

今天无意中发现,URL中的查询字符串,不一定非要是xxx=yyy&aaa=bbb格式,服务器将URL中问号后的查询字符串赋给名为QUERY_STRING的环境变量,然后调用可执行的脚本或二进制文件执行,将其标准输出返回给客户端。

所以我想可以直接把shell命令作为URL输入,返回shell执行的输出。试了下,果然可以。

下面说明一下实现步骤:

1。安装linux与服务器,启动服务器

2。服务器通常会有一个www/cgi-bin的目录,我在这里放一个shell脚本,名为test2

#!/bin/sh
alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
echo -e "Content-type: text/plain\n"
decoded_str=`echo $QUERY_STRING | urldecode`
echo `$decoded_str`

一共就5句:

第1句表示是shell脚本,实际上不加也可以,因为shell是默认的脚本。

第2句我网上抄的,具体原理也不懂,作用是解码URL, 当URL中有空格时,从客户端传过来会变成%20, 20是空格的16进制ASCII码。

第3句是必须的,否则在客户端调用时就出错,是http协议规定的。

第4句就是将URL解码

第5句是执行命令并返回给客户端

然后在浏览器中输入URL:127.0.0.1/cgi-bin/test2?pwd

结果为 /var/www/cgi-bin


这样直接通过URL对用户不友好,但给前端提供了接口,于是我又写了个html文件,放在www/html文件夹中,名为test.html

<html>
<head>
<script>
function httpGet(url)
{
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.open("GET", url, false); // false: wait respond
        xmlHttp.send(null);
        return xmlHttp.responseText;
}
function f()
{
        var url = "http://127.0.0.1/cgi-bin/test2?" 
           + document.getElementById('in').value;
        document.getElementById('out').innerHTML = httpGet(url);
}
</script>
</head>
<body>
<span>command </span><input id='in'></input>
<button οnclick='f()'>send</button>
<br/>
<pre id='out'></pre>
</body>
</html>

两个js函数,httpGet是网上抄的,f是点击按钮的回调函数,主要两句,第1句获取用户输入并加上前缀组成url,第2句调用httpGet函数并将返回输出。

使用时,浏览器中输入127.0.0.1/test.html,效果如图

当然,这样直接把shell接口暴露在外很危险,但这适合给一些在局域网里面的设备作接口,就是嵌入式设备,可以把url做成二维码,直接扫码访问(当然127.0.0.1要改成局域网IP)。

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
在lwIP上实现Web服务器用户认证功能可以按照以下步骤进行: 1. 创建一个登录页面:在Web服务器的根目录下创建一个登录页面,用于接收用户的用户名和密码。可以使用HTML和CSS来设计页面样式。 2. 处理登录请求:当用户在登录页面输入用户名和密码后,将表单数据发送到服务器。服务器端可以使用CGI(Common Gateway Interface)来处理这些请求。你可以编写一个CGI脚本或者使用现有的库来处理登录请求。 3. 验证用户信息:在服务器端,通过比对接收到的用户名和密码与事先保存的用户信息进行验证。你可以将用户信息保存在一个文件或者数据库中。如果验证成功,可以生成一个包含用户信息的会话标识(例如,一个加密的token)并返回给客户端。 4. 保持会话状态:为了保持用户的登录状态,服务器需要将会话标识存储在客户端的cookie中,并在后续的请求中进行验证。你可以使用标准的HTTP cookie机制来实现这一点。 5. 访问控制:在每个需要进行用户认证的资源上,服务器需要验证会话标识是否有效。如果会话标识有效,则允许客户端访问资源;否则,返回一个未授权的错误页面或者重定向到登录页面。 需要注意的是,lwIP本身是一个轻量级IP协议栈,并不提供Web服务器功能。你需要基于lwIP来开发自己的Web服务器或者使用现有的Web服务器库,例如lwIP-contrib中的lwHTTPD或者其他第三方库。同时,还需要熟悉CGI编程和Web服务器开发的相关知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值