SQL注入原理?
通过把SQL命令插入到Web表单提交或者输入域名或者页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
SQL注入危害?
数据库层面
- 非法读取、篡改、添加、删除数据库中数据
- 盗取用户的各类敏感信息,获取利益·
- 通过修改数据库修改网页上的内容
- 私自添加或者删除账号
操作系统层面
- 网页篡改
- 网络挂马
- 服务器远程控制
SQL注入有哪些分类?
基于注入点值
- 数值型 sql=“select * from admin where id=1”
- 字符串型 sql=”select * from 表 where id =“xxx””
基于从服务器返回的内容
- 有回显(基于错误的)
- 无回显(盲注)
- 布尔盲注
- 时间盲注
按照注入的程度和顺序
- 一阶注入
- 二阶注入
MySQL注入中常用的函数?
user();查看当前Mysql登录用户名
database():查看当前Mysql数据库名
version():查看当前Mysql版本
@@version
@@basedir
length() 字符串长度
substring()截取字符串
ord 返回ASCII码值
concat 连接字符串
sleep(4) 睡眠指定描述
group_concat() 查询结果放同一行
limit m,n 从m行开始,到m+n行。
mid()需要截取的字符串
group_concat() 查询结果放同一行
盲注有哪些优化手段?
1、普通字符加正则表达式联合优化猜解
2、二分查找算法
3、按位方法
盲注有哪些常用语句?
?id=1’ and if(ascii(substr(database(),1,1))>95,sleep(6),1)%23
select length(databse());
select substr(databse(),1,1);
select ascii(substr(database(),1,1));
select ascii(substr(database(),1,1))>N;
select ascii(substr(database(),1,1))=N;
select ascii(substr(database(),1,1))<N;
HTTP头中有哪些信息?
User-Agent、Referer、Cookies等
宽字节注入原理?
mysql使用GBK编码的时候,会认为两个字符是一个汉字。
数据库使用的是GBK编码,PHP编码为UTF8就可能出现宽字节注入,网站为了防止发生SQL注入,会调用addslashes()等一些特殊函数,将单引号或双引号进行转义操作,即在单或双引号前加上斜杠(\)。当数据库使用的是宽字节编码会将两个连在一起的字符会被当做是一个汉字,而在PHP使用的UF8编码则认为是两个独立的字符。
什么是二阶注入?
二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。
二阶注入与普通注入的区别?
普通注入:
- 在http后面构造语句,是立即直接生效的
- 一次注入很容易被扫描工具扫描到
二次注入:
- 先构造语句(有被转义字符的语句)
- 我们构造的恶意语句存入数据库
- 第二次构造语句(结合前面已经存入数据库的语句,成功。因为系统没有对已经存入数据库的数据做检查)
- 二次注入更加难以被发现
SQL注入绕过方式?
常用绕过方式
- 大小写绕过
- 双写绕过
- 编码绕过
- 内联注释绕过
怎么绕过去除注释符的sql注入?
- 利用or ‘1’='1闭合单引号
- 配合联合查询
怎么绕过去除and和or的SQL注入
1、大小写变形,Or,OR,oR,OR,And,ANd,aND等 -代码中大小写不敏感都被剔除
2、在这两个敏感词汇中添加注释,例如: a/**/nd 双写绕过oorr
3、利用符号替代–and --&& --or–||
怎么绕过去除空格的sql注入
编码绕过: hex,urlencode
空格URL编码%20
%09 TAB键(水平)
%0a新建一行
%0c新的一页
%0d return功能
%0b TAB键(垂直)
怎么绕过去除union和select的sql注入
大小写
双写
SQL注入的防御
预编译
限制输入长度
过滤关键词