SQL注入基础
数据库
数据库就是一个存储数据的仓库
数据库式以一定方式存储在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合
关系型数据库
关系型数据库,存储的格式可以直观地反映实体间的关系。关系型数据库和常见的表格比较相似,关系型数据库中表与表之间是有很多复杂的关联关系的
Mysql \oracle \postgresql \sql server
非关系型数据库
随着近些年技术方向的不断拓展,大量的NO数据库
mongoDB Redis Memcached 出于简化数据库结构、避免冗余、影响性能的表连接、摒弃复杂分布式的目地被设计。适合追求速度和可扩展性、业务多变的应用场景
重要的库
- information_schema
是信息数据库,其中保存关于MYSQL服务器所维护的所有其他数据库的信息 - sys
通过这个数据库,可以查询谁使用了最多的资源,基于IP或用户,哪张表被访问的最多等等信息
删除数据库
drop database 库名;
SQL注入
主要发生在服务端服务器与数据库中
没有前端也能发生SQL注入
注释
》- -
》#
永真式
- or 1=2
联合注入
- union
判断SQL注入点
单引号判断法
如果页面返回错误,则存在SQL注入,原因是单引号个数不匹配
输入字符’,如果没有显示页面上,则打开开发者工具
观察reponse,返回的是语法错误提示信息就说明可能有SQL注入
SQL注入
所谓S0L注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字 符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序, 将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输 入(悪意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图 去执行SQL语句。造成SQL注入漏洞原因有两个:一个是没有对输入的敬据进行过滤(过 建输入),还有一个是没有対发送到数据库的数据进行转义(转义输岀).
判断注入类型
字符型
select * from user where id =‘1’ and ‘1’ = ‘1’
数字型
select * from user where id =1 and 1 = 1
Like语法
- t% 以t 开头
- %t 以t结尾
- %t% 包含t
查数据库
select database();
判断字段数
通过union select x,x,x,x;一个个尝试。页面正常就说明字段数正确。
- user()
用户名 - version()
数据库版本 - database()
数据库名 - union select 1,user(),3,version(),database();
使用时注意数据类型的报错提示
如果报错,可以换位置重试
bwapp
环境搭建
- docker search bwapp
- docker pull raesene/bwapp
- docker run --name bwapp -d -p 9999:80 ae8ade144c34
- http://192.168.202.128:9999/install.php
用户名:bee
密码:bug
postman
下载安装
https://identity.getpostman.com
联合使用
选择漏洞
选择传参方式及网站地址
查看cookie并添加
SQL注入修复与防御
【1】建议在代码中对数字类型的参数先进行数字类型变换,然后再代入到SQL查询 语句中,这样任何注入行为都不能成功。井且考虑过滤一些参数,比如get参数和 post参数中对于SOL语言查询的部分。
【2】过滤的特殊字符及字符串
所以防范的时候需要对用户的输入进行检查.特别式一些特殊字符,比如单 引号,双引号,分号,逗号,冒号,连接号等进行转换或者过建.以下为需过滤的敏感字符或者语句:
需要过滤的特殊字符及字符串有:
net user
xp_c«ndshel I
add
exec master.(fco. xp_cmdshelI
net I oca Igroup administrators
select
count
Asc
char
mid
□,
□:
□-
insert
delete from
drop table
update
truncate
from
%