4

我正在为可能托管在某些 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}了这个过程,但它对它完全没有影响。

我还测试了一个非常小的脚本,它有效。

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"

以下是我到目前为止浏览过的参考资料:

您能否给我一个提示,说明我做错了什么,或者更好的是,建议一种更好的方法来实现反 DoS 解决方案?

4

0 回答 0