一、sql注入原理
注入攻击的本质就是把用户输入的数据当作代码来执行。所以注入攻击有两个必要条件
1.用户能够控制的输入。
2.原本程序要执行的代码,拼接了用户输入的数据。
二、sql注入分类
按照请求方法可以分为:GET请求、POST请求
按照参数类型可以分为:数字型、字符型
按照数据返回结果分为:回显、报错、盲注
盲注又分为:布尔盲注、延时盲注
三、sql注入测试方法
一般测试语句:
or 1=1 --+ | 'or 1=1 --+ | "or 1=1 --+ |
)or 1=1 --+ | ')or 1=1 --+ | ")or 1=1--+ |
"))or 1=1 --+ |
ps: # url编码后为 %23 ,可以用 --+ 替换
常用测试函数:
函数名 | 作用 |
version() | 数据库版本 |
user() | 数据库用户名 |
database() | 数据库名 |
@@datadir() | 数据库路径 |
@@version_compile_os | 操作系统版本 |
测试流程:
这里是在本地搭建的一个 sqli 的靶场,用来自己做练习,感觉还不错。
文章最后附带的有链接,小伙伴们可以自行下载。
1.检测sql注入类型
直接在url处添加 单引号 发现网站报错、说明sql语句出错,就可能存在注入
2.闭合sql语句
一般有两种方法:
a.使用 # 号,把本行 # 号后面的内容注释调,这样就可以避免sql语句出错,使我们构造的 payload 可以正确执行
b.根据sql语句,用符号进行闭合
这里就直接用 # 进行注释了,可以看到网站的页面回复了正常
3.探测字段列数
假设列数为 4 进行测试,页面出错,说明小于 4 列
然后列数为 3 进行测试,页面正常,说明存在 3 列
4.查看显示位,进行测试
可以看到数据库的版本信息,说明存在sql注入漏洞
四、sql注入防护技巧
数据与代码分离
对用户输入的数据进行严格过滤
对特殊字符进行转义
使用预编译语句
使用安全函数
检查数据类型