用Python脚本写ASP页面

标签: , , , ,

很多不明真相的同学认为 ASP 是一种编程语言,事实上并非如此。ASP 是 Active Server Page 的缩写,意为“动态服务器页面”,是微软公司开发的代替 CGI 脚本程序的一种应用。

ASP 是语言无关的,理论上你可以用任何支持 Active Scripting 的语言来编写,比如 VBScript、JScript、Python、Perl等等,只不过 VBScript 比较常用而已,以至于有些同学认为 ASP 就是 VBS。

前天无意中看到“王晔的流水账”里一篇名为《ASP/VBScript中CHR(0)的由来以及带来的安全问题》的文章,里面有这么一段:

好,我们再来看为什么ASP/VBScript中保留了这个特性,我们知道VBScript是VB(Visual Basic)的一个子集,VB是什么,VB是做Windows应用程序开发的,说到Windows应用程序开发那么就可能会调用到Windows系统的 API,而这些API函数则大多是用C语言编写的,很明显为了VB能够兼容这些API,必然字符串要引入CHR(0)字符也就是vbNullChar,同时也要有C语言字符串处理的特性,就是遇到CHR(0)就标识着字符串结束,无论接下来是什么内容

说 VBS 遇到 CHR(0) 就标识着字符串结束,这我是不认同的,VBS 内部以 BSTR 来表示字符串,而 BSTR 是兼容 NUL 字符的,问题应该出在 ASP 引擎上面。于是就在下面留言,但是从他的回复看,似乎也并不认同我的观点。他的回复太长我就不全文引用了,只引用最后一句

要是能把Python+ASP环境调好可能会更好说明这点。

这就是我写这篇文章的原因,啰嗦了那么多,现在正式进入 Python + ASP 的世界。

首先要配置 Python + ASP 开发环境:

1、下载 ActivePython 2.5.6.10,不要用其他版本;

2、运行 C:\Python25\Lib\site-packages\win32comext\axscript\client\pyscript.py;

3、如果没有安装 IIS 则安装,已经安装的重启 IIS;

4、没有了,就这么简单。很多人配置不好是因为他们使用的是最新版本的 Python,这样只能得到 HTTP 500 Error 而已。

开发环境搭建好了,写个简单的 Python 脚本测试一下吧:

<%@LANGUAGE="Python" CODEPAGE="65001"%>
<%Response.Write("Hello World")%>

在浏览器输入 127.0.0.1,终于看到了熟悉的 Hello world。

然后测试一下到底是 ASP 的问题还是 VBS 的问题:

<%@LANGUAGE="Python" CODEPAGE="65001"%>
<%Response.Write("Hello \x00 World")%>

再次输入 127.0.0.1,很可惜,这次只看到 Hello,完胜。

不知道 ASP + Python 的运行效率如何,有时间可以玩玩 ASP + Python + Django 开发。

随机文章:

  1. MulDiv函数
  2. VBS调用IE对象直接打印网页
  3. 汇编语言中SAR和SHR指令的区别
  4. VBS中没有vbHide常量
  5. 文件属性中“大小”和“占用空间”的区别

11 条评论 发表在“用Python脚本写ASP页面”上

  1. 雨中风铃说道:

    运行以下VBS脚本:

    MsgBox “Hello” & Chr(0) & “World”

    只弹出”Hello”。

    不在ASP环境中运行,为什么还是截断了呢,VBS遇到Chr(0)也是默认字符串结束的。以前想用VBS编写一个动网的上传漏洞利用程序,用Msxml2.XMLHTTP发送数据包的时候,遇到Chr(0)就把剩下的数据包抛掉了,一直没有什么好办法,Chr(0)的问题确实很麻烦

    • Demon说道:

      一、MsgBox在内部调用Windows API函数MessageBox,而MessageBox是以NUL作为字符串结束标识的。

      二、问题依然不在于VBS遇到Chr(0)也是默认字符串结束的,而在于Msxml2.XMLHTTP组件,测试如下:

      PHP


      < ?php $http = new COM('Msxml2.XMLHTTP'); $id = 'Hello' . chr(0) . 'world'; $http->open('GET', 'http://demon.tw/?id=' . $id, false);
      $http->send();
      ?>

      Python


      import win32com.client
      http = win32com.client.Dispatch('Msxml2.XMLHTTP')
      id = 'Hello \x00 world'
      http.open('GET', 'http://demon.tw/?id=' + id, False)
      http.send()

      Perl


      use Win32::OLE;
      $http = Win32::OLE->new('Msxml2.XMLHTTP');
      $id = 'Hello' . chr(0) . 'world';
      $http->open('GET', 'http://demon.tw/?id=' . $id, 0);
      $http->send();

      通过WireShark抓包发现,以上脚本在HTTP请求中均只发送了Hello,也就是被NUL字符截断了,总不能说PHP、Python和Perl的字符串也是以Chr(0)为默认结束符的吧?

      三、准确地说这也并非Msxml2.XMLHTTP组件的问题,问题在于代码提交HTTP请求时没有进行urlencode,urlencode以后是可以发送Chr(0)的。

      • 王晔说道:

        我之前也是直接MsgBox,看来忽略了最终调用的是MessageBox这个Win32 API原因。看来只要调用了Win32 API免不了要与NULL字符打交道。

  2. shirne说道:

    效率是绝对的,比vbs和js至少强一半,
    甚至和php有的拼。
    不过,perlscript效率也很强大,只可惜它们在ASP中都极少应用。

  3. 雨中风铃说道:

    在动网上次漏洞提交的数据包中,关键部分如下:

    —————————–7d4a325500d2
    Content-Disposition: form-data; name=”filepath”

    uploadFace\test.asp█
    —————————–7d4a325500d2

    █代表Chr(0),把uploadFace\test.asp█进行urlencode编码后,发送数据包出错。怎么解决呢?

    http://www.heibai.net/article/info/info.php?infoid=20707,这篇文章使用Winsock发包的,但数据包中出现Chr(0),数据包应该会被截断,但能发送成功,怎么回事?

    • 艳文说道:

      再现00截断。。。。

    • Demon说道:

      上传文件的enctype是multipart/form-data,该编码方式兼容NUL字符,不需要urlencode。

      你上面给出的数据格式不正确,也许是你省略了。

      我测试了一下,用我写的VBS XMLUpload类是可以发送Chr(0)的,你可以试试。

      至于Winsock,为什么数据包中出现Chr(0)一定要被截断?Winsock的SendData方法在内部应该是用Windows API函数WSASend或者send来实现的,这两个函数是兼容NUL字符的。

  4. 雨中风铃说道:

    有些糊涂了。

    MsgBox Len(“Hello” & Chr(0) & “World”) ‘显示长度为11

    strTest = “Hello” & Chr(0) & “World”
    MsgBox Len(strTest) ‘显示长度为11
    WScript.Echo strTest ‘只弹出Hello

    显然VBS中的Len函数的处理方式和C语言中的strlen函数不一样,并不是遇到Chr(0)就认为字符串结束了。

    可不可以这样理解,VBS中的字符串和C语言中的字符数组一样,即使结尾没有Chr(0),程序也可以识别字符串的长度和结尾。VBS语言是可以识别包含Chr(0)的字符串的,只是输出时由于要调用某些C语言编写的API,便被C语言特性给截断了。

    这样理解对吗?

留下回复