[13]-SQL注入实战-注入点判断&防御方式判断

一、SQl注入点判断

1.判断关键点

  1. 是否存在SQL注入
    判断注入点
  2. 注入类型?
    构造原始注入语句

2.注入点判断方法

  1. 单引号判断法---经典方法
    如果页面返回错误,则存在
    字符型、整型都可

  2. 构造and 1=1以及and 1=2
    用于数字型注入点,
    示例:

  3. 构造and '1' ='1'以及and '1' ='2'
    用于字符型,
    示例
    image-20230226113255931
    或者构造or

3.判断注入类型

  1. 数字型
    语句类型:

    select * from <表名> where id = x
    # 例如
    select * from user where userid = 1
    

    示例:
    image-20230226112834129

  2. 字符型
    语句类型为:

    select * from <表名> where name = 'x'
    # 例如
    select * from user where username  = 'admin'
    

    示例:

    image-20230226113015032

4.回归测试

  1. 环境

    • bwapp

    • SQL Injection (GET/Search)

    • low

  2. 判断注入类型
    先输入正常值,发现属于可能属于字符型注入

  3. 判断是否存在注入点
    采用单引号判断法,发现确实存在注入漏洞,又因输入为字符值,因此为字符型注入漏洞
    image-20230305090936703

  4. 构造字符型注入代码
    构造t' and '1'='1' #,发现并没有出现想要的结果
    image-20230305091509961

  5. 分析原因---深度分析执行流程
    前端输入一个字符,则后端返回与之相关所有的条目。如,前端输入字符t则后端,输出title中所有带有t字符的内容。
    根据行为,猜测,后端数据库查询语句可能采用的是like进行模糊查询,后端语句可能是:

    # x为从前端获取的输入
    # 通配符,可能是%,也可能是_
    select * from xxx where title like 'x%'
    

    因此,此时构造语句时,需要将like通配符的%闭合

  6. 重新构造注入代码
    根据上文猜测,重新构造代码为t%' and '1' = '1' #,此时后端代码可能拼接为

    select * from xxx where title like 't%' and '1' = '1' #%'
    

    执行后,发现正常返回,说明执行成功。

    image-20230305092855458

  7. 源代码审计,查看猜测结果
    进入容器,找到sql_1.php文件,查看,发现确实和我们猜测一致。
    image-20230305100535149

  8. 总结
    构造原始语句核心:推断后端SQL语句形态,尝试闭合SQL语句

二、初级注入防御方法

1.减少错误信息反馈

  1. 不要将错误信息反馈给前端,提高攻击成本,提升注入难度。

  2. 注意:
    但并不是,取消错误就一定会杜绝,部分攻击不依赖于错误。

2.字符转义(黑名单)

  1. 对传入值部分字符进行转义
    将一个控制字符(如')转义为一个数据类型字符,
  2. 许多函数均有此功能

3.过滤(黑名单)

  1. 对常见关键字:and、or、union、select、空格等做过滤,
  2. 但这种黑名单方式也并不一定完全杜绝。
posted @ 2023-03-05 10:31  缪白(Miubai)  阅读(1311)  评论(2编辑  收藏  举报