zoukankan      html  css  js  c++  java
  • PHP漏洞全解(五)-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. `name` varchar(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"]);  

    再次测试,漏洞已经修补

  • 相关阅读:
    OS模块功能
    read()、readline()、readlines()区别
    【ML-0-2】矩阵求导-定义法和微分法
    【ML-0-1】矩阵求导-定义和求导布局
    博客园转文章的方法
    风格迁移论文--Arbitrary style transfer in real-time with adaptive instance normalization
    【TF-3-2】Tensorflow-mnist的手写识别
    【TF-3-1】Tensorflow--简单线性拟合
    图像分割简介
    图像表示与图像处理的基本概念
  • 原文地址:https://www.cnblogs.com/pingliangren/p/5586987.html
Copyright © 2011-2022 走看看