我正在为可能托管在某些 CTF 挑战中的概念问题编写服务器后端。它将托管在 Ubuntu 12.04 LTS、nginx 1.1.19 和 uWSGI 1.0.3-debian 上,它们将处理 Python 2.7.3。
挑战的目标是利用加载在参赛者浏览器上的 JavaScriptrunThis()
通过成功注入函数调用来触发 PyV8 定义的函数,这与 XSS 非常相似。下面描述的 Python 脚本将作为 CGI 工作,并使用 PyV8 验证参赛者的输入,判断 XSS 是否成功。
但是,这个 Python 脚本容易受到 DoS 攻击是一个问题(我想一些参赛者可能会为这个脚本提供“while(1){}”)
我想通过将超时设置为来解决这个问题evalJavaScript()
,所以我尝试采用一个使用来自https://stackoverflow.com/a/601168/1402144这个参考的 SIGALRM 的解决方案,但它不起作用。
这是概念代码(为了不泄露太多关于游戏的信息,并专注于当前关于超时的问题,大大简化了):
#!/usr/bin/env python
import PyV8
import cgi, cgitb
import signal
from contextlib import contextmanager
# Timeout handler
class TimeoutException(Exception):
pass
@contextmanager
def time_limit(seconds):
def timeout(signum, frame):
raise TimeoutException, "Timed out!"
signal.signal(signal.SIGALRM, timeout)
signal.alarm(seconds)
try:
yield
finally:
signal.alarm(0)
# end Timeout handler
# check JavaScript
class Global(PyV8.JSClass):
def runThis(self):
print "You have called this function via JavaScript."
def evalJavaScript(post_data):
try:
ctxt = PyV8.JSContext(Global())
ctxt.enter()
ctxt.eval(post_data)
ctxt.leave()
except Exception, e:
print e
print "Perhaps syntax error? Try again!"
# end JavaScript
# CGI
form = cgi.FieldStorage()
print 'Content-type: text/html'
print
try:
with time_limit(5):
evalJavaScript(form.getvalue('javascript'))
except TimeoutException, msg:
print "Timed out!"
# end CGI
网址:
http://localhost/validation.py?javascript=runThis()
- 结果:“您已通过 JavaScript 调用此函数。”
网址:
http://localhost/validation.py?javascript=while(1){}
- 结果:Nginx 超时,而 Python 脚本继续以 100% 的 CPU 使用率运行。我也发布
kill -ALRM ${pid}
了这个过程,但它对它完全没有影响。
- 结果:Nginx 超时,而 Python 脚本继续以 100% 的 CPU 使用率运行。我也发布
我还测试了一个非常小的脚本,它有效。
import signal
from time import sleep
def main():
while 1:
sleep(1)
print "main"
def timeout_handler(signum, frame):
raise Exception
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(10)
try:
main()
except:
print "whoops"
以下是我到目前为止浏览过的参考资料:
- 使多处理功能超时
- 如果某个条件没有及时满足,函数就会超时
- 如何在python中超时功能,超时不到一秒
- 函数调用超时
- 在python中使用线程的超时功能不起作用
- Python 服务器在空闲一段时间后自行关闭
- 多个子进程超时
- 如何在 Python 中限制函数调用的执行时间 如何中断/停止/结束挂起的多线程 python 程序
- http://docs.python.org/2/library/multiprocessing.html
- http://pguides.net/python-tutorial/python-timeout-a-function/
您能否给我一个提示,说明我做错了什么,或者更好的是,建议一种更好的方法来实现反 DoS 解决方案?