好啦,让我们开始今天的揭秘吧。
我今天选择的是微软的IE10浏览器,主要原因是IE内置了一个开发人员工具(你也可以选择类似的小工具,如:HttpWatch),打开方式为:工具----->开发人员工具(或者直接在打开网页后按F12)。强调:此类工具仅仅是为了辅助我们的工作而已,在理解原理的基础上使用工具往往能起到事半功倍的作用哟!!!土夫子团队也希望各位亲们不要痴迷于所谓的黑客工具。最后打开后的样子如图1
1.Jpg
接下来就是打开那个我们又爱又恨的页面了,湖大教学服务系统网址:http://hdjw.hnu.cn/default.aspx
如图2
2.Jpg
作为湖大教务系统的替代品,教学服务系统初看还是不错的,我们今天需要专注的一块内容就是用户登录的模块,如图3
3.Jpg
揭秘肯定离不开网页的源码,在页面空白处右键----->查看源(不同版本的浏览器,命名不一样),一大片网页的源码映入我们的眼帘,在这里,我就不直接粘贴了,很多人在看到此类页面后肯定已经hold不住了,登录按钮的定义在哪里?它的处理机制是什么样的?揭秘如何下手呢?一连串的按钮跑进我们的脑子里。显然我们需要了解按钮按下的那一瞬间到底发生了什么,于是我们开始使用开发人员工具探测一下当我们点击登录时到底发生了什么,在这之前先对工具进行设置,使其处于启用状态,在开发人员工具,如图4
4.Jpg
选择网络选项,如图5
5.Jpg
然后就是选择开启捕获,这里我就不截图了哟。接下来按下用户登录模块的登录按钮,让我们瞧瞧这期间到底发生了什么事情,哈哈。如图6
6.Jpg
首先页面传来了“验证码错误!登录失败!”的噩耗~~哦,多么痛的领悟~~
还是转向我们的开发人员工具吧,看看它能给我带来什么好消息。如图7
7.Jpg
开发人员工具告诉我,在我点击登录按钮后,发生了两件“你不知道的事”,一个post请求,一个get请求,除了部分准站长们,很多人肯定对这两个请求的概念仍然不是很清楚的,所以在进一步探索之前,我先简单的介绍下这两个概念。
{
http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
}到目前为止,我知道了,其实登录模块的处理会直接进入/_data/index_login.aspx这个页面,在网页代码中,链接值为"/a/b.html"表示此页面的前面是网站的根目录(也就是网站的主域名),如IT百问的主域名是:http://www.itbaiwen.com,那么按钮链接"/a/b.html"的全部链接值就是:http://www.itbaiwen.com/a/b.html,大家大概了解了吧。那么我据此就能知道,我们的登录模块的处理页面就是(湖大教学服务系统的主域名为:http://hdjw.hnu.cn):http://hdjw.hnu.cn/_data/index_login.aspx
那么我们就进入这个页面吧,如图8
8.Jpg
我们的教学服务系统一下子回到了“原始状态”,首先大家可以尝试下在此页面下进行登录的操作,不出意外,我们仍然能够顺利进入系统,这也完全符合我们的设想,既然找到了这么重要的页面,这个页面的信息我们肯定是得好好“窥探”一下的啦。再次查看源码,最最头疼的地方到了,我们需要在此源码中找到一些关键信息,如果你和我一样对于网页还算熟悉的话,那么你会很容易就能定位到定义几个输入框以及登录按钮的标签位置(在网页中我们称它们为标签,相当于一个个控件嘛),并且这一个个控件对于我们来说都是至关重要的,因为这之后我需要强行的对他们进行初始化操作(现在我们还不需要去了解,都是很“久远”之后的事啦),以下是这几个关键控件的html代码(我对于一些无关紧要的样式定义属性进行了删除,具体可查看你的那份源码):
<formid="Logon"onsubmit="returnChkValue();"action="index_login.aspx"method="post">
<inputid="pcInfo"type="hidden"name="pcInfo">
<inputid="typeName"type="hidden"name="typeName">
<inputname="UserID"id="UserID"type="text"onmouseover="this.select()"/>
<inputid="PassWord"onclick="this.value=''"type="password"name="PassWord">
<inputid=cCodename=cCode>
<imgid="imgCode"src="../sys/ValidateCode.aspx"onclick="changeValidateCode(this)"alt="单击可更换图片!">
<inputtype="submit"value="">
让我们好好了解一下这几个标签
LogOnform表单:用来提交我输入的学号、密码、验证码的表单
pcInfohidden字段:用来告诉服务器处理程序用户电脑的相关信息(如:操作系统版本、浏览器版本等等)
typeNamehidden字段:用来告诉服务器当前登录的用户是什么类型的(学生、老师、管理员......)
UserID输入框:用来给用户输入学号
PassWord输入框:用来给用户输入密码
cCode输入框:用来给用户输入验证码
imgCodeimage图片显示标签:显示验证码
submit提交按钮:采取提交动作的按钮
{
http://www.cnblogs.com/RascallySnake/archive/2010/07/27/1786160.html
}
{
http://zh.wikipedia.org/wiki/跨網站指令碼
}
大家也可以自行探索一下我们的教学服务系统有没有此类的XSS漏洞(*)
既然如此,我们不能通过url直接进行访问那么我们只能自己做一款登录器,最“装13”的登场了!!!
我暂且叫它“山寨湖大教学服务系统”吧。我选取的软件形式是windowsform程序,因为在此基础上的程序的.net版本未被很严重的阉割,这样就尽可能的简化了我的开发工作了(实际情况是:我的乖乖,简化个毛线)。
新建完的工程光溜溜的大概就是这样,如图9
9.Png
惨败如斯......
紧接着,我随意拽入几个控件,关于各控件的详细知识在这里我就不作赘述(可能我哪天会再发一篇文章,专门去讲,不过仅仅限于可能),
一个webbroswer(用来载入登录之后网页的控件,用它你甚至可以山寨一个浏览器,不过那真的没什么意思,是吧),一个button(模拟我网页中的submit标签,用来提交表单),三个textbox(分别让我输入:用户名、密码、验证码),一个picturebox(用来装载以及显示网页中的验证码,能够被装载很重要哦,黑客侵入的关键,因为验证码是为了反暴力破解而设计的)。
{
http://blog.sina.com.cn/s/blog_4acbea900100fr7i.html
}
本来我是打算割了这些扩展知识的,不过在反复比较后发现,对于一篇揭秘的文章,更细化的知识可能让读者更容易理解你所说的这些“神秘”的技术。所以如果你仍然不够了解这些的扩展知识的话,我建议你能在最开始的第一遍,通读此文,然后依照我列出的这些知识点自行进行扩展阅读,然后再仔细阅读本文(或许你还能发现本文中很多表述不够严密的地方,我非常希望能够在文章评论中看到此类的友情更正,我也将对你的研究精神表示赞美)。
现在就是构建应用程序的部分了,关于之后构建移动端的教学服务系统,可以说是大同小异,既然在windowsform中能实现,那么windows8、windowsphone甚至是安卓、ios等不采取.net技术的移动系统都是可以实现的。当然关于是否需要制作此类的客户端就牵扯到需求这块了,而本文的落脚点仍然是技术,关于需求分析我们可以在之后的文章中进行讨论。
首先我将对webbroswer控件的url属性进行赋值(可以直接在可视化的设计界面进行填写),将url属性设置为:http://hdjw.hnu.cn/_data/index_login.aspx。
最后的效果大概就是这样(仅仅是功能软件,我在美工方面未进行过多的处理,你懂的~~),如图10:
10.Png
一些最基本的工作到此为止,现在我的webbroswer控件直接载入了我们的登录模块页面,显然这里面有一些很重要的数据可以利用,双击我们的的按钮进入代码页面,我们需要对我们的按钮点击事件进行编辑。
下面是我的基本思路:
1、将用户名输入框中的值自动填入网页的UserID标签中
2、将密码输入框中的值自动填入网页PassWord标签中
3、将验证码输入框中的值填入网页cCode标签中
4、按钮按下完成submit,提交表单,让服务器进行校验
5、将验证码显示控件中载入验证码图片
6、(*一个非常“高富帅”的想法)让密码全自动填写,自动匹配验证码
现在我的思路慢慢成形,对于一个有一定经验的.net编程人员来说,前四个工作还是能很快速的完成的相当,实现的代码如图11
11.Png
我抓取到webbroswer(当然从代码中你可以看到我对我的各个控件进行了命名,这里的hdjwWebClient就是webbroswer控件)中的html文档数据,然后读出我想要赋值的几个节点,按钮按下自动进行赋值,最后提交表单,紧接着我开始进行测试,如图12
12.Png
进展到这里,很显然,有些朋友会发出这样的疑问:既然你的webbroswer都能显示网页,那么,你那些控件不就成鸡肋了吗?
答疑:windowsform中的webbroswer可以很好的完整显示网页,不过移动端就不行了,到了移动端,可能我就只能通过HttpRequest进行请求了,这时候任何的页面我都看不到,其中最重要的肯定就是我们的验证码,而且前面我们还有一个“高帅富”的想法(对于网站来说,这就是一个很可能是致命的漏洞,用户的信息很容易被盗取,私人的信息在现在这个社会就是钱呐),所以在windowsform下看起来是鸡肋的动作,到了移动端就是必须了,移动端的应用程序毕竟会受到系统的制约。
现在一切都能很好的解决了,教学服务系统的最后一道防线就是验证码,之前我已经提到验证码的出现就是为了防止暴力破解的,不过在当今这个技术爆炸的年代,一个网站不去进行安全的创新,迟早会被攻破。当然本次教程不是教大家去攻击教学服务系统,因为从之前的分析看,教学服务系统的安全性还是很值得肯定的,验证码智能识别也是大部分网站的“漏洞”,教学服务系统在验证码这块其实做的也是很出色的,让我们继续看。
在自动破解验证码之前,我首先得有验证码的图片,于是我想当然的将imgCode标签的src属性取了出来,事实证明这是非常愚蠢的,请看我接下来的愚蠢的尝试。
Firsttry:教学服务系统的验证码是取的想对路径(在第一次取得时候),所以第一次取出的src字符串肯定是"../sys/ValidateCode.aspx",如果你的控件能自动将其化为实际的地址,那么我就服了U
Secondtry:我一拍脑门,不就是相对路径吗,我给它变成实际的地址不就成了,有些童鞋此时肯 定笑了,前面刚刚讲完验证码原理,这里你就来犯2,很显然当你进行实际地址访问时,显示出来的验证码就会随机生成,而不是你网页中的那个值。此时可爆粗口骂自己几句,哈哈......
Finaltry:撞墙,本次教程到此结束!!!
当然不可能结束,哈哈。在经历前两次的失败后,我决定对整个页面进行一次遍历,然后将imgCode筛选出来,这时候我需要对webbroswer存的html代码进行更为高级的操作了,关于html操作,我首先想到的是mshtml这样一个dll引用,然后进行之前分析的操作,具体代码如下(本次课堂不是来讲解.net代码的,因为各个语言,各个技术平台都能实现此类的效果,只要你在这类的平台上多花时间,然后在比较熟悉的情况就能“所向披靡”了),如图12
12.Png
我将我的webbroswer作为参数传入GetCodeImage方法,最后用一个Image对象接收,然后将此对象在picterbox控件(我命名的失imgCode)中显示出来代码如图13
13.Png
嗯,不错。到目前为止,我使用了最简单的方式就将验证码抓取到了,虽然走了一段弯路,不过还是值得庆贺的。接下来的难题就是识别图片了,我们再次hold不住了,在这之前,我们先对移动端的情形进行一下模拟,即将webbroswer先隐藏,我们之前只能通过几个控件进行访问,当登录成功是对其进行显示
实现方法,就是先将webbroswer的visibility设置为false,让它不可见,再在程序中进行判断,让其进行显示。
测试一下,非常不错,至少到目前为止我们将它移植到移动端的可行性已经得到证明。接下来我决定先将我们的显示的图片保存在本地以供我们设计的智能识别软件进行识别,保存图片的代码如下:
ImageCode.Save("D:\Code",System.Drawing.Imaging.Format.Gif);
获取到的验证码将会保存在我们本地磁盘D的Code文件夹下。
不过此时我们可能更关注的是作为包含学生私密信息的教学服务系统能否经受住此次验证码智能识别的考验呢?
敬请关注:《“深入浅出”湖南大学教学服务系统之二》