类型:净安全大小:6.2M语言:多语言【中文】评分:2.0标签:现在下载我们知道网站的后台需要验证用户的输入。如果我们不这样做,用户甚至可以在后台输入一些SQL语句来操作数据库,这是从未真正体验过的。前几天学校举办了‘你最喜欢的辅导员’投票活动,网站估计是针对某个学生团队的。结果我同学破解了这个网站的管理员账号和密码后,我向他询问了原理,了解了他破解的步骤,又重新练习了一遍。感谢我的同学,没有他我不会知道这些,我也不可能有这个博客。本文破解的网址是在http://xgc.nuist.edu.cn/vote/vote_login.asp.可能有活动后,本网站无法打开。也有可能是写这个网站的同学意识到了漏洞的严重性,做了更正,所以这篇文章的内容不适用于这个网站。我整理了详细的破解过程,分享给大家。本文逻辑性强,需要读者耐心阅读。然而,本文讲述了破解步骤,是一个总体思路。如有疑问,请留言,我们会交流讨论:)
网站中是否存在SQL注入漏洞
网站通常包含一个用户表(用户名和密码)和一个管理员信息表(管理员名称和密码)。输入用户名和密码后,一般的做法是在后台执行一条SQL语句,查询是否有对应的用户名和密码。例如,从用户名=' $ username '和pwd=' $ pwd '的地方选择*如果该语句返回true,则登录操作完成。想象一下,如果你在学号和密码的文本框中输入‘或’=‘或’,然后提交。上面提到的SQL语句变成了select * from,其中username=“”或“=”或“”和pwd=“”或“=”或“”,这变成了一个逻辑表达式,表达式包含几个段落,分别是:
1.从username='' (false)或2的地方选择*号。='(真)或3。’(假)和
4.pwd='' (false)或5。='(真)或6。’(假)
最后,整个逻辑表达式为0|1|00|1|0,这个结果为真(当‘0 | 1 | .’是执行的,它不是在整个表达式的省略号中计算的,因为' or '之前已经是true了),所以可以成功登录,而实际上,可以成功登录。
二、破解后台数据库的原理
在用户名和密码文本框中输入“或”=“或”。从上面显示的第二步开始,表达式值为真。因为它后面紧跟着一个‘或’,不管它后面的表达是什么,‘真的还是假的’‘真的还是真的’都是真的。该键是“或”=“”,“=”在“或”的中间始终为真。如果我们把这个'='变成一个SQL表达式,如果这个表达式是真的,那么整个表达式就是真的。以下步骤要求在用户名和密码文本框中输入相同的文本。原因是:后台的语句格式可能是从用户名=' $ username '和pwd=' $ pwd '的地方选择*的。也可以从pwd=' $ pwd '和username=' $ username '中选择*。无论哪种情况,只要用户名和密码的输入文本相同,只要文本中包含的SQL表达式为真,那么整个表达式就是真的。这种写法带来的另一个好处是复制粘贴方便。通过编写一些SQL表达式,可以反复测试数据库中的内容。
第三,获取后台数据库的表名
如果将表达式替换为(SELECT COUNT(*) FROM表名)0,则该表达式用于获取表中有多少条记录。您需要做的是猜测表名是什么。如果你猜的没错,那么这个表中的记录数肯定不会等于0,那么这个表达式的值就是真的。只有几个常用的表名,所以逐个尝试,最后找到一个名为admin的表,它的字段不是
第四,获取后台数据库表的字段名
现在我们知道这个表叫做admin,我们将尽力获取这个表中的字段。将表达式替换为(从admin中选择count (*),其中LEN(字段名)0)0。此表达式用于测试管理表是否包含此字段。Len(字段名)0表示该字段的长度大于0。当该字段存在时,LEN(字段名)0始终为真。如果包含这个字段,那么整个SELECT语句返回的数字肯定不是0,也就是说整个表达式为真,从而得到字段名。根据这种方法,通过猜测获得三个关键字段3360 ID、admin和pass。
5.获取字段的长度
目前得到的信息是有一个管理表,有ID、admin、pass字段。用户名和密码存储在后台。传统的方法是存储它们的MD5加密值(32位)。现在测试是否是这样。
表达式被替换为(从admin中选择count (*),其中len(字段名)=32)0,替换admin和pass的结果为true,这意味着加密的32位字段用于在后台存储管理员帐户和密码。
6.获取管理员帐户和密码
MD5加密字符串包含32位,只能由0-9和a-f. 1组成。获取管理员帐户,并将表达式更改为(从admin中选择count (*),其中left (admin,1)=' a') 0,这意味着我猜一个adimin帐户的第一个字符是a,如果成功,则表达式保持不变。如果失败了,把A换成0-9和B-F中的任意一个字符,继续尝试,直到成功。如果成功,我会继续猜测这个账号的第二个字符。如果第一个字符是5,我猜第二个字符是A,那么将表达式更改为(从admin中选择count (*),其中左(admin,2)='5A')0。可以发现,字符串中LEFT()函数中的1变成了2。另外‘5A’代码左边两个字符是5A,其中5个已经确定。反复猜测,直到得到整个32位MD5加密字符串。2.为什么需要获取账户对应的id?原因如下:可以根据前一个获取账号和密码,但是一个表中可以有多个管理员账号和密码。它们怎么对应?传递id是必要的。一个id对应一条记录,一条记录只有一对匹配的账号和密码。将表达式更改为(从左边的admin中选择count(*)(admin,1)=' 5 '和id=1) 0。前一个假设一个账号的第一个字符是5,只要这个表达式中的‘且ID=1’是正确的,那么就可以知道这个账号的ID是1。如果不是1,换成其他数字,一个一个试。3.获取账户对应的密码。现在你已经猜到了一个管理员的账号,知道了对应的id是什么(假设是4)。现在你只需要得到这个记录中记录的密码是什么。同样,将表达式更改为(从admin中选择count (*),其中left (pass,1)=' a '和id=4) 0,注意id已经被称为4,现在逐个猜测pass中的第1到第32个字符是什么。该方法与“获取管理员帐户”相同。最后,您可以获得一个32位MD5加密字符串(密码)。
*注:如果手动获取每个字符是什么太麻烦,可以自己用C#编写程序,模拟登录,通过控制一个循环快速获取结果。
第七,把MD5加密的账号和密码变成明文
互联网上一些网站的数据库中存储着大量与MD5加密明文对应的明文。您只需要输入MD5加密字符串就可以知道明文是什么。
八找到网站管理员登录界面
如果找不到管理员登录界面,即使已经有管理员账号和密码也无法登录。对于本网站,提供给普通学生登录的地址为
http://xgc.nuist.edu.cn/vote/vote_login.asp.
猜测管理员的登录地址可能是http://xgc.nuist.edu.cn/vote/login.asp,实际上就是它。
九登录网站后台
十大总结
回头看看这个网站安全性.
如果在用户输入账号密码后进行验证,可能不会发生以下情况.如果数据库的表名没有那么笨,那么如果数据库的字段名没有那么笨,可能就不会发生下面的事情.如果管理员登录地址没有那么笨,也许下面的事情就不会发生了。
如何验证用户输入?最简单的方法是过滤掉用户输入的“符号”。除了这个方法之外,您还可以以参数的形式查询数据库,例如从用户名=“username”和pwd=“pwd”的地方选择*。而不是直接将用户输入的信息插入到数据库查询语句中。如果想增加破解难度,也可以在登录时索要验证码等.地球太危险了。以上都是获取所需信息的查询语句。如果输入DROP TABLE命令,后果不堪设想!以后自己建网站的时候,一定要注意这些问题。