探索

网站万能密码绕过

时间:2010-12-5 17:23:32  作者:休闲   来源:知识  查看:  评论:0
内容摘要:去年冬天,一个做安全测试的朋友给我发来一张截图。某地级市政府信息公开平台的登录框,他在用户名里敲了 `' or 1=1 --`,密码栏随便填了几个字符,回车,直接进了后台。页面上赫然列着三十多个部门的

去年冬天,网站万一个做安全测试的密码朋友给我发来一张截图。某地级市政府信息公开平台的绕过登录框,他在用户名里敲了 `' or 网站万1=1 --`,密码栏随便填了几个字符,密码回车,绕过直接进了后台。网站万页面上赫然列着三十多个部门的密码账号列表。他愣了几秒,绕过然后关掉页面,网站万把漏洞报告提交了。密码

这就是绕过所谓的“万能密码”。它不是网站万某个固定字符串,而是密码一类利用SQL注入漏洞的绕过手段。原理不复杂:很多老系统把用户输入直接拼进SQL查询语句里,绕过比如 SELECT * FROM users WHERE username='[输入]' AND password='[输入]'。如果你在用户名里填入精心构造的片段,就能让这个查询的逻辑变成恒真,数据库返回第一条记录,系统就认为你登录成功了。

最经典的payload是 ' OR '1'='1' --。拆开看:单引号闭合了username字段的引号,OR '1'='1' 让条件永远成立,-- 把后面的密码验证部分注释掉。数据库执行时,WHERE子句变成 username='' OR '1'='1',全表匹配,返回第一行。如果那行恰好是admin,你就成了admin。

但现实比这粗糙得多。我翻过一些公开的漏洞报告,发现很多被“万能密码”攻破的站点,后台数据库里第一条记录根本不是什么管理员——是某个测试账号,甚至是空的。可系统不管这些,只要查询返回了结果集,它就认为认证通过。这种逻辑缺陷比SQL注入本身更致命。

还有一种变体,不依赖注释符。比如用户名填 admin'--,密码随便。查询变成 SELECT * FROM users WHERE username='admin'--' AND password='xxx',密码验证被注释掉,直接以admin身份登录。前提是你得知道admin这个用户名存在。很多系统默认管理员账号就是admin,所以这招命中率不低。

更隐蔽的是利用 OR 加 LIMIT 的写法。有些系统对返回行数有限制,攻击者会构造 ' OR 1=1 LIMIT 1 --,确保只返回一行,避免因为多行结果导致报错暴露更多信息。这种细节说明攻击者不是随便试试,而是针对目标系统做过推演。

防御方法其实很成熟。参数化查询是根本解法,把用户输入当作数据而不是SQL代码的一部分。预编译语句让数据库先解析SQL结构,再填入参数,输入里的引号和注释符就失去了语法意义。ORM框架默认走这条路,但前提是开发者别自己拼字符串。

另一个常见问题是错误信息泄露。登录失败时直接抛出数据库报错,比如“You have an error in your SQL syntax near...”,这等于告诉攻击者注入点在哪、数据库类型是什么。把错误统一成“用户名或密码错误”,虽然用户体验差一点,但安全边界清晰得多。

我见过一些系统加了WAF,能拦 OR 1=1 这种明显特征,但攻击者把payload改成 ' O/**/R 1=1 --,用注释符拆开关键字,WAF就放行了。依赖黑名单永远慢一步。输入过滤可以做,但别把它当唯一防线。

说到底,万能密码能生效,根子上是代码把“数据”和“指令”混在一起了。SQL注入从1998年被首次公开描述到现在,二十多年过去,同类漏洞还在批量出现。不是技术难,是开发节奏快、老系统没人维护、安全测试被跳过。一个登录框背后,可能连着十年前写的、再没人敢动的核心代码。

下次你在登录页面上看到用户名输入框,可以想想:你敲进去的字符,到底是被当成了名字,还是被当成了命令。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap