灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2737回复:0

[系统教程]PHP漏洞全解(5)-SQL注入攻击

楼主#
更多 发布于:2011-11-30 13:42
SQL注入攻击(SQL Injection),是攻击者在表单中提交精心构造的sql语句,改动原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会造成sql注入攻击。
  SQL注入攻击的一般步骤:
  1、攻击者访问有SQL注入漏洞的站点,寻找注入点
  2、攻击者构造注入语句,注入语句和程序中的SQL语句结合生成新的sql语句
  3、新的sql语句被提交到数据库中执行 处理
  4、数据库执行了新的SQL语句,引发SQL注入攻击

图片:56_3710_f14a94b1dc30b61.jpg




实例
  数据库
  CREATE TABLE `postmessage` (
  `id` int(11) NOT NULL auto_increment,
  `subject` varchar(60) NOT NULL default '',
  `name` varchar(40) NOT NULL default '',
  `email` varchar(25) NOT NULL default '',
  `question` mediumtext NOT NULL,
  `postdate` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=gb2312 COMMENT='运用者的留言' AUTO_INCREMENT=69 ;
  grant all privileges on ch3.* to 'sectop'@localhost identified by '123456';
  //add.php 插入留言
  //list.php 留言列表
  //show.php 显示留言
  页面 http://www.netsos.com.cn/show.php?id=71 可能存在注入点,我们来测试
  http://www.netsos.com.cn/show.php?id=71 and 1=1
  返回页面

图片:56_3710_51aca801b87006b.jpg




提交

图片:56_3710_0f3970ae367aeed.jpg


一次查询到记录,一次没有,我们来看看源码
  //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转义特殊字符
  if(get_magic_quotes_gpc())
  {
  $var = $_GET["var"];
  }
  else
  {
  $var = addslashes($_GET["var"]);
  }
  再次测试,漏洞已经修补
下一期 跨网站请求伪造

喜欢0 评分0
游客

返回顶部