SQL注入
注入原理
-
参数用户可控:前端传给后端的参数内容是用户可以控制的。
-
参数代入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询,用户能控制输入且输入的内容被带到数据库去执行
手工注入流程
可能存在注入的位置:url参数,POST表单,Cokkie,HTTP头(User-Agent/Referer)
url参数中注释符#,-- ,放在url末尾会被过滤掉,所有注释符一般得编码,-- 编码为--+
第零步:
直接用or 1=1,看能否绕过登录
第一步:
验证注入点是否存在,自己的输入对数据库是否有影响 and1=1
验证注入类型是字符还是数字 1‘
可以用xx<过滤词>xx,看回写判断过滤词
第二步:猜解字段
利用order by 10
第三步 :判断回显位置
利用 -1 union select 1,2,3,4...
第四步:在回显位置放函数,得到想要的信息
信息收集:当前数据库版本,当前所在数据库,当前用户,操作系统
数据注入/高权限注入:
利用union,information_schema常规查询
group_concat()函数 :直接合并全部结果,一次性拿到全部表名(联合注入非常高频用法)
1.提交方法
Get:在url里构造payload,$_GET
Post:在请求体内构造, $_POST
Cokkie:在Cokkie值里构造 $_COKKIE
Request:在任意地方构造都能被接收 $_REQUEST
http头部注入:在 头部注入,比如user-agaent $_SERVER存有访问者的系统信息
2.数据类型
数字型:select * from table where id=1;
字符型:select * from table where userid='1'
搜索型:select * from table where name like '%陈哈哈%' 模糊查询
JSON类型:json格式键值对{ ’user‘:'xiaodi' ,'passws':'xiaodi' }
3.查询方式
通过查询方式与网站应用的方式简单判断注入点后台的数据库查询方式
select 查询数据
在网站应用中进行数据显示查询操作
select * from news where id=$id
insert 插入数据
在网站应用中进行用户注册添加等操作
insert into news(id,url,text) values(2,'x','$t')
delete 删除数据
后台管理里删除文章删除用户等操作
delete from news where id=$id
update 更新数据
会员或后台中心数据同步或缓存等操作
update user set pwd='$p' where id=2 and username='admin'
ordder by 排序数据
一般结合表名或列名进行数据排序操作
select* from news order by $id
4.盲注
后端的数据库语句不会回显
注入过程中,获取的数据不能回显至前端页面,只会提示是否成功,此时我们需要利用一些方法进行判断或者尝试,这个过程叫盲注。
报错盲注-报错回显:
floor,updatexml,extractvalue
利用这些报错函数,在它们的参数中加入一些可以有回显的语句,回显显示在报错语句中
布尔盲注-逻辑判断:
#利用字符截取函数,一个个字符爆
left(database(),1) #left(a,b)从左侧截取 a 的前 b 位
时间盲注-延时判断:
#通过页面加载速度来猜解数据库名字
sleep()延迟执行
if(condion,a,b) 条件成立返回a,否则返回b
例:select * from news where id=1 and sleep(if(dabase()='geek',10,0))
5.注入拓展
加解密
提交方法中传递的参数如果被加密了,比如base64,注入的语句也要进行加密
二次注入
二次注入无法通过扫描工具实现的,需要代码审计的时候才能发现,不好触发,无法在黑盒测试中使用
注入恶意代码到数据库,网站再调用恶意代码拼接到新的数据库语句上,恶意代码就会执行
DNSlog注入
需要注入点是高权限,具备文件读写权限
渗透测试里的反连平台,利用 DNS 解析请求留下日志,专门解决无回显漏洞验证与数据外带问题。
建立一个域名,把这个域名带入payload中,利用load_file()让目标服务器去主动发起一次dns解析请求,dns 平台会记录这一次查询,日志出现记录,证明漏洞注入成功。
把回显放在平台日志中
堆叠查询注入
有局限性,只产生在部分数据库
宽字节注入
利用字符编码差异,网站后端使用了GBK,%df‘中单引号会被转义,变成%df/’,而/的url编码是宽字节,就会破坏转义,使得单引号留下
6.WAF绕过
安全狗,宝塔
核心:绕过方式之间互相配合实现绕过,/**/注释
特殊字符绕过
数据库存在指定特殊字符,写入语句中不影响语句运行
参数污染
Fuzz模糊测试
类似于爆破,通过编写脚本进行批量测试
静态资源注入
IP白名单
url白名单
为了防止误拦,部分 waf 内置默认的白名单列表,如 admin/manager/system 等管理后台。只要 url
中存在白名单的字符串,就作为白名单不进行检测。
爬虫白名单
爬虫持续访问,WAF会开启流量控制,流量过大会拦截,WAF允许官方搜索引擎去爬虫,在爬虫脚本中添加user-agent为百度,搜狐这些引擎,可绕过
数据库特性
7.安全加固
参数化查询:使用数据库提供的参数化查询,将SQL语句与数据关联起来,而不是直接将数据传递给SQL查询。数据库服务器会对SQL语句进行安全处理,避免SQL注入攻击。
输入验证和过滤:
最小权限原则:
定期安全审计和漏洞扫描
--------------------------
MYSQL相关
information_schema库
schemata表
| 字段 | 含义 |
|---|---|
schema_name |
数据库名称(核心!) |
tables表
| 字段 | 含义 |
|---|---|
table_schema |
该表属于哪一个数据库(库名) |
table_name |
数据表的名字(表名) |
columns表
| 字段 | 含义 |
|---|---|
table_schema |
所属数据库名 |
table_name |
所属数据表名 |
column_name |
字段名字(列名,核心) |
函数
database(),
user(),
load_file() 读取文件
into outfile() 写入文件
sleep()延迟执行语句

浙公网安备 33010602011771号