0%

2020_NEUQCSA_12月月赛WP

 2020年12月月赛Misc方向手速大赛三题的WP

这三题的源码都给出了, 题目界面就可以下载. 只要能用非手动提交方式做出来第一题, 就至少能做出来第二题或者第三题.

手速大赛_base


 和招新赛一样的题目, 唯一不同的地方在把限时放开到了10s, 不管是写脚本/RCE/手动提交都可以. 看后台还真的有猛士手动提交了两个小时做出来, 是真的顶… 具体的RCE和脚本放在后面两个仔细讲.

手速大赛_script


 把时间限制到了2s, 并且代码里做了限制, 屏蔽了RCE. 和上一题的代码对比下可以看到, 这里的eval被我抽掉了

 所以就只能写脚本解了, 这题的脚本也简单, 蛐蛐10行就行了. 我出这题本意是教会萌新写py脚本, 结果就两个人做出来, 这么难的吗….
脚本如下:

1
2
3
4
5
6
7
8
9
10
import requests
import re
url='http://base.sern.site:8887/?res='
se=requests.Session()
for i in range(31):
page=se.get(url)
ques=re.findall('([0-9]+ \+ [0-9]+)=',page.text)[0]
ans=eval(ques)
url='http://base.sern.site:8887/?res='+str(ans)
print(page.text)

手速大赛_RCE


 时间限制到了-1s, 很明显不是爬虫了. 题目也告知了RCE, 肯定得去审代码. 后面放了hint要对比和前一题的代码区别. 很明显就能看到那行被抽掉的eval被加回来了, 而且没有对输入的get变量做任何过滤, 自然能联想到从这里命令注入.

 python中可以利用andor来让eval执行额外的命令, 使用的时候要注意python的短路逻辑. 我们输入的res变量会在第22行处被拼接在一个形如x+y==RES的表达式中, 于是可以传入res=1 or PYTHONCODE使得表达式变为x+y==1 or PYTHONCODE 从而or前面的判断为假, 从而会继续执行or后面的python命令.
 下一个难点是如何通过任意命令执行返回flag. 这里的姿势很多了. 想弹shell的话可以走python沙盒逃逸, 找个公网服务器接一下shell就可以, 我也没做禁止容器连接外网的限制. 这里还有另外一个办法可以把flag带出来.

 仔细审下源码, 可以看到我设置的message通知方式是把消息压入一个message数组中, 然后在最后根据数组渲染页面. 至于flag位置也写在代码里了, 只要触发getFlag()函数, 就能返回flag的内容. 把这两个组合一下, 只要我们能够执行message.append(getFlag())就可以把flag追加到message里从而在最后被渲染到前端. 于是我们可以让表达式为x+y==1 or message.append(getFlag())从而执行目标命令

 最后的payload也就很简单了:http://base.sern.site:8888/?res=1+or+message.append%28getFlag%28%29%29

 有人能把这题做出来我是没想到的, 很感动, 下次加大难度.