到目前为止,玩这个小游戏并过关的人数已经达到了81人,首先Monyer要感谢各位的捧场与支持。继续上次的《Monyer's Game 6~10关过关方法》,我们来看剩下几关的过关方法。
但正像我之前说的:通关时只需要一种方法,但通关的思路却有无数种。所以有不同通关思路的朋友,请一定不要吝惜,把思路共享给大家,这样我们都会进步,Monyer这里谢过!
10-11关:
进入第十关,你看到的是:当前用户身份为不是admin,无法显示下一关密码。
学过动态网页语言的朋友都知道,一般的身份验证方式有session和cookies两种,我们先来看看cookies。
一般查看并更改cookies的软件就是IECookiesView了,我们打开这款软件并查找“www.monyer.cn”,会看到键名为“username”,键值为“simpleuser”(英文翻译为:普通用户)。
我们在其上点击右键选择编辑cookies,将simpleuser更改为admin,关闭浏览器并重新打开第十关,这时便发现身份已经是admin了,密码也在眼前——这就是Cookies欺骗了。当然还有其他的方式,譬如抓包后,更改,用NC提交等等。
{
javascript:alert(document.cooke)
javascript:alert(document.cookie="username=admin")
}
11-12关:
进入11关,提示很简单,但已经说明了一切:你的session不是admin,不能查看下一关密码 。
那怎么来更改session呢?入侵服务器?(Monyer很震惊的是,的确有人这么想的,也这么做了——因为从客户端,session是无法更改的。)
这时我们不妨把源代码打开看看:
function check(){ window.location.href="?check="+textfield.value;
并不是之前的直接转向,而是做了一个验证。那么我们随意输入些信息看看,当点击提交后,首先显示了“密码错误”,然后似乎又转回了本页。
但事实上页面已经经过了些许的改变——url地址增加了些东西:set_session=login_false
如果从英文意思上,你应该能看出为:设置session值为登陆失败。所以你几乎不需要多想就该猜出,如果设置session为登陆成功的话,那么真正的session就会设置成为admin。
我们将url参数改为set_session=login_true来试试。
怎么样?密码是不是出来了?
12-13关:
进入12关,提示为:请进入第13关:16315714214514116516415114616515456141163160
这个是8进制编码嘛,我们用monyerjs解密一下看看,为:sobeautiful.asp,但你凭直觉也应该知道不可能这么简简单单的。
我们在密码框输入sobeautiful.asp或者sobeautiful时,没有出现转向,输入的密码会原封不动返回回来。而如果我们直接请求sobeautiful.asp页面会发现返回的第13关为:本页禁止盗链!
所以你应该知道,这个是12关-13关,而不是13关-14关。
什么时候会被认为是盗链呢?无非是从外站访问嘛!估计很多人下载软件时都遇到过这个问题(特别是天空),而解决办法就是到它的网站找链接下载。所以本关即使如此,你需要在本站上构造一个链接进入第13关(当然你也可以通过改数据包)。
那么12关直接返回信息则是有目的的了——返回你输入的一切东西(XSS的一点点思路)。
所以我们可以进行如下构造:<a href="sobeautiful.asp ">in</a>
然后提交,发现的确没有过滤就返回一个链接。
点击链接后,我们则进入了13关。
13-14关:
13关没有任何提示,输入密码时会提示“密码错误!”,所以我们只能从源代码看个究竟:
发现有特殊代码如下:
<!--
dim connect
Response.Expires=0 '系统数据库连接
Set connect=Server.CreateObject("ADODB.Connection")
connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.MapPath("/Database.mdb") & ";Mode=ReadWrite|Share Deny None;Persist Security Info=False"
set rss=server.createobject("adodb.recordset")
sqlstr="select password,pwd from [user] where pwd='"&request("pwd")&"'"
rss.open sqlstr,connect,1,1
if rss.bof and rss.eof then
response.write("密码错误")
else
response.write(rss("password"))
end if
rss.close
set rss=nothing
connect.close
set connect=nothing
-->
这是一段asp数据库查询代码,懂SQL注入的朋友一眼就看出pwd没有经过任何过滤就递交到了数据库的查询中了——最典型的SQL漏洞。
所以我们当然要用最经典的注入语句了——“'or''='”。
Monyer简单解释一下这个利用,把它放进select语句中,即是:
select password,pwd from [user] where pwd=‘‘or’‘=''
所以整个语句变为了:选择password和pwd在user表中当pwd等于空或者空等于空。那么这个语句是真命题,所以可以顺利执行并返回给我们password。
(注意,实际上关卡里并没有涉及到数据库,这个地方是SQL注入模拟而已,所以当我在Google Analytics看到有些人想通过此来注入我的网站时,感到挺有意思)
我们提交'or''=',密码即刻出现,我们输入密码即可来到14关。
14-15关:
14关是一个crackme程序,用delphi写的,并用upx做了简单的加密。总的说这个crackme算是世界上相当简单的了。Monyer这里讲一下最简单的“破解”方法。
先脱一下壳,然后直接拉到Ollydbg里,选择插件里的字符串参考。
你几乎还没有开工,就已经看到了16位的密码(monyer的md5,嘿嘿),以及下一关关底的页面url了。
15关关底:
为了防止作弊,这关做了简单的验证——第十关的cookies和第十一关的session。如果有其一不正确将会显示:
虽然你最终没能把cookies设为admin
虽然你最终没能把session设为admin
但恭喜您已经通关!
如果正确,你就可以输入你的大名和想留下的脚印儿了。
好了,到此为止,Monyer's Game所有关卡通关方法解释完毕!
做这个游戏不是要难倒谁,也不是要大家都看着通关方法过去,而是希望大家能自己动手并真真正正地学些东西,这也不枉我的一番苦心!
最后还是要再次感谢大家的支持,以及LCX大哥等人提供的建议,以及NP大哥提供的空间,一并谢过!
Monyer !