sql注入知识点

一、sql注入基本知识

1.1什么是sql注入

针对程序员编写时疏忽,通过sql语句实现查询数据,传入webshell等。

1.2sql的原理:

通过构建特殊的输入语句作为参数传入web应用程序,指的是服务器对用户输入过滤不严,导致服务器sql语句被恶意篡改并成功执行例如增删改查等操作,还可以对操作系统执行操作。

SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤。SQL注入是针对数据库、后台、系统层面的攻击。

1.3注释符

# 单行注释 注意与 url 中的#区分,常编码为%23

--空格  单行注释 注意为短线短线空格

/*()*/ 多行注释 至少存在俩处的注入 /**/常用来作为空格

1.4注入条件

有参数传递,带入数据库查询并执行sql语句(可以通过页面发生变化判断,即有回显,若页面不发生变化,可能无漏洞,也可以无回显)

1.5攻击思路

找注入点,判断服务器、数据库类型,判断waf,结合waf情况与不同数据库、服务器的特点进行sql注入攻击

1.6注入流程

是否存在注入并且判断注入类型

判断字段数 order by

确定回显点 union select 1,2

查询数据库信息 @@version @@datadir

查询用户名,数据库名 user() database()

文件读取 union select 1,load_file('C:\\wondows\\win.ini')#

写入 webshell select..into outfile...

补充一点,使用 sql 注入遇到转义字符串的单引号或者双引号,可使用 HEX 编 码绕过

1.7注入分类

SQL 注入分类:按 SQLMap 中的分类来看,SQL 注入类型有以下 5 种:

UNION query SQL injection(可联合查询注入)

Stacked queries SQL injection(可多语句查询注入)堆叠查询

Boolean-based blind SQL injection(布尔型注入)

Error-based SQL injection(报错型注入)

Time-based blind SQL injection(基于时间延迟注入)

1.8接受请求类型区分

GET 注入

GET 请求的参数是放在 URL 里的,GET 请求的 URL 传参有长度限制,中文需要 URL编码

POST 注入 POST 请求参数是放在请求 body 里的,长度没有限制 COOKIE 注入 cookie 参数放在请求头信息,提交的时候 服务器会从请求头获取

1.9注入数据类型的区分

int 整型 select * from users where id=1

sting 字符型 select * from users where username='admin'

like 搜索型 select * from news where title like '%标题%

1.10 数据库类型的区分

MySQL数据库的特有的表是 information_schema.tables , access数据库特有的表是 msysobjects 、SQLServer 数据库特有的表是 sysobjects ,oracle数据库特有的表是 dual。那么,我们就可以用如下的语句判断数据库。哪个页面正常显示,就属于哪个数据库

//判断是否是 Mysql数据库

http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from information_schema.tables) #

//判断是否是 access数据库

http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from msysobjects) #

//判断是否是 Sqlserver数据库

http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from sysobjects) #

//判断是否是Oracle数据库

http://127.0.0.1/sqli/Less-5/?id=1' and (select count(*) from dual)>0 #

MySQL有关的知识。

·  5.0以下是多用户单操作

·  5.0以上是多用户多操做

MySQL5.0以下,没有information_schema这个系统表,无法列表名等,只能暴力跑表名。

MySQL5.0以上,MySQL中默认添加了一个名为 information_schema 的数据库,该数据库中的表都是只读的,不能进行更新、删除和插入等操作,也不能加载触发器,因为它们实际只是一个视图,不是基本表,没有关联的文件。

对于MySQL数据库,information_schema 数据库中的表都是只读的,不能进行更新、删除和插入等操作,也不能加载触发器,因为它们实际只是一个视图,不是基本表,没有关联的文件。

information_schema.tables 存储了数据表的元数据信息,下面对常用的字段进行介绍:

·  table_schema: 记录数据库名

·  table_name: 记录数据表名

·  table_rows: 关于表的粗略行估计;

·  data_length : 记录表的大小(单位字节);

二、基础注入

1.boolean盲注(大于小于等于,二分法)

判断数据库长度,使用length

判断数据库第一个字符,使用ascii(字母),substr

判断数据库中表的个数,使用count

判断表名的长度,使用length

判断表名,使用ascii,substr

判断表中字段个数,使用count

判断表中的第n个字段的长度,使用length

判断数据库中每个表的每个字段的ascii值

我们知道了users中有三个字段 id 、username 、password,我们现在爆出每个字段的数据

判断数据的长度,判断数据的ascii值

2.union联合注入

使用order by判断表的列数

·  version() :数据库的版本

·  database() :当前所在的数据库

·  @@basedir : 数据库的安装目录

·  @@datadir : 数据库文件的存放目录

·  user() : 数据库的用户

·  current_user() : 当前用户名

·  system_user() : 系统用户名

·  session_user() :连接到数据库的用户名

获得数据库,所有的表,所有的列,获得指定表的指定字段的值

使用group_concat将数据联合起来查

3.文件读写

·  当有显示列的时候,文件读可以利用 union 注入。

·  当没有显示列的时候,只能利用盲注进行数据读取。

示例:读取e盘下3.txt文件

union注入读取文件(load_file)

//union注入读取 e:/3.txt 文件

http://127.0.0.1/sqli/Less-1/?id=-1'   union select 1,2,load_file("e:/3.txt")#

//也可以把 e:/3.txt 转换成16进制 0x653a2f332e747874

http://127.0.0.1/sqli/Less-1/?id=-1'   union select 1,2,load_file(0x653a2f332e747874)#

盲注读取文件

//盲注读取的话就是利用hex函数,将读取的字符串转换成16进制,再利用ascii函数,转换成ascii码,再利用二分法一个一个的判断

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值