[13]-SQL注入实战-注入点判断&防御方式判断
一、SQl注入点判断
1.判断关键点
- 是否存在SQL注入
判断注入点- 注入类型?
构造原始注入语句
2.注入点判断方法
单引号判断法---经典方法
如果页面返回错误,则存在
字符型、整型都可构造
and 1=1
以及and 1=2
用于数字型注入点,
示例:构造
and '1' ='1'
以及and '1' ='2'
用于字符型,
示例
或者构造or
3.判断注入类型
数字型
语句类型:select * from <表名> where id = x # 例如 select * from user where userid = 1
示例:
字符型
语句类型为:select * from <表名> where name = 'x' # 例如 select * from user where username = 'admin'
示例:
4.回归测试
环境
bwapp
SQL Injection (GET/Search)
low
判断注入类型
先输入正常值,发现属于可能属于字符型注入判断是否存在注入点
采用单引号判断法,发现确实存在注入漏洞,又因输入为字符值,因此为字符型注入漏洞
构造字符型注入代码
构造t' and '1'='1' #
,发现并没有出现想要的结果
分析原因---深度分析执行流程
前端输入一个字符,则后端返回与之相关所有的条目。如,前端输入字符t
则后端,输出title中所有带有t
字符的内容。
根据行为,猜测,后端数据库查询语句可能采用的是like
进行模糊查询,后端语句可能是:# x为从前端获取的输入 # 通配符,可能是%,也可能是_ select * from xxx where title like 'x%'
因此,此时构造语句时,需要将
like
通配符的%
闭合重新构造注入代码
根据上文猜测,重新构造代码为t%' and '1' = '1' #
,此时后端代码可能拼接为select * from xxx where title like 't%' and '1' = '1' #%'
执行后,发现正常返回,说明执行成功。
源代码审计,查看猜测结果
进入容器,找到sql_1.php
文件,查看,发现确实和我们猜测一致。
总结
构造原始语句核心:推断后端SQL语句形态,尝试闭合SQL语句
二、初级注入防御方法
1.减少错误信息反馈
不要将错误信息反馈给前端,提高攻击成本,提升注入难度。
注意:
但并不是,取消错误就一定会杜绝,部分攻击不依赖于错误。
2.字符转义(黑名单)
- 对传入值部分字符进行转义
将一个控制字符
(如'
)转义为一个数据类型
字符,- 许多函数均有此功能
3.过滤(黑名单)
- 对常见关键字:and、or、union、select、空格等做过滤,
- 但这种黑名单方式也并不一定完全杜绝。
本文来自博客园,作者:缪白(Miubai),转载请注明原文链接:https://www.cnblogs.com/Miubai-blog/articles/17179979.html