网络知识 娱乐 网络安全笔记--SQL注入

网络安全笔记--SQL注入

1. 基础

a. 简要明确参数类型
数字,字符,搜索,JSON等

b. 简要明确请求方法
GET,POST,COOKIE,REQUEST,HTTP等

其中SQL语句干扰符号:',",%,),}等

c. 了解常用的注释符
–+可以注释掉前面的引号,- -+可以用#替换,两者的效果相同。
+号在语句中变成了空格。用来和后面的单引号分隔开,将后面的语句注释,了解原理后便知道了–无法使用的原因,是因为–与后面的单引号连接在一起,无法形成有效的mysql语句。
在这里插入图片描述

2. 盲注

盲注主要分为以下四种情况:
回显注入
无回显注入
延时注入
布尔注入

先了解下常用的相关函数,以后会经常用到:

sleep(5)  # 延时执行5秒
mid(a,b,c)  # 从位置b开始,截取a字符串的第c位
substr(a,b,c)  # 从位置b开始,截取a字符串的c长度
left(a,b)  # 从左侧截取a的前b位
length(database())=8  # 判断数据database()名的长度
ascii(x)=97  # 判断x的ascii码是否等于97

盲注就是在注入过程中,获取的数据不能回显至前端页面,需要利用一些方法进行判断或者尝试。
盲注可以分为以下三类:

  • 基于布尔的SQL盲注–逻辑判断
  • 基于时间的SQL盲注–延时判断

if,sleep

# 延时5秒显示结果
select * from users where id=1 and sleep(5);

# if用法,当sex=0时,返回‘女’,当不为0时,返回‘男’
select name,if(sex=0,'女','男') as sex from student;

# 当database名字为mysql时,延时5秒显示结果
select * from users where id=1 and sleep(if(database()='mysql',5,0))
select * from users where id=1 and if(database()='mysql',sleep(5),0)

# 当database名字长度为8时,延时5秒显示结果
select * from users where id=1 and sleep(if(length(database())=8,5,0))
  • 基于报错的SQL盲注–报错回显

floor,updatexml,extractvalue

3. 加解密

4. 二次注入

第一步: 插入恶意数据
第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。
第二步: 引用恶意数据
在将数据存入到了数据库中之后,开发者就认为数据是可信的,在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。

在这里插入图片描述

5. 堆叠查询

堆叠查询简单说就是一堆SQL语句一起执行

在这里插入图片描述

6. WAF绕过

6.1 相关技术

注释符【重要!!!】
在这里插入图片描述
/**/注释符

因为注释符#、-- 都是把后面的语句全部注释掉了,而内联注释/**/则是注释指定部分,需要一前一后闭合,所以在传参那里几乎不做注释语句用,而是用于过滤空格等bypass

在这里插入图片描述

/*! …*/注释符

在mysql中 /*! …*/ 不是注释,mysql为了保持兼容,它把一些特有的仅在mysql上用的语句放在/!../中,这样这些语句如果在其他数据库中是不会被执行,但在mysql中它会执行。

/*!44595union…*/ 表示当mysql数据库版本为4.45.95时执行后面的语句。

在这里插入图片描述

  1. 数据
    加密解密
    编码解码
    等价函数
    特殊符号
    反序列化
    注释符混用

  2. 方式
    更改提交方式
    变异

  3. 其它

Fuzz大法

一种绕过思路,利用脚本,逐个测试,批量化访问地址,类似于爆破

数据库特性
垃圾数据溢出

Http参数污染

浏览器在跟服务器进行交互的过程中,浏览器往往会在GET/POST请求里面带上参数,这些参数会以 名称-值 对的形势出现,通常在一个请求中,同样名称的参数只会出现一次。但是在HTTP协议中是允许同样名称的参数出现多次的。比如下面这个链接:http://www.baidu.com?name=aa&name=bb ,针对同样名称的参数出现多次的情况,不同的服务器的处理方式会不一样。有的服务器是取第一个参数,也就是name=aa。有的服务器是取第二个参数,也就是name=bb。有的服务器两个参数都取,也就是name=aa,bb 。这种特性在绕过一些服务器端的逻辑判断时,非常有用。

在这里插入图片描述

6.2 例子说明

# %23 --> #
# %0A --> 换行符
id=1 union/*%00*/%23a%0A/*!/*!select 1,2,3*/;%23
id=1 union%23a%0Aselect 1,2,3%23
# id=1 union #a
# select 1,2,3#
# Http参数污染 + 特殊符号 + 注释符混用
# %23 --> #
# %20 --> 空格符
# %0A --> 换行符
id=1/**&id=-1%20union%20select%201,2,3%23*/
1/**-1 union select 1,2,3#*/
# 符号/**...*/中起注释作用,正常情况下没有执行,安全狗直接不管,但是有参数污染,真实数据是:
-1 union select 1,2,3#*/

select UAccount,USex,UPassword from t_users union/**select 1,2,3*/
select UAccount,USex,UPassword from t_users union/**select 1,2,3#*/

6.3 常见绕过方式

1. IP白名单
从网络层获取的ip,这种一般伪造不来,如果是获取客户端的IP,这样就可能存在伪造IP绕过的情况。
测试方法:修改http的header来绕过waf
x-forwarded-for
x-remote-IP
x-originating-IP
x-remote-addr
x-Real-ip

2. 静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css等等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求。

3. URL白名单
为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台,只要url中存在白名单的字符串,就作为白名单不进行检测。

正常白名单地址如下:
http://10.10.1.5/../../manager/../sql.php?id=1

可以通过以下方式尝试绕过防御规则:
http://10.10.1.5/.。/sql.php?a=/manager/&b=../etc/passwd/&id=1

7. 写在后面

由于本人初学网络安全,水平有限,更多知识后续会持续补充,让笔记条理更加清晰,易于查阅。