一、概念

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

#操作系统版本

到这里我们已经可以执行数据库中的函数了,所以我们可以查询更多的数据。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐