标题: 用Python脚本写ASP页面
作者: Demon
链接: https://demon.tw/programming/python-asp.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
很多不明真相的同学认为 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 开发。
赞赏微信赞赏支付宝赞赏
随机文章:
运行以下VBS脚本:
MsgBox “Hello” & Chr(0) & “World”
只弹出”Hello”。
不在ASP环境中运行,为什么还是截断了呢,VBS遇到Chr(0)也是默认字符串结束的。以前想用VBS编写一个动网的上传漏洞利用程序,用Msxml2.XMLHTTP发送数据包的时候,遇到Chr(0)就把剩下的数据包抛掉了,一直没有什么好办法,Chr(0)的问题确实很麻烦
一、MsgBox在内部调用Windows API函数MessageBox,而MessageBox是以NUL作为字符串结束标识的。
二、问题依然不在于VBS遇到Chr(0)也是默认字符串结束的,而在于Msxml2.XMLHTTP组件,测试如下:
PHP
Python
Perl
通过WireShark抓包发现,以上脚本在HTTP请求中均只发送了Hello,也就是被NUL字符截断了,总不能说PHP、Python和Perl的字符串也是以Chr(0)为默认结束符的吧?
三、准确地说这也并非Msxml2.XMLHTTP组件的问题,问题在于代码提交HTTP请求时没有进行urlencode,urlencode以后是可以发送Chr(0)的。
我之前也是直接MsgBox,看来忽略了最终调用的是MessageBox这个Win32 API原因。看来只要调用了Win32 API免不了要与NULL字符打交道。
效率是绝对的,比vbs和js至少强一半,
甚至和php有的拼。
不过,perlscript效率也很强大,只可惜它们在ASP中都极少应用。
我并不怀疑Python和Perl的效率,我怀疑的是它们的效率在ASP中是否还能发挥出来。
我是说的在ASP环境下。
所以才说效率比不上php
不过只是做的简单测试。
在动网上次漏洞提交的数据包中,关键部分如下:
—————————–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截断。。。。
上传文件的enctype是multipart/form-data,该编码方式兼容NUL字符,不需要urlencode。
你上面给出的数据格式不正确,也许是你省略了。
我测试了一下,用我写的VBS XMLUpload类是可以发送Chr(0)的,你可以试试。
至于Winsock,为什么数据包中出现Chr(0)一定要被截断?Winsock的SendData方法在内部应该是用Windows API函数WSASend或者send来实现的,这两个函数是兼容NUL字符的。
有些糊涂了。
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语言特性给截断了。
这样理解对吗?
这样理解基本正确,如果想更进一步理解的话,可以看一下我写的《VBS字符串的内部实现》。