2018-05-08 漏洞1SQL注入

SQL注入的三种类型:
数字型
分析注入产生的原因:

访问测试地址:

http://192.168.3.35/sql/shuzi/index.php?id=1

输出页面

2018-05-08 漏洞1SQL注入_第1张图片
image.png

查看源码文件







sql注入测试








error:'.mysql_error().'

'); } echo "sql注入测试
"; echo ""; echo ""; echo ""; echo ""; echo ""; ` //遍历查询结果 ` while ($row = mysql_fetch_array($result)) { if (!$row){ echo "该记录不存在"; exit; } echo ""; echo ""; echo ""; echo ""; echo ""; } echo ""; echo "
id标题内容
".$row[0]."".$row[1]."".$row[2]."
sql语句: >".$sql."
"; ?> 点我进入后台       md5解密可以点我

$id=@$_GET['id'];//id未经过滤 接受参数id的值,ID的值没有做任何限制的情况下输出到下面sql语句中并带入数据库进行执行

    if($id==null){

        $id="1";

    }

    mysql_query('set names utf8');

    $sql = "SELECT * FROM sqltest WHERE id=$id";//定义sql语句并组合变量id  

    $result = mysql_query($sql,$conn);//执行sql语句并返回给变量result

操作相当于直接在数据库执行SQL语句,并输出到页面。

SELECT * FROM sqltest WHERE id=1

利用方法:

1.判断方法:

正常访问

2018-05-08 漏洞1SQL注入_第2张图片
image.png

1.单引号直接报错

主要是因为单引号在大部分数据库中作为分隔符,所以当单引号带入数据库内就会导致数据库内sql语句被截断导致数据库错误返回。

2018-05-08 漏洞1SQL注入_第3张图片
image.png

2.and 1=1 和 and 1=2 返回数据不同的判断

(原理:1=1 为true的条件,1=2 为false的条件,and 连接前面查询为真的条件形成 true and true 和 true and false 两种判断。)

2018-05-08 漏洞1SQL注入_第4张图片
image.png
2018-05-08 漏洞1SQL注入_第5张图片
image.png

Or 也是使用上面的方法进行判断,但当在数字后输入or 1=1为永真条件,所以返回应该是所有的数据,or 1=2 返回的为真条件查询的结果。

2018-05-08 漏洞1SQL注入_第6张图片
image.png
2018-05-08 漏洞1SQL注入_第7张图片
image.png

3.加减法判断,加减法的判断主要是用于判断sql注入为数字型和字符型。也可以根据参数后的数字和字符进行判断。

但因为+号在sql语句中有特俗含义所以需要使用url编码%2b 减号则不用。

2018-05-08 漏洞1SQL注入_第8张图片
image.png
2018-05-08 漏洞1SQL注入_第9张图片
image.png

字符型
字符型

源码:









sql







";

  mysql_select_db('test',$conn);

  $sql="select * from user where username = '$name'";

  $result=mysql_query($sql);

  while($row = mysql_fetch_array($result))

    {

       echo "用户ID:".$row['id']."
"; echo "用户名:".$row['username']."
"; echo "用户密码:".$row['password']."
"; echo "用户邮箱:".$row['email']."
"; } mysql_close($conn); //关闭数据库连接 echo "
"; echo "你当前执行的sql语句为:"."
"; echo $sql; ?>

数据库:

-- phpMyAdmin SQL Dump

-- version phpStudy 2014

-- http://www.phpmyadmin.net

--

-- 主机: localhost

-- 生成日期: 2017 年 11 月 01 日 07:19

-- 服务器版本: 5.5.53

-- PHP 版本: 5.4.45

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;

/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;

/*!40101 SET NAMES utf8 */;

--

-- 数据库: `test`

--

-- --------------------------------------------------------

--

-- 表的结构 `user`

--

CREATE TABLE IF NOT EXISTS `user` (

  `id` int(3) NOT NULL AUTO_INCREMENT,

  `username` varchar(10) COLLATE utf8_unicode_ci NOT NULL,

  `password` varchar(32) COLLATE utf8_unicode_ci NOT NULL,

  `email` varchar(32) COLLATE utf8_unicode_ci NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;

--

-- 转存表中的数据 `user`

--

INSERT INTO `user` (`id`, `username`, `password`, `email`) VALUES

(1, 'admin', '3f230640b78d7e71ac5514e57935eb69', '[email protected]'),

(2, 'admin1', 'e10adc3949ba59abbe56e057f20f883e', '[email protected]'),

(3, 'asaass', 'e10adc3949ba59abbe56e057f20f883e', '[email protected]'),

(4, 'asaass', 'asaass123', '[email protected]');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

原理:

$query="select user from users where username='$_GET['name']'"; 

数据库执行的语句为

select user from users where username='name'

当开发人员对用户的输入过滤不严,造成了用户可以通过输入SQL语句控制数据库,就会产生SQL注入漏洞。

基于字符型的SQL注入即存在SQL注入漏洞的URL参数为字符串类型(需要使用单引号表示)

字符注入区别于数字注入的主要区别在于sql语句的闭合

注入的实现在于跳出字符串的限制,实现sql语句在执行

字符型和数字型的区别:

字符:除数字之外都是字符

数字:0-9

两种SQL语句的区别:

数字型: SELECT 列 FROM 表 WHERE 数字型列=值

字符型: SELECT 列 FROM 表 WHERE 字符型列=’值’

注入点的判断:

返回正确和错误进行判断,1=1返回正常页面,1=2 错误返回错误页面。表示存在

username=xxx' and 1=1 --'

username=xxx' and 1=2 --'

或者

uername=xxx' and '1'='1

uername=xxx' and '1'='2

或者

username=admin' or '1'='1     返回其他查询信息

username=admin' or '1'='2     返回正常页面相等  注:返回数据多少判断是否存在
2018-05-08 漏洞1SQL注入_第10张图片
image.png
2018-05-08 漏洞1SQL注入_第11张图片
image.png

搜索型

源码:









搜索型注入







";

  mysql_select_db('test',$conn);

  $sql="select * from user where password like '%$pwd%' order by password";

  $result=mysql_query($sql);

  while($row = mysql_fetch_array($result))

    {

       echo "用户ID:".$row['id']."
"; echo "用户名:".$row['username']."
"; echo "用户密码:".$row['password']."
"; echo "用户邮箱:".$row['email']."
"; } mysql_close($conn); //关闭数据库连接 echo "
"; echo "你当前执行的sql语句为:"."
"; echo $sql; ?>

1.原理:

首先我们看SQL语句:

select * from user where password like '%asaass123%' order by password

执行的sql语句带入字符因为通过%%通配符匹配模糊查询,想要执行SQL语句需要跳出搜索字符的限制。然后构造后执行SQL语句。

2.判断搜索型注入的方法:

1 搜索keywords‘,如果出错的话,有90%的可能性存在漏洞;

2 搜索 keywords%,如果同样出错的话,就有95%的可能性存在漏洞;

3 搜索keywords% 'and 1=1 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=1)看返回的情况

4 搜索keywords% 'and 1=2 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=2)看返回的情况

5 根据两次的返回情况来判断是不是搜索型文本框注入了

%'and 1=1 and '%'='

%' and 1=1--'

%' and 1=1 and '%'='
2018-05-08 漏洞1SQL注入_第12张图片
image.png

你可能感兴趣的:(2018-05-08 漏洞1SQL注入)