【分享】关于网站登录万能密码的说明
本帖最后由 无限软件 于 2016-7-24 20:16 编辑如果是有一些基本的Web安全知识,都应该了解“'or''='”或“'or''=''or'”网站登录万能密码,实际上,这两个密码是适用于所有含有SQL查询的登录系统中的。
实际应用前景分析
现在这个漏洞因为太过普遍,基本已经都加上了参数分析,所以只能作为投机取巧的手段,不能作为主要方式。
漏洞实现
要知道这是怎么实现的,就要知道查询的SQL语句,这里加上干扰码“.”给出:S.E.L.E.C.T * F.R.O.M tb_name W.H.E.R.E password='{$pwd}'
现在的网站登录基本上都是将用户名和密码代入,查找是否有这个记录,从而判断是否登录成功,那么我们把万能密码填入,这个语句会变成什么样呢?
S.E.L.E.C.T * F.R.O.M tb_name W.H.E.R.E password=''or''=''
我特别标注了几个地方,就从这些高亮的地方入手分析。稍微有SQL知识的都能看出其中奥妙了。
or是SQL关键字,这个有编程知识的都不会陌生,我们列表来看看它的返回值:
逻辑值A逻辑值B返回值R
真真 真
真 假 真
假真 真
这里截取其返回真的三种情况,即or两边有任意一边的值为真,就返回真。
那么我们来看看上面的SQL语句中蓝色背景的部分,空文本等于空文本,必然满足,返回真,or返回真。
WHERE子句是限定返回值用的,但是WHERE后面怎么都是真了,那么就没有返回值限定的作用了,这个SQL查询语句将返回tb_name表中所有的记录。
那么记录肯定是有的,满足条件!登录成功!
漏洞防护
这个漏洞因为比较普及,针对的防护很早就有了,比较常用的是执行查询前使用各编程语言的字符串替换函数把单引号转义或者干脆就换成空文本,忽略全部的单引号。
也就是说,漏洞的关键是单引号。
PS:单引号是SQL中限定字符串(范围)的符号。
学以致用,万能密码变换
知道了实现过程,我们就可以让万能密码多样化,比如用上“<>”(或“!=”)不等于符号,改写万能密码。
万能密码实现的关键是要保证or后面的返回值是真,那就简单了,可以这样写:'or'SQL安全至关重要'<>'及时填补漏洞保障网站安全
因为查询语句中后面是有单引号的,所以我们就不用写了。
看看这个“万能密码”,“SQL安全至关重要”和“及时填补漏洞保障网站安全”当然是不相等的,所以or后面是真,万能密码成立!
总结:SQL安全至关重要,及时填补漏洞保障网站安全!
感谢大家看这份漏洞说明,如果你觉得有用,请评分支持楼主!
这个东西偶尔还是很有用的,第一步就是试这个 1)intval()
2)mysql_real_escape_string()
$query= sprintf("SELECT * from users where id='%d'",mysql_real_escape_string($id));
$result = mysql_query($query);
3)参数绑定
$sql = "SELECT * from users where id=?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $id);//bind param
$stmt->execute();
$stmt->bind_result($id,$text);//bind result 小白不明觉厉,但沙发要占的 后面的万能密码写错了,真是大意,应该是这样的:'or'SQL安全至关重要'<>'及时填补漏洞保障网站安全 貌似不懂,还支持下。 时光遗旧201211 发表于 2016-7-24 20:23
貌似不懂,还支持下。
多学习,多看论坛,慢慢的就能懂啦{:301_991:} 无限软件 发表于 2016-7-24 20:24
多学习,多看论坛,慢慢的就能懂啦
嗯,谢谢 貌似不懂 大致看了一下。。。不明觉厉是大神