sql注入学习

什么是sql注入

所谓的sql注入就是通过某种方式将恶意的sql代码添加到输入参数中,然后传递到sql服务器使其解析并执行的一种攻击手法

分类

按照传参方式

POST型

GET型

按照注入类型

字符型

有闭合方式,需要进行判断闭合方式,不会执行逻辑运算

数字型

无闭合方式,会进行逻辑运算

按照注入方式

联合注入

当你构建正确的sql语句去查询数据库内容,数据库会将结果回显出来,可以使用union联合注入的方法查询。

报错注入

数据库只会提醒你的sql语句错误,其他的内容都不会回显,但是他在报错中会将数据库的内容一起报出。

解决的方法就是故意构造错误的信息,让他回显出我们想要的值。

盲注

不管输入什么,数据库都没有任何回显。

可以使用报错函数,以及结合length函数,ascii函数和substr函数进行,

时间盲注

不管输入什么回显都一样

可以使用sleep函数进行延时,当输入正确的sql语句数据库会进行判断,导致延时;而错误的sql语句不判断,无延时。

布尔盲注

回显有两种情况,正确的sql语句能回显值,错误的sql语句回显空白。

二次注入

二次SQL注入则是指攻击者在应用程序中注入恶意的数据,然后等待应用程序将这些数据存储在数据库中。当应用程序再次从数据库中读取这些数据时,恶意数据就会被读取出来,并执行恶意操作

堆叠注入

mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔
开,而堆叠注入其实就是通过结束符来执行多条sql语句

DNSLOG注入

sql注入中的重要函数

concat函数

concat函数的作用是将括号中的内容连接起来,例如concat(1,2)输出的值 就为12.

extractValue函数

extractValue函数包含两个参数第一个参数 XML文档对象名称,第二个参数 路径。extractvalue函数可以用做查询,sql语句为:select extractvalue(文档名,参数路径),文档可以是列。

substr函数

substr是一个用于字符串处理的函数,通常用于从一个字符串中提取子串。 函数结构:substr(字符串,起始位置,提取长度)

具体来说:

  • substr 是函数的名称,用于提取子串。
  • (database()) 是作为参数传递给 substr 函数的表达式。在这里,(database()) 表示数据库的名称。数据库的名称可以通过这个函数来获取。
  • 1 是指定要提取子串的起始位置,这里是从第一个字符开始。
  • 1 是指定要提取的子串的长度,这里是提取一个字符长的子串。

因此,substr((database()), 1, 1) 的作用是从当前数据库的名称中提取第一个字符。

举个例子,假设当前数据库的名称是 my_database,那么 substr((database()), 1, 1) 的结果将是 m,即数据库名称的第一个字符。

updatexml函数

updatexml() 函数是在MySQL数据库中用于更新XML数据的函数。它允许你在XML文档中指定路径下更新指定节点的值或属性。

函数结构:updatexml(target_xml, xpath_expression, new_value)

  • target_xml 是要更新的XML文档或XML类型的列。
  • xpath_expression 是用于定位要更新的节点的XPath表达式。
  • new_value 是新的值或属性,用于替换指定节点的内容或属性。

ascii函数

将函数值转化为ascii码

length函数

可以计算出函数值的长度

sql注入的步骤

union注入

  1. 查找注入点
  2. 判断注入类型 使用id=1 and 1=2或者id=2-1,字符型注入是不会进行逻辑运算,而数字型会进行,所以字符型id=2和id=2-1的回显结果是相同的,而数字型是不同的
  3. 如果是字符型,需要找到它的闭合方式 常见方式:' " ') ") 使用注释的方式是另一边符号失去作用:--+,#,%23 在判断闭合方式时,如果输入某个符号后没有报错,那就证明不是该符号闭合;出现报错后用--+,#注释另一边,如果成功回显就是该符号闭合
  4. 判断查询字段数 group by或者order by
  5. 查询回显位置 输入一个数据库不存在的值,使得数据库获取的数值为空,这样他才会显示后面操作的回显位置
  6. 联合查询注入 构建sql语句依次去爆库名,爆表名,爆字段,爆数据。 payload: 爆库语句:union select 1,2,database() --+ union select group_concat(schema_name) from information_schema.schemata--+

爆表语句:union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=数据库名--+

爆字段语句:union select 1,2,group_concat(column_name) from information_schema.columns where table_name='表名'--+

爆数据语句:union select 1,2,group_concat(列名) from 表名 --+

注:前三步只是爆出需要的数据库名,表名,和列名,真正完成输出数据的是最后一步。

报错注入(当你构建正确的sql语句查询却没有回显时)

  1. 查找注入点
  2. 判断注入类型,闭合方式,判断查询字段数 判断方法与之前相同
  3. 构建报错注入 利用报错函数,构建出错误的sql语句,使其回显出正确的值。 payload:and extractvalue(1,concat(0x7e,(执行的sql语句),0x7e))--+ and updatexml(1,concat('~',(sql语句),'~'),1)--+

爆库:union select 1,2,extractvalue(1,concat(0x7e,(),0x7e)) from information_schema.schemata

爆表: union select 1,2,extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='数据库名'),0x7e))--+

爆字段:union select 1,2,extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='表名'),0x7e))--+

爆数据:union select 1,2,extractvalue(1,concat(0x7e,(select group_concat(列名) from 表名),0x7e))--+

布尔盲注

利用三个重要的函数length(),ascii(),和substr()函数;也可以利用这三个函数写一些python脚本,来减少我们输入的步骤,更加利于我们判断,节省时间。

步骤:

  1. 判断注入点
  2. 判断闭合方式,字段数,回显位
  3. 构建sql语句

payload:

?id=1' and length((sql语句))

?id=1' and ascii(substr((sql语句),{n},1)

知识点

  • 当向数据库中输入了一个不存在的数,数据库并不会报错,而会回显为空
  • mysql数据库中存在一些sql注入可以利用的点
  • mysql中一定有information_schema库 ,这个数据库下面会有columns和tables两个表。tables这个表的table_name字段下面包含了所有数据库存在的表名。table_schema字段下是所有表名对应的数据库名。columns这个表的colum_name字段下是所有数据库存在的字段名。columns_schema字段下是所有表名对应的数据库,了解了这些后会对我们进行Sql注入的时候有很大的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值