竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


65月/100

网站后台万能密码’or’=’or’ 原理

发布在 邵珠庆

很多菜鸟都不知道'or'='or' 为什么可以直接进网站的后台,下面就来解释下给大家吧! 原理是这样的:(以下全部以asp为例子) 很多网站把密码放到数据库中,在登陆验证中一般都用以下sql查询语句去查找数据库, sql=select * from user where username='username'
  很多菜鸟都不知道'or'='or' 为什么可以直接进网站的后台,下面就来解释下给大家吧!
原理是这样的:(以下全部以asp为例子)
很多网站把密码放到数据库中,在登陆验证中一般都用以下sql查询语句去查找数据库,
sql="select * from user where username='"&username&"'and pass='"& pass&'" ,
如果用户提交的用户名密码和数据库里面的一样就让你登录,反之则不行。
这里多嘴两句,or 是一个逻辑运算符,作用是在判断两个条件的时候,只要其中一个条件成立,那么
等式将会成立.而在语言中,是以1来代表真的(成立).那么在这行语句中,原语句的"and"验证将不再
继续,而因为"1=1"和"or"令语句返回为真值.。(其实也好理解,英文or是或者的意思,也就是说
这个或者那个中有一个是对的,那么整句话就对的,那我还管你后面的and甘什么呢?)好了,
我们根据sql这个特性构造一个特殊的用户名和密码来绕过它的验证,就用我构造的那个'or' '=' ,
用户名和密码都是'or' '=',我们来看看放到整个程序中会是什么样子。
sql="select * from user where username=''or' '=''and pass=''or' '='' (注意,or前面和=后面都不是
双引号,而是两个单引号,查询语句里面没有双引号,双引号只是让里面的变量变成字符而已,
我们查询的时候双引号中的变量就被我们提交的数据所代替),好了,现在整句话的意思是:从数
据库的user表中查找的用户名是空(两个单引号之间没东西当然是空了:))或者空等于空。废
话,因为空当然等于空了,所以程序就认为你提交的数据是合法的,于是就放你通过拉and后面
的密码验证都不要了。
有人问我,是不是只有这个'or' '=' 才可以绕过验证呢? NO,you are wrong !
根据这个原理我就可以随便构造我喜欢的语句,比如 aweige' or 'aweige'<>'骆驼
这样放进去就变成了用户名是aweige或者aweige不等于骆驼,废话,aweige当然不不等于骆驼拉
难道还等于骆驼啊??于是就给我放行了。大家也可以根据自己的喜欢去构造这样的语句,我就
不多说了。我想说的是修补方法。

修补方法有两(当然还有别的,这只是我自己常用的):
1,对输入的内容验证
可以加一些脚本来验证客户端输入的内容进行验证
2,特殊字符特别是单引号的过滤。
我们也看到了,上面的构造语句中,都有但引号的存在,也有一些其它的字符,因此,只要我们
把这些东西都过滤掉,系统就会安全一点了。
可以用replace语句对但引号和其他特殊字符进行过滤,比如
replace(username,"'","''") '把单引号转换为两个单引号
replace(username,"<>"," ") '把不等号转换为空
这样的话用户提交的构造语句就没用了。
========
后记
========

1,以上的漏洞只是登录的问题,如果再精心构造,还能得到整个系统的全部数据,我曾用过自
己构造的union语句拿到金梅电影的所有钻石会员和黄金会员,搞得我电影都看不完,大家去仔细
研究学习一下asp和sql数据库查询语言的话可能还会得到比我还多的东西哦
2,现在的系统除了一些比较烂的之外,基本上都已经修补好了这个漏洞,所以,远离知道了,
大家就去学习新的东西,通过别的方法来得到我们想要的东西。