web安全学习之路6--SQL注入

本文详细介绍了SQL注入的各种类型及其检测方法,包括整型和字符型报错注入、UNION注入、时间盲注和布尔盲注。通过示例展示了如何利用错误信息获取数据库信息,以及如何通过各种函数和技巧绕过过滤机制。同时,提到了其他类型的注入,如二次注入、Cookie注入等,并探讨了SQL语句的绕过策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.判断sql注入点

  1. 整型数字型报错注入点:使用URL后id=1 and 1=1页面正常显示,id=1 and 1=2,页面报错,则存在整型数字型注入。或者如果id=1跟id=3-2返回的结果是一样的,则说明是数字型注入
  2. 字符型报错注入:id=30’,页面报错,则可能是字符型注入点,但也可能存在括号,双引号注入等。用id=30’ #,返回结果跟id=30,一样,则说明是字符型注入
  3. id =30 order by 3正常,by 4报错,则说明是3列。
  4. 补充:information_schema是mysql系统自带的一个数据库,有三个表,schemata是存储着许多数据库名的表,tables表,存储着表名,指出了这些表分别属于的数据库名,columns表,指出列名分别属于的数据库名和表名

二.其他

  1. 内联注释:mysql一些特殊的sql语句,用/**/来注释掉,使不兼容的数据库类型不能读取,但是mysql本身可以读取该语句
    #三.报错注入:
    利用数据库语句报错显示该有的信息,通常使用mysql_error来查看上次查询语句出现的错误信息。

三.整型报错注入#:

  1. 判断条件:输入 sql语句后,返回的错误信息可以得到我们想得到的一些值。
  2. 什么是整型报错注入:URL中的参数是整数,一般可以比用 单引号来闭合。
  3. 报错函数:
    (1)使用updatexml函数。
    URL?id=1’出现报错,因为单引号未闭合;
    查询user名:’ and updatexml(1,concat(ox7e,(select user()),ox7e),1)
    查询数据库名:’ and updatxml(1,concat(ox7e,(select schema_name from information_schema.schema limit0,1)ox7e),1)
    注:concat函数可以用来连接字符串,遇到特殊字符就会报错,只能爆出32字符,所以需要substr来依次进行报错信息字符串
    limit m,n:m表示起始的位置,n表示几个
    查询表名:’ and updatexml(1,(ox7e,concat(select table_name from information_schema.tables where table_schema=‘test’ limit 0,1)ox7e),1)
    (2)Extractvalue(与updatexml类似的)
    (3)exp函数溢出和按位溢出:
    select ~(select user())返回用户名
    select ~(select version())返回数据库版本
    exp()函数表示e的多少次方,当大于709时,就会报错
    实例:union select 1,2,exr(~(select* from (select version())x))
    (4)floor函数:
    Rand():取随机数 rand(0)2:
    Floor():向下取整数
    Concat():连接字符串
    Count():计算总数 与group by相结合
    select id,count from user group by id.
    实例注入: select count(
    ),concat(version(),database(),floor(rand(0)*2))x form user group by x.
    报错注入绕过
    使用polygon方法进行爆出信息
    #union注入:
    union函数:连接多个select语句,必须保证查询列数相同
    concat:连接字符串,group_concat使用逗号做分隔符,cancat_ws(sep,str1,str2)使用第一个参数做分隔符

步骤:

  1. 判断注入点:id =1’无异常,id=1’ and 1=1无异常,id=1’ and 1=2异常,说明存在整型注入点,还用可能是,单引号,双引号,括号注入点,或者,单引号括号共同,或者双引号括号一起的
  2. 求闭合字符
  3. 求列数:order by函数,通过select * from 表名,可以判断。
  4. 求显示位
  5. 求数据库名
  6. 求表名
  7. 求列名
  8. 求字段名。
    实例分析:
  9. id=1与id=1’结果不相同,id=1 and 1=1与id=1 and 1=2结果不一样->存在sql漏洞
  10. id=1 order by查询列数为3
  11. union select1,2,3,爆出2:3
  12. union select1,database(),3,爆出数据库名
  13. elect table_name from information_schema.tables where table_schema=数据库名 limit0,1 -->得到表名
  14. select column_name from information_schema.colunms where table_schema=数据库名 and table_name=表名 limit 0,1
    需要爆出多个字段名,只需要改变 limit1,1

四.union注入绕过

  1. 过滤了select x from y类似的正则,就需要,将from与y不留空格符号,若3与from不留空格,就会报错,()与from不留空格,不会报错,
  2. 过滤了union等关键字,如果用的srt_ireplace(),可以双写绕过,
  3. or and关键字过滤,使用&&,||来绕过
  4. 空格被过滤,使用+来进行绕过。

五.时间盲注

  1. 使用sleep()函数,通过时间等待的长短来判断,sql语句是否执行
  2. 当数据库所没有要查询的内容,则sleep函数也没有用
  3. substr(string String,起始的位置,所用的长度(lenth)),起始的位置从1数起,不是0
  4. count()函数:
    count(*),返回记录数
    count(列名),返回该列的记录数
    count(distinct 列名),返回不同的记录总数
  5. 基于时间的盲注:
    if(条件,sleep(3),1)条件成立,停三秒
    if(条件,1,sleep(3))条件成立,直接执行。

六.布尔盲注

  1. 判断条件:一般注入的时候,当输入语句时,不会返回任何值,只返回yes或者no。
  2. 在布尔盲注会用到length来得到数据库的长度
  3. substr(字符串,开始的位置,几个字符串),与limit不同的是,开始的位置是1,不是0.
  4. 其他的基本跟union注入差不多,只是要对每个字符进行遍历猜测

其他注入

  1. 二次注入:两张表,一张表上进行注册某个内容,进行sql语句,另一张表上查询,就可以看到sql注入的效果
  2. cookie注入:在http请求包的头部字段名,可以看到cookie处由id=1这种注入点
  3. 宽字节注入:注入语句的单引号被转义了,中间加了一个反斜杠,所以党数据库的编码为GBK时,就可以加上%df来绕过
  4. base64注入:对sql语句进行URL编码等,来绕过
  5. XFF注入:X-Forwarded-for时用来传输客户端IP地址的,可以加上一些SQL语句

SQL语句绕过

  1. 大小写绕过
  2. 双写绕过
  3. 编码绕过
  4. 内联注释绕过

图片笔记

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

看完从0到1的笔记

  1. 基本的URL编码:%20是空格,%27是单引号,%23是#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值