WireShark|盲注流量分析

Posted by Elli0t on 2020-09-24

分析流量

首先筛选出 http 协议流量,盲注爆破 flag 的第一个流量应该是从904行开始的。

/index.php?id=1 AND ORD(MID((SELECT IFNULL(CAST(flag_here AS CHAR),0x20) FROM sqltest.flag ORDER BY flag_here LIMIT 0,1),1,1))>64

库名:sqltest

表名:flag

列名:flag_here

Length: 944(943) or 866

944: 正常返回

866: 报错

2020-09-24-12

截屏2020-09-24 20.39.45

2020-0924

截屏2020-09-24 20.38.28

正常返回的值在900以上
http.response_for.uri contains "%200%2C1%29%2C1%2C1%29%29%3E" && http.content_length >= 900
测试一下第一个值

截屏2020-09-24 20.49.03

数值分别为 64、96、100、101,所以只一个字符串的值是102,ASCII: f,依法可得,下一位是 l。

最终的查询语句:
http.response_for.uri contains "IFNULL%28CAST%28flag_here%20AS%20CHAR%29%2C0x20%29%20FROM%20sqltest.flag%20ORDER%20BY%20flag_here%20LIMIT%200%2C1%29%2C" && http.content_length >= 900

文件->导出分组解析结果->为纯文本

脚本编写

整理流量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-
import re
f = open('mangzhu.txt','r+')
fa = open('sqlmap.txt','w+')
regex = re.compile('C[\w]+%2C1%29%29%3E(.+?)]')
line = f.readline();
while line:
m = regex.search(line)
if m:
fa.writelines(m.group(0)+'\n')
print m.group(0)
line = f.readline()
f.close()
fa.close()

找出 flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding: utf-8 -*-
import re
flag = ''
f = open('sqlmap.txt','r+')
line = f.readline()
for i in range(1,34):
regex = re.compile(str(i)+'%2C1%29%29%3E(.+?)]')
tmp = 0
while line:
m = regex.findall(line)
if m:
print m
if int(m[0]) >= tmp:
tmp = int(m[0])+1
line = f.readline()
else:
break
flag = flag + chr(tmp)
print flag

截屏2020-09-24 21.09.37

flag{sql_test}

分析语句

1
2
3
4
5
6
7
8
9
10
11
AND ORD(	# 字符串 -> ASCII
MID( # 取出 n 位字符串
(
SELECT IFNULL( # 如果为 NULL 则返回0x20
CAST(
flag_here AS CHAR
),0x20
) FROM sqltest.flag ORDER BY flag_here LIMIT 0,1
),1,1
)
)>101

ORD( ) str -> number

MID( ) 字符串从1开始,而非0,Length是可选项,如果没有提供,MID()函数将返回余下的字符串

IFNULL( ) 如果为 NULL 则返回第二个参数的值

CAST( ) 类型转换

ORDER BY( )

LIMIT( )

截屏2020-09-24 20.21.34

mid((select IFNULL(CAST(flag AS CHAR),0x20) from flag_here ORDER BY flag LIMIT 0,3),1,1);

MYSQL 基础语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
新建库: create database 库名;
删除库: drop database 库名;
使用数据库: use 库名;
展示所有库: show databases;
查看当前库名: select database();

创建表格: create table
显示数据库下所有数据表:show tables
显示数据表结构:desc 表名
对数据表进行重命名:rename 表名 to 新表名
删除数据表:drop table
查询表里所有数据:select * from 表名
添加字段:alter table 表名 add 字段类型 属性
修改字段:alter table 表名 change 类型 属性
删除字段:alter table 表名 drop

主键: primary key
自增: auto_increment
非空: not null
增: insert into 表名() values ()
查: select * from 表名 where 条件
修: update 表名 set 字段=值 where 条件
删: delete from 表名 where 条件
中文乱码: set names gbk


区间查询: select * from 表名 where 字段 between 值1 and 值2
模糊查询: select * from 表名 where 条件 like '%关键字%'(%一个或多个,_一个)
分段查询: select * from 表名 where 条件 limit 开始值 个数
排序:select * from 表名 order by 字段 asc(降序)||desc(升序)

赋予权限: grant all on 库名.* to '用户名'@'localhost'
剥夺权限: revoke all on 库名.* from '用户名'@'localhost'

聚合函数
计数: select count(字段或*) from 表名
求和: select sum(字段) from 表名
平均: select avg(字段) from 表名
最大值: select max(字段) from 表名
最小值: select min(字段) from 表名

分组查询: select 字段 from 表名 group by 字段
select 字段,字段 from 表名 group by 字段 having 条件

两表联查:
内连接:select 字段 from 表名1 inner join 表名2 on 连接条件 where 条件
隐式内连接:select 字段 from 表1,表2 where 表1.条件=表2.条件
左外连接: select 字段 from 表1 lift join 表2 on 连接条件 where 条件
右外连接: select 字段 from 表1 right join 表2 on 连接条件 where 条件



克隆(数据蠕虫): insert into 表名(字段,字段) select 字段, 字段 from 表名

题目链接

https://github.com/ybm911/JXJC-xy--CTF/tree/master/Misc/sql_stream_analyse