网页抓取解密(,文中的逻辑比较强需要读者耐心的看但文本讲述的是破解步骤)
优采云 发布时间: 2022-01-07 07:01网页抓取解密(,文中的逻辑比较强需要读者耐心的看但文本讲述的是破解步骤)
我们知道网站后台需要验证用户的输入。如果不这样做,用户甚至可以输入一些SQL语句来操作后台数据库。从来没有真正体验过这么有趣的事情。前几天,学校做了一个“你最喜欢的辅导员”投票活动,网站估计是为某个学生团队做的,但是我同学破解了这个网站管理员账号和密码,所以我问了他原理,我也明白了他破解的步骤,我又练习了一遍。感谢静同学,没有他我不会知道这些,也不可能有这个博客。
这篇文章破解了网站的URL,有可能是事后这个URL打不开,也有可能是写这篇网站的同学意识到漏洞的严重性,做出了更正,则本文内容不适用于本网站。小编整理了详细的破解过程分享给大家。文章逻辑性比较强,需要读者耐心阅读。但是文中描述了破解步骤,这是一个大概的思路。如果您有任何问题,请留言,我们交流讨论:)
1、网站是否存在SQL注入漏洞?
网站 一般收录一个用户表(用户名和密码)和一个管理员信息表(管理员名和密码)。输入用户名和密码后,一般的做法是在后台执行一条SQL语句,检查是否有对应的用户名和密码,如SELECT * FROM SomeTable WHERE UserName='$UserName' AND pwd='$ pwd',如果该语句返回true,则登录操作完成。
试想如果你在学生号和密码文本框中输入'or'='or'并提交,上面提到的SQL语句就变成SELECT * FROM SomeTable WHERE UserName =''or'='or'' AND pwd ='' or'='or'',这句话变成了一个逻辑表达式,该表达式收录几个段落,分别是:
1. SELECT * FROM SomeTable WHERE UserName ='' (false)
或者
2.'='(真)
或者
3.''(假)
和
4. pwd ='' (false)
或者
5.'='(真)
或者
6.''(假)
最后整个逻辑表达式为0|1|0&0|1|0,这个结果为真(当执行到“0|1|...”时,整个表达式中的省略号不会因为“或” 前面是真的),所以登录可以成功,其实登录也是成功的。
后台数据库破解原理
在用户名和密码文本框中输入'or'='or',如上图第二步,表达式值为true,因为后面紧跟着一个“or”,所以不管后面的表达式是什么是什么,“真或假”,“真或真”都是真的。关键是"or"='or"、"="中间的"="表示一个字符,永远为真。如果我们把这个Change'='改成某个SQL表达式,如果这个表达式为真,则整个表达式为真。
以下步骤要求在用户名和密码文本框中输入相同的文本。原因是:后端语句格式可能是SELECT * FROM SomeTable WHERE UserName ='$UserName' AND pwd ='$pwd',或者SELECT * FROM SomeTable WHERE pwd ='$pwd' AND UserName ='$UserName',在无论哪种情况,只要在同一个文本中输入用户名和密码,只要文本中收录的 SQL 表达式为真,那么整个表达式的公式就为真。这种写法的另一个好处是复制粘贴方便。
通过编写一些SQL表达式,一一测试出数据库的内容。
三 获取后端数据库的表名
如果将表达式替换为 (SELECT COUNT(*) FROM table name) 0 ,则该表达式用于获取表中有多少条记录,您需要做的就是猜测表名是什么。如果你猜对了,那么这个表中的记录数肯定不会等于0,所以这个表达式的值为true。常用的表名仅此而已,一一尝试,最后发现有一个表叫admin,该字段不为空。显然,这个表是用来存储管理员信息的。
四 获取后台数据库表的字段名
现在我们知道这个表叫做 admin,我们将弄清楚如何获取这个表中的字段。
将表达式替换为 (SELECT COUNT(*) FROM admin WHERE LEN(field name)>0)0,该表达式用于测试该字段是否收录在 admin 表中。LEN(field name)>0 表示这个字段的长度大于0,当这个字段存在时,LEN(字段名)>0总是为真,如果收录这个字段,整个SELECT语句返回的数字肯定不是0,也就是说整个表达式为真,获取字段名。
按照这个方法,通过猜测得到三个关键字段:id、admin、pass。
五 获取字段长度
目前得到的信息是有一个admin表,里面有id、admin、pass三个字段。用户名和密码存储在后台。通常的做法是存储它们的 MD5 加密值(32 位)。现在测试是否是这种情况。
将表达式替换为(SELECT COUNT(*) FROM admin WHERE LEN(field name)=32)0,代入admin,传入结果为true,说明后台存储管理员账号和密码加密了最后32 位字段。
六 获取管理员账号和密码
MD5 加密字符串收录 32 位,并且只能由字符 0-9 和 AF 组成。
1. 获取管理员账号
把表达式改成(SELECT COUNT(*) FROM admin WHERE LEFT(admin,1)='A')>0,意思是我猜一个admin账户的第一个字符是A。如果成功,那么表达式成立,如果失败,用0-9和BF中的任意一个字符替换A,继续尝试,直到成功。如果成功,我继续猜测账户的第二个字符,如果第一个字符是5 ,我猜第二个字符是A,然后将表达式改为 (SELECT COUNT(*) FROM admin WHERE LEFT(admin,2)='5A')>0. 可以在字符串中找到LEFT ()函数中的1变成2,'5A'代码左边的两个字符是5A,5已经确定了,反复猜测直到得到整个32位MD5加密字符串。
2. 获取账号对应的id
为什么需要获取账号对应的id?原因如下: 根据上一篇,可以获取到账号和密码,但是一个表中可以有多个管理员账号和密码。它们是如何对应的?需要传递id。一个id对应一条记录,一条记录只有一对匹配的账号和密码。
将表达式改为 (SELECT COUNT(*) FROM admin WHERE LEFT(admin,1)='5' AND id=1)>0, 前面的假设一个账户的第一个字符是5 , 只要这个表达式中的“AND id = 1”是正确的,那么你就可以知道这个账号的id是1. 如果不是1,就一个一个的试另一个数字。
3. 获取账号对应的密码
现在我已经猜到了某个管理员的账号,并且知道对应的id是什么(假设是4),现在只需要得到记录中记录的密码即可。同理,将表达式改为( SELECT COUNT(*) FROM admin WHERE LEFT(pass,1)='A' AND id=4)>0,注意id已经知道4了,现在我们需要猜pass一个通过一、第1到第32个字符是什么?方法和“获取管理员账号”方法一样,最后可以得到一个32位的MD5加密字符串(密码)。
*注:如果觉得手动获取每个字符太麻烦,可以用C#写一个程序,模拟登录。通过控制一个循环,可以快速得到结果。
7.将MD5加密的账号和密码转为明文
互联网上有一些网站数据库,存储了海量(数万亿)明文对应的MD5加密密文。只需输入您需要查找的 MD5 加密字符串即可查看明文是什么。.
八找网站管理员登录界面
如果找不到管理员登录界面,即使您已经拥有管理员的账号和密码也无法登录。对于这个网站,提供给普通学生登录的地址是
猜想知道管理员的登录地址大概就是它了。
九个登录网站后台
十总结
回头看看这个网站安全...
如果在用户输入帐号和密码后进行验证,可能不会出现以下情况……
如果数据库的表名不那么枯燥,也许下面的事情就不会发生了……
如果数据库的字段名不那么枯燥,也许下面的事情就不会发生了……
如果管理员登录地址不是那么傻,也许接下来的事情就不会发生了……
如何验证用户输入?最简单的方法是过滤掉用户输入的符号。除了这种方法,还可以通过参数的形式查询数据库,比如SELECT * FROM SomeTable WHERE UserName ='" & UserName & "'AND pwd ='" & pwd & "',而不是直接插入信息由用户输入到数据库查询语句中。如果想增加破解难度,也可以在登录时要求输入验证码...
地球太危险了。以上都是获取所需信息的查询语句。如果输入的是DROP TABLE命令,后果将不堪设想!以后自己做网站时,一定要注意这些问题。