SQL注入及bypass思路(1)
前言
小tip
固然有用,但是掌握通用方法才能在特殊环境下柳暗花明,举一反三
整篇博客从MYSQL_SQL_BYPASS_WIKI为基础出发,讨论SQL注入和bypass技巧思路(大部分都是直接照搬的hhh)
MySQL数据库简单操作
建立数据库
查询所有数据库
红框中是我们刚才创建的
使用数据库sqlvul
新建一个user
表
查看数据库表
查看数据库表结构
插入数据
查询user
表数据
where
条件查询
有了这些基础知识并进行手动操作后,我们可以先在本地搭建一个拥有上述数据库的漏洞环境,漏洞代码test.php
为
这样一个简单的漏洞环境就搭建好了
http://127.0.0.1/test.php?id=1
默认表名解读
之前某公司的面试题里有:
mysql5以上和以下有什么区别?
其中一个明显区别就是information_schema
这个表(视图)是在MySQL5以后的才有的,现在MySQL4应该是很少了,所以后面的例子都围绕着MySQL5来讲解,information_schema
是用于存储数据库元数据的表,它保存了数据库名,表名,列名等信息,让我们从爆破表名到了可以直接查询。
这里打住一下,如果不存在该表或者该表被禁用,我们可以使用布尔注入
或者时间盲注
来爆破表名
我们查询information_schema
我们经常用到的几个表:
- schemata表:提供了当前mysql实例中所有数据库的信息
- tables表:提供了关于数据库中的表的信息
- columns表:提供了表中的列信息
schemata
tables
(太多了只截了一部分
columns
(太多了只截了一部分
我们前面说过information_schema
储存的是所有数据库的信息,假如我的数据库 mysqltest1
mysqltest2
都存在admin表的话 它都会显示出来
所以要指定数据库
user
表保存的用户账号密码
特殊符号
mysql中数据一般用一些符号包裹起来,如:
常用到的特殊符号有:
每个符号都是我们后期用来bypass
的有利铺垫,例如
注释符号
mysql
中的注释符号
操作符与逻辑操作符
取自官方文档 排列在同一行的操作符具有相同的优先级
注入产生的原因
- 程序在开发的时候没有对用户的数据过滤,把用户的数据都当作可信数据
- 考虑到用户可能的危险输入并进行了过滤,但是过滤不严格
- 数据库配置不当,例如字符编码不一致导致的宽字节注入
- 转义不当
注入的类型
常见的注入我们可以归纳为数字型,字符型,搜索型,盲注等
实际环境中我们可能还会遇到更为复杂的sql注入语句,我们就要想办法闭合它们。
寻找注入的一些注意
如何寻找注入是一门艺术
黑盒测试建立在对每个参数的fuzz上
- 适当学习开发对于发现漏洞更有帮助
- 涉及到用户交换数据的地方都将是注入的重灾区
- 当网站为成熟的cms框架时不建议直接黑盒注入,通杀0day往往是在白盒审计下找到的,当然知道cms版本的情况下更好的方法是直接搜索漏洞
- 不知名系统,目标不是很重要,自己开发的系统,可以尝试使用AWVS等扫描工具
- 信息搜集的重要性不必多说,无论是github代码监控还是敏感备份文件扫描发现都可能带给我们意外之喜
版本收集与路径
识别数据库版本有助于我们进一步对数据库进行注入
可以用到
/*!*/
意为在xxx版本之上执行
union
操作符用于连接两个以上的select语句的结果并将其组合到一个结果集合中,多个select语句会删除掉重复的语句
路径的话一般用@@datadir
,根据日常规律大概反猜下网站路径
操作系统@@version_compile_os
用户与链接信息
system_user()
//系统用户名
user()
//用户名
current_user()
//当前用户名
session_user()
//链接数据库的用户名
读取host 和 user
通过以上信息还能大概判断下是不是站库分离之类的
站库分离
web应用与数据库不在同一台服务器上
初识注入bypass
推荐使用sqli-labs
来进行注入练手,手工注入是基础,切勿浮沙筑高台
直接使用and 1=1
一类的多属于数字型注入
被引号包裹起来就不行了
需要通过分析报错的语句来进行判断和闭合
第一个注入
and
是一个逻辑符号,要求两边同时成立,所以and 这边是什么可以尽情发挥大家的才能,比如 and true=1
为什么要这么写,因为某狗判断的就是 and 这边的字符类型,大家可以去了解mysql的隐式转化
sqli-labs第一关
看到报错语句
其中关键部分为:
最外层是它出错给你的字符串,所以为:
我们的payload
为?id=1'
应该是单引号没闭合所以造成了出错,同时知道它语句后面有个LIMIT 0,1
所以反推后端查询语句大概为
在看到报错信息的时候我们应该要能够反推它的语句,有利于我们进一步注入,接下来进行联合注入
使用order by
判断它的列数,因为order by
是根据列来排序的,排序第几列
关于 order by排序
因为原文中没有太仔细说这个地方,为了读者方便理解,专门说一下
在菜鸟教程关于order by
子句进行排序的时候,使用的是该列的关键字
这里是按照submission_date
列的升序排列
当然我们也可以不使用列名,直接使用该列在表中的列数,如submission_date
对应的就是第4列
如果没有这一列的话使用order by
语句就会报错,由此来判断数据库中的列数,进一步注入
回到sqli-labs
第一关
通过limit 0,1
来控制前端的显位的数据(从第0条取一条)
如果是过滤逗号,想用分页可以使用 1 offset 1,意思是从第一条开始选一条
当然还有 join 分页
sqli-labs
的payload
如果想要直接爆当前库的表,不妨写
为了避免单引号你也可以使用hex后的数据
使用group_concat()
函数把表名都聚合起来,更加方便
爆出字段
如果group_concat()
被过滤,我们可以使用其他类似的函数来进行替换,可以查阅mysql
函数表
当我们使用information_schema.schemata
被拦截时,我们可以使用前面提到的符号们组合绕过
也有人遇到过这种情况 users表被拦截 怎么绕过呢,其实也一样
报错注入
报错注入在我们不能联合注入的时候也是非常重要的,网上给我们提供了很多种报错注入,这里直接引用
https://www.cnblogs.com/wocalieshenmegui/p/5917967.html
一文了
每个报错语句都有它的原理,比如exp()
报错的原理,手册说到exp()
时一个数学函数,取e的x次方,当我们输入的值大于709就会报错,然后~取反它的值总会大于709所以报错
exp()函数报错原理
可以参考王叹之师傅的这篇文章
简单说明一下
超过709就会报错
接下来有两个重点:
- 将0按位取反就会返回
18446744073709551615
,得到最大的无符号BIGINT值 - 函数成功执行后返回0
所以出现了上述的执行结果
接着来解释一下payload exp(~(select * from(select user())a))
- 先查询
select user()
这里面的语句,将这里面查询出来的数据作为一个结果集 取名为 a - 然后 再
select * from a
查询a ,将 结果集a 全部查询出来,这里必须使用嵌套,因为不使用嵌套,不加select * from
无法大整数溢出
简单的用报错语句来注入一下,这里使用函数updatexml()
其中关键点就是XPath_string
这里,因为我们传入的不是XPath_string
,而是我们想要获取到的数据。
为什么要用到concat
这个函数,因为它时一个连接函数,可以不用,例如(updatexml(1,(select user()),1))
,但是需要字符中有特殊字符才会报错,同时它会被中间的特殊字符截断,所以需要用到concat
将它连接起来
updatexml报错原理
可以参考上面的王叹之师傅的文章
简单来说是由于参数的格式不正确而产生的错误,同样也会返回参数的信息
例如payload updatexml(1,concat(0x7e,(select user()),0x7e),1)
这里的~
符号也就是0x7e
,也是我们前面所提到的报错的特殊字符
sqli-labs
第一关报错payload
在报错里面直接使用mysql最基本的查表即可,也可以将concat
放在外面
updatexml(1,concat(0x7e, (select password from user limit 1,1),0x7e),1)
因为使用了concat
连接函数,所以只能爆出32位数据,其中有一位还是0x7e
,即引发报错的字符,实际上出现的密码只有31位
可以自行使用分割函数将数据分割出来
下回继续分解
参考链接
__EOF__

本文链接:https://www.cnblogs.com/Cl0ud/p/14460701.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!