网络安全——SQL注入
一、概念
SQL注入原理
在与数据库交互的地方程序没有对用户的输入做严格的过滤和限制 , 导致用户可以构造恶意的sql语句拼接在参数后面 , 然后带到数据库中执行 , sql注入属于服务端攻击 , 和操作系统和编程语言无关。
SQL注入提交方式
get post cookie http头(X-Forwarded-For) referer user-agent
注入的类型
联合注入(Union Injection)这是一种SQL注入技术,攻击者通过使用SQL的UNION语句将多个SELECT语句合并在一起,从而可以从数据库中检索额外的数据。这通常发生在应用程序的输入没有正确地进行过滤或转义时。
报错注入(Error-Based Injection)这种技术依赖于数据库的错误消息来提供额外的信息。攻击者构造特定的SQL查询,当这些查询执行失败时,数据库会返回错误信息,这些信息可以被用来推断数据库结构或获取敏感数据。
布尔盲注(Boolean Blind Injection)这是一种盲注技术,攻击者通过观察应用程序的响应来推断数据库的状态。例如,如果一个查询返回正常页面,攻击者可能会推断出某个条件是真或假,从而逐步构建出数据库的结构或数据。
延时注入(Time-Based Injection)这种技术利用数据库查询的执行时间来推断信息。攻击者构造一个查询,该查询的执行时间取决于数据库中的某些条件是否满足。通过测量查询的执行时间,攻击者可以推断出数据库中的信息。
以上是根据常见的注入方式进行分类,但是通常来说 SQL 注入只分为字符型或者数字型比如:
数字型 1 or 1=1
字符型 1' or '1'='1
相关问题
1.报错注入有哪些函数?
FLOOR #MySQL >= 5.0EXTRACTVALUE #MySQL >= 5.1UPDATEXML #MySQL >= 5.1BIGINT UNSIGNED #MySQL >= 5.5EXP #MySQL >= 5.5GTID_SUBSET #MySQL >= 5.6JSON_KEYS #MySQL >= 5.7.8
2.盲注分为哪几种,他们的常见函数有哪些?
布尔盲注
Length()函数 返回字符串的长度
Substr()截取字符串
Ascii()返回字符的ascii码
if(expr1,expr2,expr3):判断语句:如果第一个语句正确就执行第二个语句如果错误执行第三个语句
延时注入
sleep(5)
BENCHMARK(5000000,MD5(0x704c6b65))
3.布尔盲注和延时注入的共同点?
都是一个字符一个字符的判断
4.注入时可以不使用and或or或xor,直接order by开始注入吗?
and/or/xor,前面的1=1、1=2步骤只是为了判断是否为注入点,如果已经确定是注入点那就可以省那步骤去。
5.手工注入你是如何判断注入点的?
单引号报错 , and 1=1 , and 1=2 , if(database()="user",sleep(5),1)
6.如果网站 get 与 post 都做了防注入,还可以采用什么方式绕过?
Cookies 注入绕过 $_REQUESTS()
7.如何突破注入时字符被转义?
宽字节注入、hex 编码绕过
8.注入漏洞危害
(1)获取数据库中的数据
(2)修改数据库的数据
(3)在一定的前提下还可以写入一句话木马
(4)在一定的前提下可以进行udf提权
9.为何一个 mysql 数据库的站,只有一个 80 端口开放?
更改了数据库端口,没有扫描出来
站库分离
端口不对外开放
10.给你一个注入点 , 你会怎么办?
首先就是查看权限
mysql
- root权限 通过注入点写一句话木马 , 前提: 知道网站的绝对路径, 需要有写入权限 mysql下的my.ini
配置文件中
开启secure_fille_priv为空 通过into outfile 函数写进一句话木马
- 普通权限 脱库 找出管理员账号密码 解密密码 扫描网站的管理后台 登录 找到上传点 上传木马文件
mssql
- public 脱库 找出管理员账号密码 扫描网站的管理后台 登录 找到上传点 上传木马文件
- dbowner 通过差异备份 写入一句话木马
- sa权限 通过xp_cmdshell执行系统命令权限 添加管理员账号 开启远程3389 直接远程连接 控制对方
xp_cmdshell不能用 , 还有哪些模块?
- sp_oacreate
11.mssql数据库的三种权限
public 普通权限 dbowner 数据库管理员 sa 超级权限 可以通过xp_cmdshell执行系统命令
12.mysql4和mysql5的区别
mysql4 存在字符转义和不支持子语句 靠猜解 , 但是mysql4不存在
mysql5有information_schema这个库 , 里面存在着所有的库名,表名,字段名等 , mysql4没有
mysql5支持load_file , into outfile 这些读写文件的函数 , mysql4不支持
13.如何获取mysql数据库的用户名和密码?
存在在mysql库下的user表 , 密码采用mysql5特有的方式加密
mysql安装目录下的user.MYD文件中也存在着用户名和密码
14.sql 注入写文件都有哪些函数
into outfile 和 dump file 函数
15.sql注入的防御手段
函数过滤,如!is_numeric 涵数 //判断变量 id 是否为数字
直接下载相关防范注入文件,通过 incloud 包含放在网站配置文件里面,如 360、阿里云、腾迅提供的防注入脚本
使用白名单过滤
采用 PDO 预编译处理
使用 Waf 拦截
16.sql手工注入流程
单引号报错——and验证——union判断列数和回显——构造回显语句提取数据
二、实验环境

也可以使用BUUCTF进入靶机




三、实验步骤
SQL 注入联合查询-获取数据库数据
使用联合查询爆出字段前,我们需要了解union的使用方法。union联盟UNION操作符⽤于合并两个或多个SELECT语句的结果集。 请注意UNION内部的SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT语句中的列的顺序必须相同。SQL UNION语法:
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
接下来使用sqli注入方式进行爆出字段的显示位置

这里修改了1个重要参数,id=-1这个值在数据库中是不存在的,原因是程序只返回⼀个结果,所以 我们需要使 union 前面的语句出错才可以让我们后⾯查询的结果返回。 注:联合查询必须字段数⼀致。如果表存在 3 个字段联合查询的字段也必须是 3 个,否则报错。从而可以判断查询的字段数。 注入的语句为: MariaDB [security]> select * from users where id='-1' union select 1,2,3;

获取数据库名称
获取数据库名称会使⽤到 database(),而database()是数据库内嵌的函数,主要是用于查询 当前的数据库名称 database()的使用方法: MariaDB [security]> select database();

我们获得了对应字段的显示位置,就可以在对应的位置查询我们想要获取到的数据库信息。 http://192.168.1.63/sqli-labs/Less-1/?id=-1' union select 1,database(),3--+

注意:按以上语句中分析,1,database(),3
database()替换了字段2,作⽤是查询当前数据库名称。
而其中的1和3是补给第1和第3个字段的显示结果
注入后的 sql语句,则为:MariaDB [security]> select * from users where id='-1' union select 1,database(),3;

数据库名称是security
拓展:常用函数
version()
#MySQL版本
user()
#数据库用户名
database()
#数据库名
@@datadir
#数据库路径
@@version_compile_os
#操作系统版本
到这里我们已经可以执行数据库中的函数了,所以我们可以查询更多的数据。
更多推荐
所有评论(0)