探索

sql注入攻击原理

时间:2010-12-5 17:23:32  作者:热点   来源:焦点  查看:  评论:0
内容摘要:一个登录框,两个输入框,一个按钮。攻击者往用户名里敲了一串引号和分号,数据库就吐出了所有用户的密码哈希。这不是电影情节,是每天在互联网上真实发生的事情。sql注入可能是最老派的攻击手法,却至今仍在ow

一个登录框,入攻两个输入框,击原一个按钮。入攻攻击者往用户名里敲了一串引号和分号,击原数据库就吐出了所有用户的入攻密码哈希。这不是击原电影情节,是入攻每天在互联网上真实发生的事情。sql注入可能是击原最老派的攻击手法,却至今仍在owasp十大漏洞榜单上占着位置——因为它太容易发生了。入攻

原理其实不复杂。击原应用程序把用户输入直接拼进sql语句,入攻然后交给数据库执行。击原就像你写好一张取款单,入攻银行柜员看都不看就把单子上的击原数字照单全收。攻击者只需要在输入框里构造特殊的入攻sql片段,就能让原本该查询一条记录的语句,变成删除整张表、或者导出全部数据的命令。

拿一个典型的例子说话。假设后台代码写了这么一句:
select * from users where name = '{ $username}' and password = '{ $password}';
用户正常输入admin和123456,数据库执行的是“查一下有没有叫admin且密码是123456的人”。但如果攻击者在用户名处输入:
admin' or '1'='1
整条语句就变成了:
select * from users where name = 'admin' or '1'='1' and password = '...';
注意那个or '1'='1',恒真条件。数据库一看,哦,用户名匹配admin,或者1=1成立,那就把第一条符合条件的记录返回。如果表里第一条是管理员账号,攻击者就直接以管理员身份登录了。

更狠的玩法是用union select把别的表的数据拼进来。比如输入:
' union select username, password from users --
双横线把后面的查询注释掉,整个语句变成“查用户表,顺便把users表里的用户名和密码列全查出来”。一次请求,数据库就把底裤翻了个底朝天。

我见过最荒诞的一次案例是在某个政府网站的信息公开栏目里。那个搜索框连基本的过滤都没有,输入一个单引号直接报错,报错信息里把完整的sql语句都打印出来了。这等于把自家保险柜的密码写在门牌上。后来测试人员用sqlmap跑了几分钟,整个后台数据就下载完了。

为什么这类漏洞到现在还杀不完?说白了,很多程序员写代码时默认用户是好人,从没想过输入框里可能藏着恶意代码。字符串拼接sql太顺手了,参数化查询要写预编译语句,麻烦。等到被攻破才后悔,数据已经被拖走卖了。

防御手段倒是现成的:参数化查询是首选,把sql结构和用户输入彻底分开;其次是严格的白名单校验,过滤掉引号、分号、注释符这些特殊字符;再就是数据库权限最小化,就算被注入,攻击者也拿不到删库的权限。但工具再好,人不去用等于没有。

说白了,sql注入攻击的根子不在技术,在人的惰性。每次看到有人还在用字符串拼接sql,我都想摇着他肩膀喊:你省的那几分钟,可能要用几百万条用户数据来还。

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