在脚本入侵的过程中,相信每位朋友都面对过表单登陆,特别是管理员后台登陆界面。所以,我今天特别把以前自己在这方面的心得和方法写出来,和大家一起分享。
小知识:表单是用于实现网页浏览者与服务器之间信息交互的一种页面元素,它由表单控件和一般内容组成。它一般包括两个部分:一部分是HTML源代码用于描述表单(例如,域,标签和用户在页面上看见的按钮),另一部分是脚本或应用程序用于处理提交的信息(如CGI脚本)。不使用处理脚本就不能搜集表单数据。表单由文本域、复选框、单选框、菜单、文件地址域、按钮等表单对象组成,所有的部分都包含在一个由标识符标志起来的表单结构中。表单的种类有注册表、留言薄、站点导航条、搜索引擎等。
从大体上来分,如果登陆界面不需要输入验证码的话。我们入侵可以分为两类。一种是爆力破解账号,这是一种最原始的入侵方法,不过成功的机率不是很大。写一个程序,POST提交表单参数再比较返回的页面,就知道是否正确了。当然,账号和密码是以挂字典的方法来破解的(如小榕的溯雪基本原理就是那样),如果管理员的账号和密码不在字典中,那么就永远破解不出来了。所以一般是在实在没有办法的情况下才会出此下策,成不成功都是看运气成分居多。入侵其实是一种实力+运气的最好体现,如何体现自己的入侵能力呢?一起来看看下面的第二种方法。
第二种是通过脚本漏洞入侵,这是比较精彩的地方。我们先一起来分析一下。
如果脚本存在漏洞,那么我们如果要入侵服务器就变得就相对简单一些。登陆表单永远是和数据库紧密的联系在一起的,拿到数据库的账号和密码就可以成功登陆了,而通过注入当然可以拿到账号和密码。这也是一种方法,不过如果要更灵活的运用,我们用不着那么麻烦,来看看最古老的方法吧。
从单引号着手。如果没有过滤单引号,那么我们在账号和密码输入框中输入“’ or ‘’=’(不包括引号,下同)”,多数情况下可以进入后台(是谁发现这个漏洞的?实在太经典了,让人受益非浅)!为什么说是没有过滤单引号的时候是“多数”情况下可以进入呢?意思是还有少数情况不能进入?对,这也将是我们今天分析的重点。先让大家来看看我的分析吧。GO……
通过“’ or ‘’=’ ”进入后台,脚本代码是这么写的,看代码:
……
Dim Usernaem,password,sql
username = request。form(“username”)
password = request。form(“password”)
sql = “select * from admin where username=’”&username&”’ and password=’”&password&”’”
……
直接把表单参数放到数据库中去查询,如果返回不是EOF、BOF,那么登陆就成功,反之不成功。所以我们在账号和密码中输入“ ‘or ‘’=’”放到数据库中去查询,将永远只拿到NOT(EOF OR BOF),也就是永远会存在记录的(除非数据库中没有记录,可能的机会万分之一),当然就顺利进入后台管理了。不过如果脚本不是这么写的,利用这种方法就不会成功。我相信大家一定遇到过这种情况,明明没有过滤单引号,但是利用“’ or ‘’=’”进不到后台。这种情况就是脚本编写人员的另一种编程思路了。再来看我的分析,还是来先看代码:
……
Dim Usernaem,password,sql
username = request。form(“username”)
password = request。form(“password”)
sql = “select password from admin where username=’”&username&”’”
rs。open sql,conn,1,1
if ont (rs.eof or rs.bof) then
if rs(“password”)=password then
……登陆成功
end if
end if
……
看完了代码,你应该明白其中的思路了吧?脚本编写人员先在数据库中去查找表单中提交的用户名,找到后再把数据库中的密码和表单中提交的密码相比较,如果表单中输入的密码和数据库中的密码相同,那么就登陆成功。
面对这种情况,我们也是有办法的。想想表单参数中的账号参数是没有过滤单引号的,那么我们输入“‘ or ‘’=’”会找到一条记录。脚本会取回找到的这条相应记录的密码再和我们输入的密码进行比较,现在我们关键就是不知道密码是多少了!用“’or ‘’=’”永远是取的数据库的第一条记录,我们可以改变他的顺序取到我们想要的记录!看下面的一个表:
----------------------+-------------------,
username password
----------------------+------------------
Test 123456
admin admin123
ms mszr
…… ……
上面是管理员表的记录,采用“’or ‘’=’”取得的是第一条记录,如果我们在账号中输入“‘ or password=’admin123’ and ‘’=’”,如果密码是正确的得到的相应记录就是第二条记录,再在密码中输入admin123我们就成功的进入了后台。不过这样做的前提是知道了密码,对于我们来说也有一定的困难,但是这也是一种思路,比如对方如果采用MSSQL数据库我们就有机会拿到他的密码,让我们把密码给他爆出来吧。来,在账号中输入“‘ and password>1 and ‘’=’”,通过爆字段值的方法,在IE中就返回了密码的值。现在有了密码就可以通过上面的方法进入了。再来换个思路,我们一样可以拿到账号名字,上面已经拿到密码了,现在我们就来拿他的账号吧,一样通过爆字段的方法来拿。输入“‘ or password=’admin123’ and username>1 and ‘’=’”,在IE中爆出了账号,这样账号也就拿到了。有了账号和密码我们就可以名正言顺地进入后台了!
上面我们分析了一大把,现在是时候让我们来消化消化了,多吃不消化可不是学习的好方法。在网上找个登陆入口吧,随便找了一个,我在用户名和密码中先分别输入单引号。
看到上面的提示,大家应该知道这是没有过滤单引号的情况下返回的错误信息,再进一步看看是哪个参数没有过滤。我现在只在账号中输入单引号,密码不输入,返回同样的结果。证明至少表单中的账号参数是没有过滤的。再来看看表单中密码参数是否过滤了,我现在在账号中输入1234,密码中输入一个单引号。返回用户名不存在的提示。
证明密码字段是过滤的,要不然就是根本没有放到数据库中去查询。
小提示:一般说来账号没有过滤,密码也不会过滤,很多实际的情况下是先到数据库中去取回相应账号的密码,再进行比较。
就按照第二种方法的思路,我们先拿一个密码吧。密码字段是多少?80%都可以猜到的。先看看网页表单的源代码,看看那个密码框的名字“name=password”试试“password”,在账号中输入“’ and password>1 and ‘’=’”,提示“password”不是有效的字段名,看来不是这个,换换常用的试试“userpassword”,输入“’ and userpassword>1 and ‘’=’”,好了,爆出密码竟然是:“fuckusa(呵呵,很爱国啊!我绝不会黑了它,测试好我就闪人,随便给管理员写封EM,提醒下注意安全)”,现在我们来拿账号吧,在账号框中输入“’ or userpassword=’fuckusa’ and username>1 and ‘’=’”直接爆出账号了,证明我们字段名是猜对的。账号是“admin”,现在我们拿着账号的密码来登陆吧!OK,成功返回管理页面。