PHP漏洞全解(五)-SQL注入攻击

系统 Linux
本文主要介绍针对PHP网站的SQL注入攻击。所谓的SQL注入攻击,即一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据。

SQL注入攻击(SQL Injection),是攻击者在表单中提交精心构造的sql语句,改动原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会造成sql注入攻击。

  SQL注入攻击的一般步骤:

  1、攻击者访问有SQL注入漏洞的站点,寻找注入点

  2、攻击者构造注入语句,注入语句和程序中的SQL语句结合生成新的sql语句

  3、新的sql语句被提交到数据库中执行 处理

  4、数据库执行了新的SQL语句,引发SQL注入攻击

实例

  数据库

 

  1. CREATE TABLE `postmessage` (  
  2.   `id` int(11) NOT NULL auto_increment,  
  3.   `subject` varchar(60) NOT NULL default ”,  
  4.   `namevarchar(40) NOT NULL default ”,  
  5.   `email` varchar(25) NOT NULL default ”,  
  6.   `question` mediumtext NOT NULL,  
  7.   `postdate` datetime NOT NULL default ’0000-00-00 00:00:00′,  
  8.   PRIMARY KEY (`id`)  
  9.   ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT=’运用者的留言’ AUTO_INCREMENT=69 ;  
  10.   grant all privileges on ch3.* to ‘sectop’@localhost identified by ’123456′;  
  11.   //add.php 插入留言  
  12.   //list.php 留言列表  
  13.   //show.php 显示留言  

    页面 http://www.netsos.com.cn/show.php?id=71 可能存在注入点,我们来测试

  http://www.netsos.com.cn/show.php?id=71 and 1=1

  返回页面

 

  一次查询到记录,一次没有,我们来看看源码

  //show.php 12-15行

  // 执行mysql查询语句

  $query = "select * from postmessage where id = ".$_GET["id"];

  $result = mysql_query($query)

  or die("执行ySQL查询语句失败:" . mysql_error());

  参数id传递进来后,和前面的字符串结合的sql语句放入数据库执行 查询

  提交 and 1=1,语句变成select * from postmessage where id = 71 and 1=1 这语句前值后值都为真,and以后也为真,返回查询到的数据

  提交 and 1=2,语句变成select * from postmessage where id = 71 and 1=2 这语句前值为真,后值为假,and以后为假,查询不到任何数据

  正常的SQL查询,经过我们构造的语句之后,形成了SQL注入攻击。通过这个注入点,我们还可以进一步拿到权限,比如说运用 union读取管理密码,读取数据库信息,或者用mysql的load_file,into outfile等函数进一步渗透。

防范方法

  整型参数:

  运用 intval函数将数据转换成整数

  函数原型

  int intval(mixed var, int base)

   var是要转换成整形的变量

   base,可选,是基础数,默认是10

  浮点型参数:

  运用 floatval或doubleval函数分别转换单精度和双精度浮点型参数

  函数原型

  int floatval(mixed var)

   var是要转换的变量

  int doubleval(mixed var)

   var是要转换的变量

  字符型参数:

  运用 addslashes函数来将单引号“’”转换成“\’”,双引号“"”转换成“\"”,反斜杠“\”转换成“\\”,NULL字符加上反斜杠“\”

  函数原型

  string addslashes (string str)

   str是要检查的字符串

  那么刚才出现的代码漏洞,我们可以这样修补

  // 执行mysql查询语句

  $query = "select * from postmessage where id = ".intval($_GET["id"]);

  $result = mysql_query($query)

or die("执行ySQL查询语句失败:" . mysql_error());

 

  如果是字符型,先判断magic_quotes_gpc能无法 为On,当不为On的时候运用 addslashes转义特殊字符

 

  1. if(get_magic_quotes_gpc())  
  2. {  
  3.     $var = $_GET["var"];  
  4. }  
  5.  else  
  6.  {  
  7.   $var = addslashes($_GET["var"]);  

 

  再次测试,漏洞已经修补

责任编辑:xikder 来源: DoDo's Blog
相关推荐

2012-04-12 13:36:59

2012-04-12 14:45:13

2012-04-12 16:05:50

2012-12-19 10:36:06

2012-04-12 15:42:35

2012-04-12 15:59:09

2010-09-14 16:00:16

2012-04-12 15:27:44

2012-04-12 11:28:04

2013-04-26 11:26:00

2019-09-17 10:06:46

数据库程序员网络安全

2013-12-13 10:45:26

2014-02-28 17:29:06

2015-02-04 14:50:29

2011-10-19 10:47:56

2015-12-29 10:41:16

2020-08-07 08:13:08

SQL攻击模式

2009-02-04 16:51:48

2014-11-04 13:43:10

2019-02-22 09:00:00

点赞
收藏

51CTO技术栈公众号