所谓 SQL 注入:就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。也就是说用 sql 代码登入你想进的网站,但是你没有账号或密码或是你有一个账号,你就可以用 sql 注入进入相关的网站,提前你想要的信息。
密码 SQL 注入:
比如:我的用户名是:foo 密码是:‘or‘1’=’1
sql 语句在查询时就变成了下面一句话:
"$sql = “select count(*) as ctr from users where username=’foo’ and password=” or ‘1′=’1′ limit 1″;
很明显,现在变成又多了一个条件1=1?只要两个条件有一条符合,就可以返回 1 ,所以 foo 可以在密码为空的情况可以登录网站。
用户名 SQL 注入:
比如:填好正确的用户名 (marcofly) 和密码 (test) 后,点击提交,将会返回给我们“欢迎管理员”的界面。
sql 如下:
$sql=“select * from users where username='marcofly' and password=md5('test')”;
很明显,如果给出正确的用户名和密码就能成功登录网站;但是,如果我们输入一个错误的用户名或密码呢?很明显,登入不了吧。恩,正常情况下是如此,但是对于有 sql 注入漏洞的网站来说,只要构造特殊的“字符串”,照样能够登入成功。
比如:在用户名输入框中输入:’ or 1=1#,密码随便输入,这时候的合成后的 SQL 查询语句为:
$sql="select * from users where username='' or 1=1#' and password=md5('')";
语义分析:“#”在 mysql 中是注释符,这样井号后面的内容将被 mysql 视为注释内容,这样就不会去执行了,换句话说,以下的两句 sql 语句等价:
$sql="select * from users where username='' or 1=1#' and password=md5('test')";
等价于
$sql="select * from users where username='' or 1=1";
因为 1=1 永远是都是成立的,即 where 子句总是为真,将该 sql 进一步简化之后,等价于如下 select 语句:
select * from users;
没错,该 sql 语句的作用是检索 users 表中的所有字段。
有漏洞的脚本才有机会给你攻击,比如一个带参数的删除脚本 a.asp?action=del&id=2 你可以改为 a.asp?action=del&id=2 or 1 这样就有可能删除全部数据—— sql 注入就是通过类似的手段来破坏数据。