• 技术文章 >后端开发 >php教程

    PHP漏洞之SQL注入攻击简单介绍_PHP教程

    2016-07-13 17:11:24原创449
    SQL注入是一种攻击,允许攻击者增加额外的逻辑表达式和命令,以现有的SQL查询,种攻击能够成功每当用户提交的数据是不正确验证,并粘有一个合法的SQL查询在一起,所以说sql注入攻击并不是php的问题而程序员的问题。


    SQL注入攻击的一般步骤:

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

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

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

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

     实例

      数据库

      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 显示留言

      页面 /show.php?id=71 可能存在注入点,我们来测试

      /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等函数进一步渗透。

    防sql注入方法

    $id = intval ($_GET['id']);

    当然,还有其它的变量类型,如果有必要的话尽量强制一下格式。


    字符型参数:

    运用 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"]);

      }

    ]


    SQL语句中包含变量加引号

    SQL代码:

    代码如下 复制代码

    SELECT * FROM article WHERE articleid = '$id'

    SELECT * FROM article WHERE articleid = $id

    两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,因此,我们要养成给SQL语句中变量加引号的习惯。

    3. URL伪静态化

    URL伪静态化也就是URL重写技术,像Discuz!一样,将所有的URL都rewrite成类似xxx-xxx-x.html格式,即有利于SEO,又达到了一定的安全性,也不失为一个好办法。但是想实现PHP防SQL注入,前提是你得有一定的"正则"基础。

    4. 用PHP函数过滤与转义

    PHP的SQL注入比较重要的一点就是GPC的设置问题,因为MYSQL4以下的版本是不支持子语句的,而且当php.ini里的magic_quotes_gpc为On时,提交的变量中所有的 " ' "(单引号)、" " "(双引号)、" "(反斜线)和空字符都会自动转为含有反斜线的转义字符,给SQL注入带来不少的阻碍。

    5. 用PHP的MySQL函数过滤与转义

    PHP的MySQL操作函数中有addslashes()、mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符或可能引起数据库操作出错的字符转义。

    那么这三个功能函数之间有什么区别呢?下面我们来详细讲述下:

    ① addslashes的问题在于黑客可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,称为一个有效的多字节字符,其中0xbf5c仍会被看做是单引号,所以addslashes无法成功拦截。

    当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。

    另外对于php手册中get_magic_quotes_gpc的举例:

    代码如下 复制代码

    if(!get_magic_quotes_gpc()){ $lastname = addslashes($_POST['lastname']);}else{ $lastname = $_POST['lastname'];}


    最好对magic_quotes_gpc已经打开的情况下,还是对$_POST['lastname']进行检查一下。

    再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:

    代码如下 复制代码
    function daddslashes($string, $force = 0, $strip = FALSE) {
    if(!MAGIC_QUOTES_GPC || $force) {
    if(is_array($string)) {
    foreach($string as $key => $val) {
    $string[$key] = daddslashes($val, $force, $strip);
    }
    } else
    {
    $string = addslashes($strip ? stripslashes($string) : $string);
    }
    }
    return $string;
    }

    命令1 - 写任意文件

    MySQL有一个内置的命令,可用于创建和写入系统文件。 此命令的格式如下:

    代码如下 复制代码

    mysq> select "text" INTO OUTFILE "file.txt"

    此命令的一个大缺点是,它可以被附加到一个现有的查询使用UNION的SQL令牌。

    例如,它可以被附加到下面的查询:

    代码如下 复制代码

    select user, password from user where user="admin" and password='123'
    结果查询:

    select user, password from user where user="admin" and password='123' union select "text",2 into outfile "/tmp/file.txt" -- '

    作为对上述命令的结果,在/ tmp / file.txt文件将被创建,包括查询结果。
    命令2 - 读任意文件
    MySQL有一个内置的命令,可以用来读取任意文件。 它的语法很简单。 B .我们将利用这个 b命令计划 。

    代码如下 复制代码

    mysql> select load_file("PATH_TO_FILE");

    Web shell

    Webshell是polpular并广泛用于执行在Web浏览器从shell命令的工具。 .有人称之为这些工具的PHP炮弹。 我们将创建一个非常简单的webshell,将执行shell命令。

    下面是执行的代码PHP的一个非常基本的外壳是将(参数通过加利福尼亚 ):

    代码如下 复制代码

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/629607.htmlTechArticleSQL注入是一种攻击,允许攻击者增加额外的逻辑表达式和命令,以现有的SQL查询,种攻击能够成功每当用户提交的数据是不正确验证,并粘...

    php入门到就业线上直播课:查看学习

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    千万级数据并发解决方案(理论+实战):点击学习

    Mysql单表千万级数据量的查询优化与性能分析

    Mysql主从原理及其在高并发系统中的应用

    专题推荐:PHP 漏洞 SQL 注入 攻击 简单 介绍 SQL 注入 一种 攻击 允许 攻击者 增加 额外 逻辑 表达
    上一篇:Apache Reference Manual (2)_PHP教程 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 工具包分享:PHP实现滑块验证图片• Symfony2函数用法实例分析,symfony2实例分析_PHP教程• Drupal读取Excel并导入数据库实例_PHP教程• PHP中的SimpleXML处理_PHP教程• PHP页面跳转与跨站提交伪造Referer地址来源_PHP教程
    1/1

    PHP中文网