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

来源:互联网 发布:java 设置特定时间 编辑:程序博客网 时间:2024/05/16 19:03

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

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

下面说明一下实现步骤:

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

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

#!/bin/shalias 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 onclick='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)。

阅读全文
1 0
原创粉丝点击