| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL注入及绕过备忘录 -> 正文阅读 |
|
[大数据]MySQL注入及绕过备忘录 |
SQL注入(以Mysql为例)大致分为有回显和无回显两类进行梳理,重心会放在盲注这一块,正则匹配等一些技巧都放在盲注部分。 使用sql-labs进行演示,在challenges数据库中在添加一个flag数据库表,并修改sql-labs源码使其回显执行的sql语句,方便演示。 判断是否存在SQL注入本质都是看页面是否出现异常
有回显:union注入:最基础的注入类型,sql语句大致为:
获得当前表的列数:
报错就是超过列数了,几个字段通常对应页面上有几个回显位。 这时已经可以使用mysql函数获取一些基本信息了,如版本号以便后面注入。
获取数据库: 接下来的操作都得依赖 information_schema.tables ,这里存储了数据库的结构:数据库名、表名、列名(字段名)等。
获取表名:
获取列名:
获取字段值:
报错注入:页面上没有显示位,但是能输出 sql语句执行错误信息。比如存在 mysql_error()。 通过函数之间的产生的异常,使得查询的一部分(payload)以错误回显的形式显示出来。 floor报错注入
user()处为你想查询的内容,如查询所有的数据库名:
ExtractValue报错注入
UpdateXml报错注入
ExtractValue、UpdateXml对输出字符数会有限制,需要配合字符串截取方法。 无回显:无回显的话需要找到判断值(如and 1=1 | and 1=2)的不同回显或者反应。
然后还需要三点:
下面对判断表达式的真假、字符串截取和判断分别进行梳理。 布尔盲注:判断表达式的真假通常可用and、or、&、|| 这些,如:
异或注入但在过滤了and、or 之后^异或符号就派上用处了,也就是xor注入,其基本原理:
结果均由中间位置值决定,那么把中间的位置换成payload就行了 在注释符号被过滤时也可以使用 字符串截取substr()从字符串 s 的 n 位置截取长度为 len 的子字符串 SUBSTR(str,pos,len) mid()从字符串 s 的 n 位置截取长度为 len 的子字符串 MID(str,pos) | MID(str,pos,len) | MID(str FROM pos) | MID(str FROM pos FOR len) 其实上面得substr函数也可以这样操作,mid()和substr()都是substring()的同义词。 right() | left()从字符串 s 的右/左边开始返回n 个字符 right | left(s,n) right() | left()不能像substr和mid一样精准截取某一位进行比较,但可以配合ascii / ord函数一起使用(left还要加上reverse()),这两个函数会返回字符串 s 的第一个字符的 ASCII 码。通过修改返回字符数就能进行按位比较了。 lpad | rpad在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len lpad | rpad(s1,len,s2) 用法和right | left差不多 insert()字符串 s2 替换 s1 的 pos 位置开始长度为 len 的字符串 insert(s1pos,len,s2) insert的按位比较可以使用left那种方法,也可以对insert进行嵌套
trim()表示移除str这个字符串首尾(BOTH)/句首(LEADING)/句尾(TRAILING)的remstr TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM str) 如果要移除的字符是开头字符串则移除,若不是则返回原字符串 也就是说除了首字符串以外,其他字符进行截取返回值都是一样的,那就可以用来判断首字符串了。 也就是说对两个字符i和i+1的trim截取结果进行比对,若不一样即结果为0,说明两个字符串中间有一个是正确结果。接下来对比i+1和i+2即可,若一样即结果为1,说明i+1和i+2都不是正确结果,第一位是i。 当我们判断出第一位是 regexp | rlike截取+比较的结合体 binary 目标字符串 regexp| rlike 正则 使用binary是因为regexp | rlike匹配是大小写不敏感的,需要加上 判断字符串是否相等RLIKE / REGEXP异或= < >LIKE模糊匹配,可替代等号。 BETWEENexpr BETWEEN 下界 AND 上界 IN判断是否在一个集合中,大小写不敏感,需配合binary关键字 expr1 in (expr1, expr2, expr3) GREATEST | LEAST返回列表中的最大/小值,可代替比较操作符 GREATEST | LEAST(expr1, expr2, expr3, …) 减号或取余配合and 或者 or使用,只要在结果正确时才为0 order by通过order的排序功能比较结果,比较的是数据的首字母大小,使用limit限制输出第一个,可代替> <使用
CASECASE s1 WHEN s2 THEN exp1 ELSE exp2 END; 脚本模板
时间盲注:与布尔盲注大致相同,最大的区别是直接返回0 1已经无法得知结果了,需要构造条件表达式利用相关函数进行延时反馈。 条件表达式CASE
if
延时函数sleep()benchmark()测试某些特定操作的执行速度,若执行次数足够大就可以产生延迟 benchmark(执行次数,特定操作) 笛卡尔积延迟
正则
脚本模板
报错盲注:还有一种情况就是没有开具体的报错信息回显,但页面会告诉你是否出错了。 直接套用时间盲注用的条件表达式(if、case)即可,将延时函数换成会引起报错的函数。 报错函数exp()
pow
cot
Bypass空格
空白字符(url当中使用):%09,%0a,%0b,%0c,%0d,%20,%a0; select关键字
handler
show
单引号参数逃逸:
字符串:
逗号offset:
join语句代替:
数字/字母
https://wooyun.js.org/drops/MySQL%E6%B3%A8%E5%85%A5%E6%8A%80%E5%B7%A7.html 无列名注入(可盲注)
先用union构造表的别名,然后再套个select去查询这列的值 或者比较两个子查询的结果进行盲注,通过大小于号,可以逐字符检索出数据
join using()注列名(需有错误回显)通过对想要查询列名的表与其自身建立内连接产生列名冗余错误,通过错误回显得到表名。 使用 USING 表达式声明内连接(
无information_schemainformation_schema就是个信息数据库,思路是找个能代替他的库。 InnoDB:mysql.innodb_table_stats(mysql默认关闭InnoDB存储引擎) sys.schemma;基础数据来自于performance_chema和information_schema(version >= 5.7) sys.x$schema_flattened_keys sys.schema_table_statistics sys.x$ps_schema_table_statistics_io(这个是表名最多最全的) sys.schema_auto_increment_columns(监控表自增id) sys.schema_table_statistics_with_buffer 这里只列举了一些,更详细的可以看https://xz.aliyun.com/t/7169#toc-53 获得表名之后配合无列名注入,或者join using报错得到列名就行。 正则过滤关键字无order by判断字段数
其他类型的注入:二次注入常见于用户名处,数据存入的时候经过过滤转义,但登录时,或取出来在网页上展示的时候没有做防护。 order by注入以sql-labs Less-50为例 可以利用order by后的一些参数进行注入,依据排列结果作为反馈
堆叠注入union select不可用时,若在支持多语句执行的情况下,可利用 ;分号 执行其他恶意语句。 为了解决堆叠注入后执行的语句结果无法返回给网页的问题,可使用rename 、alter关键字修改表名、字段名,使得目标表和列顶替原来的,那就能被原定的查询语句查到了。
PDO模拟预处理https://xz.aliyun.com/t/3950#toc-4 文件读写
查看是否有权限
无回显的话可尝试配合 and 1=1等永真条件,根据页面回显判断是否成功 读文件
读取服务端文件
读取客户端文件
通过 正常读文件的处理逻辑:
但通常客户端不会主动发出这个文件内容写入请求,多为正常的增删改查,而恶意服务端则是利用可以用文件传输请求来回复任何语句这一点,直接用文件传输请求回复查询等sql操作。
rogue_mysql_server的读文件功能就是这个原理 更多拓展攻击方式参考:CSS-T | Mysql Client 任意文件读取攻击链拓展 写文件
http://www.teagle.top/index.php/archives/157/ 写入mysql日志
http://sh1yan.top/2018/05/26/mysql-writ-shell/ DNSlog外带数据利用unc路径配合load_file()函数可以用来发送dns解析请求,把查询结果放在多级域名中解析,然后能够在dns 服务器的解析日志中获取查询结果。
? 上面CONCAT()函数的四个反斜杠去掉两个转义用的,实际是两 个反斜杠。刚好对应Windows当中共享文件使用的网络地址格 式开头\\sss.xxx\test\,也就是UNC路径。再访问时会先进行 DNS查询 Mysql约束攻击在SQL中执行字符串处理(如比对的时候)时,字符串末尾的空格符将会被删除 mysql数据库中当插入某个字段的值超过了预设的长度,mysql会自动造成截断(需关闭严格模式, STRICT_TRANS_TABLES),利用这一点可用绕过数据插入前的已存在比对 admin 1的超长字符串用户,在插入数据库前先查询是否已经有存在的用户时不等于admin,但在存入数据库后变成admin ,再在登录查询时就等于admin了 以此顶替admin用户登录 参考:https://www.gem-love.com/2022/01/26/%E4%B8%80%E6%96%87%E6%90%9E%E5%AE%9AMySQL%E7%9B%B2%E6%B3%A8/ https://www.smi1e.top/2018/06/19/sql%E6%B3%A8%E5%85%A5%E7%AC%94%E8%AE%B0/ https://xz.aliyun.com/t/7169 https://nosec.org/home/detail/3830.html https://www.jianshu.com/p/f2611257a292 https://www.anquanke.com/post/id/193512 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 3:55:47- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |